流程
- int APIENTRY WinMain(In HINSTANCE hInstance, In_opt HINSTANCE hPrevInstance, In LPWSTR lpCmdLine, In int nCmdShow) {
- RegisterClassExW(WNDCLASSEXW*); -> LRESULT CALLBACK windowProc(HWND, UINT msg, WPARAM, LPARAM) {
- CreateWindowW()
- ShowWindow(hWnd, nCmdShow);
- UpdateWindow(hWnd);
- while (GetMessage(&msg, NULL, 0, 0)) { }
- 退出程序 以上包括窗口消息处理windowProc都可自动创建,vs window 32 窗口程序
- InitCommonControls(); 初始化win32基础控件
- GetClassInfoEx(HINSTANCE, “STATIC”, WNDCLASSEX*);获取类基本信息模板
- 修改WNDCLASSEX类的窗口消息回调函数、instance可以=GetModuleHandle当前线程ID、ClassName;后RegisterClassEx注册
- 所有控件都是基于窗口、消息类型也相同、自定义消息从WM_USER开始,一般会在此基础上直接大偏移 SendMessage 发送消息包括系统定义消息
主要消息
- WM_NCCALCSIZE 窗口大小消息,一般会在窗口创建前触发
- WM_CREATE创建窗口消息,一般初始化控件
- WM_PAINT 需要绘制
- WM_WINDOWPOSCHANGED 窗口位置变化
- WM_SETFONT 窗口字体变化
- WM_DESTROY 控件窗口销毁
WM_PAINT
- PAINTSTRUCT ps; BeginPaint(hWnd, &ps); 创建GDI绘制上下文
- HBITMAP hbmp = CreateCompatibleBitmap(hdc, width, height); HDC hdcMem = CreateCompatibleDC(0); SelectObject(hdcMem, hbmp); 创建双buf绘制
- HDC hdc = GetDC(hWnd); BitBlt(hdc, 0, 0, width, height, hdcMem, 0, 0, SRCCOPY); 交换双缓存
- DeleteDC(hdcMem); DeleteObject(hbmp); DeleteDC(hdc); 释放资源
- EndPaint(hWnd, &ps); 销毁绘制上下文
GDI 对象 及 方法
- SelectObject() 设置绘制属性, 返回原属性如: 画笔、颜色、画刷、字体等
- SelectObject(GetStockObject(DC_BRUSH));SetDCBrushColor(RGB(255,0,0)); 只修改颜色,不会有新的对象
- SelectObject(GetStockObject(DC_PEN));SetDCPenColor(RGB(0,0,255)); 只修改颜色,不会有新的对象
- CPen画笔 CreatePen CreatePenIndirect
- CBrush画刷 CreateSolidBrush(颜色) CreateHatchBrush(阴影线) CreateBrushIndirect() CreatePatternBrush() CreateDIBPatternBrush() CreateSysColorBrush()
- CFont字体
- CBitmap位图
- CPalette调色板
- SetPixel() 绘制一个像素点 GetPixel()
- MoveTo() LineTo() 绘制直线
- Polyline() PolylineTo PolyPolyline 绘制多个首尾相连的线
- Rectangle() FillRect() FillSolidRect() 绘制矩形
- RoundRect() 圆角矩形
- FrameRect() 描边矩形
- Ellipse() 绘制圆形或椭圆
- Arc() ArcTo() AngleArc 绘制弧线
- Polygon() PolyBezier PolyBezierTo PolyDraw PolyPolygon 绘制三角形或多边形
- Pie() 绘制饼形图
- InvertRect() InvertRgn() 对矩形或指定区域的像素颜色进行反转
- GradientFill 绘制渐变的矩形或三角
- Chord
- CloseFigure
- ExtTextOut
- TextOut
- SelectClipRgn 设置裁剪区域