多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# GDI绘图技术 一、3种HDC句柄; 二、3种坐标体系; 三、4种CDC派生类; 四、6种GDI对象; 1.通过HDC句柄有三种方式:标准客户区绘图、临时客户区绘图和非客户区绘图、 a)标准客户区绘图 必须是在WM_PAINT消息回调时才能执行,调用BeginPaint函数获取标准客户区绘图句柄进行绘图,最后调用EndPaint函数释放。 ```c++ PAINTSTRUCT ps; HDC hdc = ::BeginPaint(hwndDlg,&ps);//创建画笔 // Ellipse(hdc,0,0,300,200); //椭圆 Rectangle(hdc,0,0,40,40); //方形 Rectangle(hdc,80,80,120,120); //方形 MoveToEx(hdc,20,20,NULL); //线条 LineTo(hdc,100,100); //线条 EndPaint(hwndDlg,&ps);//结束画笔 ``` * * * * * b)临时客户区绘图 在任何消息回调时都可以执行,调用 **GetDC ** 获取临时客户区绘图句柄进行绘图。最后调用 **ReleaseDC** 释放 漂浮在窗口表面,窗口刷新调就没了,不能长期保存 case WM_MOUSEMOVE: { //临时客户绘图 int x = LOWORD(lParam); int y = HIWORD(lParam); HDC hdc = GetDC(hwndDlg); Ellipse(hdc, x - 15, y - 15, x + 15, y + 15); ReleaseDC(hwndDlg, hdc); } return TRUE; c) 非客户区绘图 必须是在WM__NCPAINT消息回调时才能执行,调用GetWindowDC函数获取非客户区绘图句柄进行绘图,最后调用ReleaseDC释放。 ```c++ case WM_NCPAINT: { //非客户区 HDC hdc = GetWindowDC(hwndDlg); RECT rect; GetWindowRect(hwndDlg,&rect); Rectangle(hdc,0,0,rect.right - rect.left,rect.bottom - rect.top); char str[200]; sprintf(str,"非客户区绘图:(%d,%d,%d,%d)", rect.left,rect.top,rect.right,rect.bottom); TextOut(hdc,5,5,(LPCSTR)str,strlen(str)); ReleaseDC(hwndDlg,hdc); } ``` d)调用Invalidate函数强制客户区标准绘图更新,临时客户区的绘图被强制清除。 ```c++ case WM_MOVE: { SendMessage(hwndDlg,WM_NCPAINT,0,0); InvalidateRect(hwndDlg, NULL,TRUE); } ``` 缺省 return FALSE就是自己不处理电脑程序自己处理。 return TRUE就是自己处理