02. 绘图消息和键盘消息
一. 绘图消息WM_PAINT
WM_PAINT消息出现时机:
1.窗口创建
2.窗口尺寸改变
3.最大最小化
4.从隐藏到显示
5.从屏幕外到屏幕内
窗口对象中保存了无效区,如果存在无效区,系统就会一直发送WM_PAINT消息。BeginPaint会清掉无效区,GetDC则不会。
系统没发送WM_PAINT消息时,程序员想自己手动绘图,可采用:
- InvalidateRect。手动产生无效区,无效区域将累积在更新区域中,直到下一条WM_PAINT消息出现时对该区域进行处理,或者直到使用调用ValidateRect或ValidateRgn函数。
- GetDC,ReleaseDC。
GetDC和BeginPaint区别:
1.BeginPaint会清掉无效区,GetDC则不会。
2.BeginPaint只绘制无效区部分,没有无效区则不绘制。
3.BeginPaint只能在WM_PAINT消息中使用
4.GetDC无视无效区
简记:BeginPaint只在WM_PAINT消息中使用,GetDC在其他情况中使用
二. 键盘消息
WM_KEYDOWN和WM_CHAR不能区分大小写,WM_CHAR可区分大小写,但要在消息循环中调用TranslateMessage。TranslateMessage的作用是把键盘的虚拟键消息转为WM_CHAR消息。
设置UNICODE宏之后,WM_CHAR消息中可以方便地区分中文。
case WM_CHAR: { TCHAR szBuff[MAXBYTE] = {}; wsprintf(szBuff, TEXT("[WinApi] WM_CHAR %c"), wParam);//每个汉字触发一次消息 OutputDebugString(szBuff); return 0; }