用VC6.0写了个最简单的窗口程序,可以正常运行,但是占用CPU资源过多,一个小小的窗口竟然占用了50%的CPU资源。
代码如下:
#include <windows.h>
LRESULT CALLBACK MyWndProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
 );int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){ 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=MyWndProc;
wndclass.lpszClassName="MyWndApplication";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_VREDRAW|CS_HREDRAW; RegisterClass(&wndclass); HWND hwnd; hwnd=CreateWindow("MyWndApplication","WinMain",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL); ShowWindow(hwnd,SW_SHOWNORMAL);

UpdateWindow(hwnd); MSG msg; while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg);
} return 0;}LRESULT CALLBACK MyWndProc(
  HWND hwnd,      // handle to window
  UINT uMsg,      // message identifier
  WPARAM wParam,  // first message parameter
  LPARAM lParam   // second message parameter
  ){
switch(uMsg){ case WM_PAINT:
break;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;

default:
return DefWindowProc(hwnd,uMsg,wParam,lParam); }
return 0;}

解决方案 »

  1.   

    WM_PAINT你这儿处理了 WM_PAINT, 必须调用 BeginPaint 和 EndPaint, 否则系统会一直发 WM_PAINT 的消息。
    你只需要把 WM_PAINT 的处理移除掉,或者调用 BeginPaint 和 EndPaint 就可以了。
      

  2.   

    没错
    注释掉这个case分支你再看看
      

  3.   

    为什么不处理就会一直发送WM_PAINT消息呢?请问大牛
      

  4.   

    完美解决!幸福结贴!多谢 vrace | xianglitian 两位大牛!另外 function2009 在4楼Mark了一下,顺便谢一下!最后 lizhaoxinhui 在5楼发问,鼓励一下!
      

  5.   

    DefWindowProc 里面会把窗口置为有效状态,而如果你处理了,但是没有调用 BeginPaint 和 EndPaint 的话,窗口一直在无效状态,当然就会一直有 PAINT 的消息了