无效区产生时机和绘制dc
//派发消息到对应的窗口过程函数
LRESULT DispatchMessage(
CONST MSG *lpmsg // message information 消息地址
);
绘图消息 WM_PAINT
消息来的时机:
当产生无效区的时候,系统会发送WM_PAINT消息。
无效区 -- 窗口需要重新绘制的部分
无效区产生的时机
1. 最小化恢复的时候
2. 被覆盖的部分重新显示(win10 移除屏幕外)
3. 拖动\鼠标移动\菜单,不会产生,因为系统做了优化
4. 窗口的尺寸被修改
5. 还有一些API可以发送WM_PAINT消息
例如: 指定位置发送绘制消息
BOOL InvalidateRect(
HWND hWnd, // handle to window
CONST RECT* lpRect, // rectangle coordinates 绘制矩形 左上右下两个点
BOOL bErase // erase state 是否更新背景
);
(UpdateWindow)(必须加在一起来重新绘制窗口)
绘制区域
typedef struct tagPAINTSTRUCT {
HDC hdc; 显示dc用来绘制
BOOL fErase; 是否删除背景
RECT rcPaint; 绘制矩形 左上右下两个点
BOOL fRestore; 恢复系统内部使用
BOOL fIncUpdate; 更新系统内部使用
BYTE rgbReserved[32]; 保留系统内部使用
} PAINTSTRUCT, *PPAINTSTRUCT;
HDC获得显示图案的环境(上下文)
开始绘制图案位置
HDC BeginPaint(
HWND hwnd, // handle to window 窗口句柄
LPPAINTSTRUCT lpPaint // paint information指向将接收的PAINTSTRUCT地址
);
绘制文字
int DrawText(
HDC hDC, // handle to DC
LPCTSTR lpString, // text to draw 输出的字符
int nCount, // text length 字符大小
LPRECT lpRect, // formatting dimensions 绘制矩形 左上右下两个点
UINT uFormat // text-drawing options 绘制样式 比如居中,靠左对齐等
);
释放beginpaint产生的内存。如果不调用就会一直增加
BOOL EndPaint(
HWND hWnd, // handle to window
CONST PAINTSTRUCT *lpPaint // paint data指向将接收的PAINTSTRUCT地址
);
人工产生绘制图案位置(无效区)
HDC GetDC( HWND hWnd // handle to window);
释放GetDC产生的内存。如果不调用就会一直增加
int ReleaseDC(
HWND hWnd, // handle to window
HDC hDC // handle to DC );
WM_PAINT 消息接受里面不能使用GetDC 会造成循环
BeginPaint与GetDC的区别(使用效果相同)
BeginPaint会清除无效区,GetDC不会
BeginPaint/EndPaint通常只在WM_PAINT消息中使用.
加载指定图标资源
HICON LoadIcon(
HINSTANCE hInstance, // handle to application instance 句柄实例
LPCTSTR lpIconName // name string or resource identifier 图标资源选择
);
将图标绘制到指定环境中
BOOL DrawIcon(
HDC hDC, // handle to DC
int X, // x-coordinate of upper-left corner绘制x坐标
int Y, // y-coordinate of upper-left corner 绘制y坐标
HICON hIcon // handle to icon 绘制句柄
);
键盘消息WM_KEYDOWN
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_KEYDOWN
WPARAM wParam, // virtual-key code 虚拟键盘值 Windows统一了标准
LPARAM lParam // key data 扫描码 生产商给定的值
);
int wsprintf( 输出位置 ,格式 比如TEXT("%c") ,消息);
//将keydown消息转换为字符消息
这个函数帮我们实现了字符shift和capslk组合使用来完成大小写的转换
BOOL TranslateMessage(
CONST MSG *lpMsg // message information
);
keydown消息转换为字符消息 WM_CHAR