Window GDI

GDI

Posted by nomadli on January 26, 2021

流程

  1. int APIENTRY WinMain(In HINSTANCE hInstance, In_opt HINSTANCE hPrevInstance, In LPWSTR lpCmdLine, In int nCmdShow) {
  2. RegisterClassExW(WNDCLASSEXW*); -> LRESULT CALLBACK windowProc(HWND, UINT msg, WPARAM, LPARAM) {
  3. CreateWindowW()
  4. ShowWindow(hWnd, nCmdShow);
  5. UpdateWindow(hWnd);
  6. while (GetMessage(&msg, NULL, 0, 0)) { }
  7. 退出程序 以上包括窗口消息处理windowProc都可自动创建,vs window 32 窗口程序
  8. InitCommonControls(); 初始化win32基础控件
  9. GetClassInfoEx(HINSTANCE, “STATIC”, WNDCLASSEX*);获取类基本信息模板
  10. 修改WNDCLASSEX类的窗口消息回调函数、instance可以=GetModuleHandle当前线程ID、ClassName;后RegisterClassEx注册
  11. 所有控件都是基于窗口、消息类型也相同、自定义消息从WM_USER开始,一般会在此基础上直接大偏移 SendMessage 发送消息包括系统定义消息

主要消息

  1. WM_NCCALCSIZE 窗口大小消息,一般会在窗口创建前触发
  2. WM_CREATE创建窗口消息,一般初始化控件
  3. WM_PAINT 需要绘制
  4. WM_WINDOWPOSCHANGED 窗口位置变化
  5. WM_SETFONT 窗口字体变化
  6. WM_DESTROY 控件窗口销毁

WM_PAINT

  1. PAINTSTRUCT ps; BeginPaint(hWnd, &ps); 创建GDI绘制上下文
  2. HBITMAP hbmp = CreateCompatibleBitmap(hdc, width, height); HDC hdcMem = CreateCompatibleDC(0); SelectObject(hdcMem, hbmp); 创建双buf绘制
  3. HDC hdc = GetDC(hWnd); BitBlt(hdc, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY); 交换双缓存
  4. DeleteDC(hdcMem); DeleteObject(hbmp); DeleteDC(hdc); 释放资源
  5. EndPaint(hWnd, &ps); 销毁绘制上下文

GDI 对象 及 方法

  1. SelectObject() 设置绘制属性, 返回原属性如: 画笔、颜色、画刷、字体等
  2. SelectObject(GetStockObject(DC_BRUSH));SetDCBrushColor(RGB(255,0,0)); 只修改颜色,不会有新的对象
  3. SelectObject(GetStockObject(DC_PEN));SetDCPenColor(RGB(0,0,255)); 只修改颜色,不会有新的对象
  4. CPen画笔 CreatePen CreatePenIndirect
  5. CBrush画刷 CreateSolidBrush(颜色) CreateHatchBrush(阴影线) CreateBrushIndirect() CreatePatternBrush() CreateDIBPatternBrush() CreateSysColorBrush()
  6. CFont字体
  7. CBitmap位图
  8. CPalette调色板
  9. SetPixel() 绘制一个像素点 GetPixel()
  10. MoveTo() LineTo() 绘制直线
  11. Polyline() PolylineTo PolyPolyline 绘制多个首尾相连的线
  12. Rectangle() FillRect() FillSolidRect() 绘制矩形
  13. RoundRect() 圆角矩形
  14. FrameRect() 描边矩形
  15. Ellipse() 绘制圆形或椭圆
  16. Arc() ArcTo() AngleArc 绘制弧线
  17. Polygon() PolyBezier PolyBezierTo PolyDraw PolyPolygon 绘制三角形或多边形
  18. Pie() 绘制饼形图
  19. InvertRect() InvertRgn() 对矩形或指定区域的像素颜色进行反转
  20. GradientFill 绘制渐变的矩形或三角
  21. Chord
  22. CloseFigure
  23. ExtTextOut
  24. TextOut
  25. SelectClipRgn 设置裁剪区域