/*-----------------------------------------
   BEEPER1.C  -- Timer Demo Program No. 1
                 (c) Charles Petzold, 1998
  -----------------------------------------*/#include <windows.h>
#include <conio.h>#define ID_TIMER    1LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
     static TCHAR szAppName[] = TEXT ("Beeper1") ;
     HWND         hwnd ;
     MSG          msg ;
     WNDCLASS     wndclass ;
 AllocConsole();
     
     wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
     wndclass.lpfnWndProc   = WndProc ;
     wndclass.cbClsExtra    = 0 ;
     wndclass.cbWndExtra    = 0 ;
     wndclass.hInstance     = hInstance ;
     wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
     wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
     wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
     wndclass.lpszMenuName  = NULL ;
     wndclass.lpszClassName = szAppName ;
     
     if (!RegisterClass (&wndclass))
     {
          MessageBox (NULL, TEXT ("Program requires Windows NT!"), 
                      szAppName, MB_ICONERROR) ;
          return 0 ;
     }
     
     hwnd = CreateWindow (szAppName, TEXT ("Beeper1 Timer Demo"),
                          WS_OVERLAPPEDWINDOW,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          CW_USEDEFAULT, CW_USEDEFAULT,
                          NULL, NULL, hInstance, NULL) ;
          
     ShowWindow (hwnd, iCmdShow) ;
     UpdateWindow (hwnd) ;
          
     while (GetMessage (&msg, NULL, 0, 0))
     {
          TranslateMessage (&msg) ;
          DispatchMessage (&msg) ;
     }
     return msg.wParam ;
}LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     switch (message)
     {
     case WM_CREATE:
          SetTimer (hwnd, ID_TIMER, 100, NULL) ;
          return 0 ;     case WM_TIMER :
          _cprintf("Processing WM_TIMER...\n");
          MessageBeep (-1) ;          
          return 0 ;
     //把下面的WM_PAINT消息处理代码注释掉后,程序就能正常响应并处理timer消息
     //但是如果把注释拿掉就不能了,这到底是为什么呢?
     /*case WM_PAINT :
  
          
          return 0 ;*/
          
     case WM_DESTROY :
          KillTimer (hwnd, ID_TIMER) ;
          PostQuitMessage (0) ;
          return 0 ;
     }
     return DefWindowProc (hwnd, message, wParam, lParam) ;
}求高人指点。谢谢。

解决方案 »

  1.   

      while (GetMessage (&msg, hwnd, 0, 0))
         {
              TranslateMessage (&msg) ;
              DispatchMessage (&msg) ;
         }
      

  2.   

    case WM_PAINT :
    不停的在响应,造成处理不了其他消息?
      

  3.   

    Windows对WM_TIMER消息的处理非常类似于对WM_PAINT消息的处理,这两个消息都是低优先级的,程序只有在消息队列中没有其它消息时才接收它们。系统不断发送WM_PAINT消息,于是程序不断处理WM_PAINT消息。这时候就无法处理WM_TIMER消息了
      

  4.   

    case WM_PAINT :    
        BeginPaint(...);
        EndPaint(...);
                              
     return 0 ;
      

  5.   

    是的,如果加上BeginPaint就不会有问题。但我想明白为什么
      

  6.   

     BeginPaint(...)让区域变得有效了,不然WM_PAINT会一直存在消息队列里,你的WM_TIMER的优先级比WM_PAINT还低,PAINT得不到处理,你的TIMER就更没戏.
      

  7.   


    LZ要搞清楚很多问题呀:
    1、窗口绘制机制
    2、DC
    3、无效区域
    4、BeginPaint 和 EndPaint 
    5、为什么在绘制函数中必须要用BeginPaint 和 EndPaint?如果用 GetDC()和ReleaseDC()会怎样?
      

  8.   

    补充一下:
    5、为什么在绘制函数中必须要用BeginPaint 和 EndPaint?如果用 GetDC()和ReleaseDC()会怎样?
    -------------------------------------------------------------------------------------是在WM_PAINT消息处理函数中.......