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 風格,實現畫筆。