win32sdk编程中,如果我要在窗口中显示文字或者图像,是不是窗口过程函数里一定要有处理WM_PAINT的case语句啊?
如果可以没有处理WM_PAINT的case语句,那WM_PAINT消息由谁来处理呢?DefWindowProc吗?

解决方案 »

  1.   

    可以在其他消息的处理过程中绘制,如鼠标消息,但窗口一被覆盖就什么也没有了!所以最好在WM_PAINT消息中绘制!
    你在创建窗口时要指定一个窗口过程函数,窗口的消息都在那是处理,DefWindowProc是windows提供的对所有消息进行默认处理的函数,对于你不想处理的消息都应传给该函数处理,以便维持程序的正常运行!
      

  2.   

    to:lzg0001(沧海中最不起眼的那一粟)
    程序一运行,就一定会有WM_PAINT消息的,这时候窗口过程函数里没有处理WM_PAINT的case语句,那这个WM_PAINT消息由谁来处理?我贴一部分代码在下面
    里面不管是WndProc 还是WndProc1,还是CheckBottom都没有处理WM_PAINT消息的case语句。 
    int CheckBottom (HWND hwnd, int cyClient, int iLine)
    {
         if (iLine * cyChar + cyChar > cyClient)
         {
              InvalidateRect (hwnd, NULL, TRUE) ;
              UpdateWindow (hwnd) ;
              iLine = 0 ;
         }
         return iLine ;
    }LRESULT APIENTRY WndProc1 (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         static int iNum, iLine, cyClient ;
         HDC        hdc ;
         TCHAR      szBuffer[16] ;
         
         switch (message)
         {
         case WM_SIZE:
              cyClient = HIWORD (lParam) ;
              return 0 ;
              
         case WM_TIMER:
              if (iNum < 0)
                   iNum = 0 ;
              
              iLine = CheckBottom (hwnd, cyClient, iLine) ;
              hdc = GetDC (hwnd) ;          TextOut (hdc, 0, iLine * cyChar, szBuffer, 
                       wsprintf (szBuffer, TEXT ("%d"), iNum++)) ;          ReleaseDC (hwnd, hdc) ;
              iLine++ ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
    LRESULT APIENTRY WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         static HWND    hwndChild[4] ;
         static TCHAR * szChildClass[] = { TEXT ("Child1"), TEXT ("Child2"),
                                           TEXT ("Child3"), TEXT ("Child4") } ;
         static WNDPROC ChildProc[] = { WndProc1, WndProc2, WndProc3, WndProc4 } ;
         HINSTANCE      hInstance ;
         int            i, cxClient, cyClient ;
         WNDCLASS       wndclass ;
         
         switch (message)
         {
         case WM_CREATE:
              hInstance = (HINSTANCE) GetWindowLong (hwnd, GWL_HINSTANCE) ;
              
              wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
              wndclass.cbClsExtra    = 0 ;
              wndclass.cbWndExtra    = 0 ;
              wndclass.hInstance     = hInstance ;
              wndclass.hIcon         = NULL ;
              wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
              wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
              wndclass.lpszMenuName  = NULL ;
              
              for (i = 0 ; i < 4 ; i++)
              {
                   wndclass.lpfnWndProc   = ChildProc[i] ;
                   wndclass.lpszClassName = szChildClass[i] ;
                   
                   RegisterClass (&wndclass) ;
                   
                   hwndChild[i] = CreateWindow (szChildClass[i], NULL,
                                       WS_CHILDWINDOW | WS_BORDER | WS_VISIBLE,
                                       0, 0, 0, 0, 
                                       hwnd, (HMENU) i, hInstance, NULL) ;
              }
              
              cyChar = HIWORD (GetDialogBaseUnits ()) ;
              SetTimer (hwnd, 1, 10, NULL) ;
              return 0 ;
              
         case WM_SIZE:
              cxClient = LOWORD (lParam) ;
              cyClient = HIWORD (lParam) ;
              
              for (i = 0 ; i < 4 ; i++)
                   MoveWindow (hwndChild[i], (i % 2) * cxClient / 2,
                                             (i > 1) * cyClient / 2,
                               cxClient / 2, cyClient / 2, TRUE) ;
              return 0 ;
              
         case WM_TIMER:
              for (i = 0 ; i < 4 ; i++)
                   SendMessage (hwndChild[i], WM_TIMER, wParam, lParam) ;
              
              return 0 ;
              
         case WM_CHAR:
              if (wParam == '\x1B')
                   DestroyWindow (hwnd) ;
              
              return 0 ;
              
         case WM_DESTROY:
              KillTimer (hwnd, 1) ;
              PostQuitMessage (0) ;
              return 0 ;
         }
         return DefWindowProc (hwnd, message, wParam, lParam) ;
    }
      

  3.   

    lzg0001(沧海中最不起眼的那一粟) (
    说的对
    看看windows程序设计