C++ MFC畫筆CPen類

原文鏈接:http://c.biancheng.net/cpp/html/3089.html

MFC的CPen類封裝了畫筆對象,其中的成員函數CreatePen實現創建畫筆的功能,函數原型如下:

BOOL CreatePen(
    int      nPenStyle,  //畫筆風格
    int      nWidth,     //畫筆寬度
    COLORREF crColor     //畫筆顏色
);
一旦不再需要畫筆,記得用DeleteObject函數將其刪除。

設置線型

創建畫筆的函數中,nPenStyle參數表示畫筆風格,可以設置下列值之一。nPenStyle ------ Long,指定畫筆樣式,可以是下述常數之一:

  • PS_SOLID : 畫筆畫出的是實線。
  • PS_DASH: 畫筆畫出的是虛線(nWidth必須不大於1)。
  • PS_DOT: 畫筆畫出的是點線(nWidth必須不大於1)。
  • PS_DASHDOT:畫筆畫出的是點劃線(nWidth必須不大於1)。
  • PS_DASHDOTDOT:  畫筆畫出的是點-點-劃線(nWidth必須不大於1)。
  • PS_NULL: 空畫筆,畫筆不能畫圖。
  • PS_INSIDEFRAME:內側實線畫筆  由橢圓、矩形、圓角矩形、餅圖以及弦等生成的封閉對象框時,畫線寬度向內擴展。如指定的準確RGB顏色不存在,就進行抖動處理。

設置線寬

創建畫筆的函數中,nWidth表示畫筆線寬,是一個邏輯值,這個值越小,畫出的圖形線越細;這個值越大,繪製的圖形線條越粗。

設置畫筆顏色

畫筆顏色通過RGB宏控制,例如需要畫紅色的圖形,RGB(255,0,0)。MFC中有許多引用顏色宏RGB,這裏總結了一些常見的顏色的宏,供大家參考。

基本顏色三種:紅綠藍,其他的顏色都是由這三種基本的顏色組成。例如,紅RGB(255,0,0)、綠RGB(0, 255,0)、藍RGB(0,0, 255)、淺粉紅 #FFB6C1 255,182,193、紫色 #800080 128,0,128等。

示例:使用GDI對象CPen繪圖示例

編寫一個程序,練習一下畫筆的創建。上面有八種不同風格的畫筆,現在用這八種不同風格的畫筆分別話一個圓,同時修改畫筆的線寬和顏色。

代碼寫在前面新建的工程SDITest中,讀者可以從網站提供的鏈接中獲取。閱讀程序是請參考註釋。

1) 定義數據結構:

struct my_Eclipse{
    CRect rect;  //圖形顯示區域
    CPen pen;  //畫筆
};
2) 定義成員變量
//定義8個結構,用於繪製8個圖形
my_Eclipse  m_myEclipse[8];


3) 在View類中初始化繪圖區域:

void CSDITestView::InitRect()
{
    //界面上要顯示8個圖形,準備好8個區域,分兩行顯示,每一行顯示四個
    //圖形左右間隔10個像素,上下間隔20個像素
    //左上 右下
    CRect rect(0,0,100,100);
    for (int i=0;i<8;i++)
    {
        if (i<4)
        {
            //第一行圖形
            CRect rect;
            rect.left=20+i*150;
            rect.top=20;
            rect.right=100+i*150;
            rect.bottom=120;

            m_myEclipse[i].rect.CopyRect(rect);
        }
        else
        {
            //第二行圖形
            CRect rect;
            rect.left=20+(i-4)*150;
            rect.top=250;
            rect.right=100+(i-4)*150;
            rect.bottom=350;

            m_myEclipse[i].rect.CopyRect(rect);
        }
       
    }
}

4) 在View類中初始化畫筆:
void CSDITestView::InitPen()
{
    //創建普通畫筆
    m_myEclipse[0].pen.CreatePen(PS_SOLID,10,RGB(255,0,0));
    m_myEclipse[1].pen.CreatePen(PS_DASH,5,RGB(0,255,0));
    m_myEclipse[2].pen.CreatePen(PS_DOT,1,RGB(0,0,255));
    m_myEclipse[3].pen.CreatePen(PS_DASHDOT,10,RGB(0,0,0));
    m_myEclipse[4].pen.CreatePen(PS_DASHDOTDOT,5,RGB(255,0,255));
    m_myEclipse[5].pen.CreatePen(PS_NULL,1,RGB(0,255,255));
    m_myEclipse[6].pen.CreatePen(PS_INSIDEFRAME,10,RGB(0,255,255));

    //創建集合畫筆
    LOGBRUSH LogBrush;
    LogBrush.lbStyle=BS_HATCHED;
    LogBrush.lbColor=RGB(0,0,255);
    LogBrush.lbHatch=HS_DIAGCROSS;
    m_myEclipse[7].pen.CreatePen(PS_GEOMETRIC,20,&LogBrush);
}

5) 在View類中的OnDraw函數中添加畫圖代碼,代碼如下:
//採用GDI繪圖
CClientDC cdc(this);
CPen* pOldPen = NULL;
for (int i=0;i<8;i++)
{
    //把當前的畫筆選入DC
    pOldPen = cdc.SelectObject(&m_myEclipse[i].pen);
    cdc.Ellipse(m_myEclipse[i].rect);
    cdc.SelectObject(pOldPen);
}


6) 編譯並運行程序,生成結果如圖4-2-1所示:


圖4-2-1 用不同風格不同顏色的畫筆畫圖效果圖


示例中演示了8種畫筆效果

  • 1號:PS_SOLID風格,實現畫筆;
  • 2號:PS_DASH 風格,實現畫筆;
  • 3號:PS_DOT  風格,實現畫筆;
  • 4號:PS_DASHDOT風格,實現畫筆;
  • 5號:PS_DASHDOTDOT風格,實現畫筆;
  • 6號:PS_NULL 風格,實現畫筆;
  • 7號:PS_INSIDEFRAME風格,實現畫筆;
  • 8號:PS_GEOMETRIC 風格,實現畫筆。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章