|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 宋桓公 于 2016-6-30 08:54 编辑
这个问题是在做9*9乘法表这个课后习题发现的~~
先给出我的结论:注意在 WM_PAINT 下不要使用hdc = GetDC(hwnd)的方式,因为这样会不停的触发WM_PAINT消息!
东西看上去就会闪烁!!
1、采用BeginPaint ,正常不会闪烁:
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- HDC hdc;
- PAINTSTRUCT ps;
- RECT rect;
- int i,j=1,x,y = 0;
- TCHAR szBuffer[20];
- int xpos=100,ypos=100;
- switch (message)
- {
- case WM_PAINT://写在WM_PAINT里九九乘法表会闪烁,貌似一直都会有重绘消息产生!!!!
- hdc = BeginPaint(hwnd, &ps);
- wsprintf(szBuffer,TEXT("九九乘法表"));
- TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
- ypos += 20;
- GetClientRect(hwnd,&rect);
- for (i = 1; i <= 9; i++)
- {
- x = i;
- for (j = 1; j <= i; j++)
- {
- y = j;
- wsprintf(szBuffer,TEXT("%d * %d = %d"),x,y,x*y);
- TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
- xpos += 100;
- }
- xpos = 100;
- ypos += 20;
- }
- EndPaint(hwnd,&ps);
- return 0;
-
- case WM_LBUTTONDOWN:
-
- return 0;
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- }
- return DefWindowProc(hwnd, message, wParam, lParam);
- }
复制代码
2、采用 GetDC 的方式,“九九乘法表”会闪烁,貌似一直都会有重绘消息产生!!!!
- //显示9*9乘法表,写在WM_PAINT里九九乘法表会闪烁,貌似一直都会有重绘消息产生!!!!
- LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- HDC hdc;
- PAINTSTRUCT ps;
- RECT rect;
- int i,j=1,x,y = 0;
- TCHAR szBuffer[20];
- int xpos=100,ypos=100;
- switch (message)
- {
- case WM_PAINT:
- hdc = GetDC(hwnd);
- wsprintf(szBuffer,TEXT("九九乘法表"));
- TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
- ypos += 20;
- GetClientRect(hwnd,&rect);
- for (i = 1; i <= 9; i++)
- {
- x = i;
- for (j = 1; j <= i; j++)
- {
- y = j;
- wsprintf(szBuffer,TEXT("%d * %d = %d"),x,y,x*y);
- TextOut(hdc,xpos,ypos,szBuffer,lstrlen(szBuffer));
- xpos += 100;
- }
- xpos = 100;
- ypos += 20;
- }
- ReleaseDC(hwnd,hdc);
- return 0;
-
- case WM_LBUTTONDOWN:
-
- return 0;
- case WM_DESTROY:
- PostQuitMessage(0);
- return 0;
- }
- return DefWindowProc(hwnd, message, wParam, lParam);
- }
复制代码
@小甲鱼 @无符号整形
听了两位老大的话,深有感触,再次再次总结:
1、所谓的无效区域就是Update Region (需要跟新的区域),有效区域就是不需要跟新的区域。
如果存在无效区域,系统就会产生WM_PAINT 消息。
2、无效区域是可以被累加的,当队列中其他消息都被带走时,只剩下WM_PAINT 消息时,无效区域
统一重绘。
3、并不是重绘了,无效区域就消失了,使无效区域消失的方法就是调用BeginPaint 。所以如果不在
WM_PAINT消息处理函数中调用BeginPaint ,那么无效区域总是存在,从而会不停的产生WM_PAINT 消息。所以就会不停进入WM_PAINT 消息处理函数~~
|
评分
-
查看全部评分
|