更新时间:2015-12-06 23:16:19浏览次数:1+次
BeginPaint(hwnd,&ps);
EndPaint(hwnd,&ps);
虽然这里表面上好像什么都没有做,实际上却做了一个关键的处理。从上面解释的无效区域和WM_PAINT的成对出现,也就意味着,从消息队列中移除了WM_PAINT消息,那么也就表明无效区域一定要被消除,消除一般也就是会执行重绘。这样就达到了处理这个消息的目的。然而,你可以不重绘,但是必然要先取消无效区域,也就是让无效区域变成有效,表明这个区域被你重新绘制了一遍。当然,你可以不绘制,而只是简单的让这个区域变成有效的,这样消掉了无效区域,WM_PAINT消息也从消息队列移除,这样就保持了逻辑的一致,就表示简单的处理完毕了。#include "windows.h"
#include <tchar.h>
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
static int i=0;
RECT rect;
switch (message)
{
case WM_PAINT:// - 未处理WM_PAINT消息,未使无效区域变为有效,从而产生了WM_PAINT消息处理死循环
i++;
return 0;
case WM_LBUTTONDOWN:
GetClientRect(hwnd,&rect);// - 是客户区变为有效,打破WM_PAINT消息处理死循环
ValidateRect(hwnd,&rect);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
TCHAR ClassName[] = _T("MyClass");
TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
WNDCLASS wndClass;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hbrBackground= (HBRUSH)GetStockObject(GRAY_BRUSH);
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wndClass.hInstance = hInstance;
wndClass.lpfnWndProc = WinProc;
wndClass.lpszClassName = ClassName;
wndClass.lpszMenuName=NULL;
wndClass.style=CS_HREDRAW|CS_VREDRAW;
if(!RegisterClass(&wndClass))
{
return 0;
}
HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,440,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
MSG msg;
while (GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
要检验是否进入了WM_PAINT消息处理死循环,可以在程序调试运行时在WM_PAINT消息处理的代码处打上断点,保证每次都可以执行到断点处,也就表明在执行这个死循环。相关资讯