这节总结下笔刷的使用,首先看程序
#include<windows.h>
#include<stdlib.h>
#include<string.h>
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam);
BOOL InitWindowsClass(HINSTANCE hInstance);
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow);
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
MSG Message;
if(!InitWindowsClass(hInstance))
return FALSE;
if(!InitWindows(hInstance,nCmdShow))
return FALSE;
while(GetMessage(&Message,0,0,0)) //消息循环
{
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return Message.wParam;
}
long WINAPI WndProc(HWND hWnd,UINT iMessage,UINT wParam,LONG lParam)
{
HDC hDC; //定义指向设备上下文的句柄
HBRUSH hBrush; //定义指向画刷的句柄
HPEN hPen; //定义指向画笔的句柄
PAINTSTRUCT PtStr; //定义指向包含绘图信息的结构体变量
switch(iMessage) //处理消息
{
case WM_PAINT: //处理绘图消息
hDC=BeginPaint(hWnd,&PtStr);
SetMapMode(hDC,MM_ANISOTROPIC); //设置映射模式
hPen=(HPEN)GetStockObject(BLACK_PEN);//设置画笔为系统预定定义的黑色画笔
hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH); //采用系统预定义的深灰色画刷
SelectObject(hDC,hBrush); //选择画刷
SelectObject(hDC,hPen); //选择画笔
RoundRect(hDC,50,120,100,200,15,15); //圆角矩形
hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); //采用系统预定义的淡灰色画刷
SelectObject(hDC,hBrush); //选择画刷
Ellipse(hDC,150,50,200,150); //椭圆
hBrush=(HBRUSH)GetStockObject(HOLLOW_BRUSH); //采用系统预定义的虚画刷
SelectObject(hDC,hBrush); //选择画刷
Pie(hDC,250,50,300,100,250,50,300,50); //饼形
EndPaint(hWnd,&PtStr); //结束绘图
return 0;
case WM_DESTROY: //结束应用程序
PostQuitMessage(0);
return 0;
default: //其他消息处理程序
return(DefWindowProc(hWnd,iMessage,wParam,lParam)) ;
}
}
BOOL InitWindows(HINSTANCE hInstance,int nCmdShow) //初始化窗口
{
HWND hWnd;
hWnd=CreateWindow("WinFill", //生成窗口
"填充示例程序",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL);
if(!hWnd)
return FALSE;
ShowWindow(hWnd,nCmdShow); //显示窗口
UpdateWindow(hWnd);
return TRUE;
}
BOOL InitWindowsClass(HINSTANCE hInstance) //定义窗口类
{
WNDCLASS WndClass;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(GetStockObject(WHITE_BRUSH));
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,"END");
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName="WinFill";
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW|CS_VREDRAW;
return RegisterClass(&WndClass);
}
首先这个程序在架构上比上一篇程序更加清晰,把注册类,创建窗口写到了两个函数里面。框架搭好了我们就只要处理winproc就行了。
在展示窗口的时候会有一个WM_PAINT消息产生,我们就是要处理这个消息,画刷画笔画图分为以下几步:
① 创建句柄,hdc,hbrush,hpen和定义指向包含绘图信息的结构体变量PtStr;
②获取句柄实例,hdc 通过BeginPaint(hWnd,&PtStr)函数,brush hpen通过GetStockObject
③设置 映射 SetMapMode(hDC,MM_ANISOTROPIC) 不同映射模式效果坐标有所不同
④利用SelectObject选择画笔花刷
⑤利用函数画图:movetoex linetoex polyline arc等等
⑥EndPaint(hWnd,&PtStr)结束画图