在Windows程序中,我们用画笔来绘制图形
通过HPEN来创建画笔句柄:
static HPEN hPen1, hPen2, hPen3; //画笔句柄
然后通过创建画笔函数创建画笔:
HPEN CreatePen(
_In_ int fnPenStyle, //画笔的风格
_In_ int nWidth, //占有像素
_In_ COLORREF crColor //颜色
);
case WM_CREATE: {
hPen1 = CreatePen(PS_SOLID, 10, RGB(0,0,255));
hPen2 = CreatePen(PS_SOLID, 10, RGB(255,0,0));
hPen3 = CreatePen(PS_SOLID, 15, RGB(0,255,0));
}break;
画笔的可选样式:
#define PS_SOLID 0
#define PS_DASH 1 /* ------- */
#define PS_DOT 2 /* ....... */
#define PS_DASHDOT 3 /* _._._._ */
#define PS_DASHDOTDOT 4 /* _.._.._ */
#define PS_NULL 5
备用画笔:系统已经预定义好的画笔,可以直接被拿来用(注:备用画笔不能被删除!!)
GetStockObject(BLACK_PEN)
具体使用案例:
首先创建画笔和获取窗体的长宽
static HPEN hPen1, hPen2, hPen3; //画笔句柄
static HPEN hOldPen; //旧的画笔 用来保存
static int cxClient; //x坐标
static int cyClient; //y坐标
static int LineDis; //线段的数量
static int lineWidth = 10;
窗体缩放时长宽变化的数据:
case WM_SIZE: {
cxClient = LOWORD(lParam);
cyClient = HIWORD(lParam);
}break;
画笔的创建:
case WM_CREATE: {
hPen1 = CreatePen(PS_DASH, 1, RGB(0,0,255));
hPen2 = CreatePen(PS_SOLID, 10, RGB(255,0,0));
hPen3 = CreatePen(PS_SOLID, 15, RGB(0,255,0));
}break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
//通过selectObject来选择画笔
LineDis = cyClient / (3 + 1);
hOldPen = (HPEN)SelectObject(hdc, hPen1); //保存旧画笔
MoveToEx(hdc, cxClient/10, LineDis, NULL);
LineTo(hdc, cxClient*9/10, LineDis);
SelectObject(hdc, hPen2); //选用一支新的画笔赋予hdc句柄
MoveToEx(hdc, cxClient / 10, LineDis*2, NULL);
LineTo(hdc, cxClient * 9 / 10, LineDis*2);
SelectObject(hdc, hPen3); //选用一支新的画笔赋予hdc句柄
MoveToEx(hdc, cxClient / 10, LineDis*3, NULL);
LineTo(hdc, cxClient * 9 / 10, LineDis*3);
SelectObject(hdc, GetStockObject(BLACK_PEN)); //选用一支系统画笔赋予hdc句柄
MoveToEx(hdc, cxClient / 2, 0, NULL);
LineTo(hdc, cxClient / 2, cyClient);
EndPaint(hWnd, &ps);
}
break;
使用完毕后一定要删除画笔:
case WM_DESTROY: {
DeleteObject(hPen1);
DeleteObject(hPen2);
DeleteObject(hPen3);
PostQuitMessage(0);
}break;
绘画效果如下: