本程序在窗口客户区产生两个自绘制按钮,CreateWindow (TEXT ("button"), TEXT (""), WS_CHILD | WS_VISIBLE | BS_OWNERDRAW |BS_BITMAP,
                                      0, 0, BTN_WIDTH, BTN_HEIGHT,
                                      hwnd, (HMENU) ID_SMALLER, hInst,NULL) ;我在上面设置的坐标位置是0,0,而产生的按钮怎么会出现在客户区中央位置,如果我屏蔽掉WM_SIZE消息那么将会是上面函数产生结果,按钮出现在左上角,那么这个WM_SIZE消息是由谁产生的?因为我在程序运行后并没有移动窗口,或者改变它的大小!!下面是代码的一部分!!
/*---------------------------------------------
   OWNDRAW.C -- Owner-Draw Button Demo Program
                (c) Charles Petzold, 1998
  ---------------------------------------------*/
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
     static HWND      hwndSmaller, hwndLarger ;
     static int       cxClient, cyClient, cxChar, cyChar ;
     int              cx, cy ;
     LPDRAWITEMSTRUCT pdis ;
     POINT            pt[3] ;
     RECT             rc ;
     
     switch (message)
     {
     case WM_CREATE :
          cxChar = LOWORD (GetDialogBaseUnits ()) ;
          cyChar = HIWORD (GetDialogBaseUnits ()) ;
          
               // Create the owner-draw pushbuttons
          
          hwndSmaller = CreateWindow (TEXT ("button"), TEXT ("button1"),
                                      WS_CHILD | WS_VISIBLE | BS_OWNERDRAW |BS_BITMAP,
                                      0, 0, BTN_WIDTH, BTN_HEIGHT,
                                      hwnd, (HMENU) ID_SMALLER, hInst, NULL) ;
          
          hwndLarger  = CreateWindow (TEXT ("button"), TEXT (""),
                                      WS_CHILD | WS_VISIBLE | BS_OWNERDRAW,
                                      0, 0, BTN_WIDTH, BTN_HEIGHT,
                                      hwnd, (HMENU) ID_LARGER, hInst, NULL) ;
          return 0 ;
          
     case WM_SIZE :
          cxClient = LOWORD (lParam) ;
          cyClient = HIWORD (lParam) ;
          
               // Move the buttons to the new center
          
          MoveWindow (hwndSmaller, cxClient / 2 - 3 * BTN_WIDTH  / 2,
                                   cyClient / 2 -     BTN_HEIGHT / 2,
                      BTN_WIDTH, BTN_HEIGHT, TRUE) ;
          
          MoveWindow (hwndLarger,  cxClient / 2 +     BTN_WIDTH  / 2,
                                   cyClient / 2 -     BTN_HEIGHT / 2,
                      BTN_WIDTH, BTN_HEIGHT, TRUE) ;
          return 0 ;
          
    // case WM_COMMAND :
          GetWindowRect (hwnd, &rc) ;
          
               // Make the window 10% smaller or larger
          
          switch (wParam)
          {
          case ID_SMALLER :
               rc.left   += cxClient / 20 ;
               rc.right  -= cxClient / 20 ;
               rc.top    += cyClient / 20 ;
               rc.bottom -= cyClient / 20 ;
               break ;
               
          case ID_LARGER :
               rc.left   -= cxClient / 20 ;
               rc.right  += cxClient / 20 ;
               rc.top    -= cyClient / 20 ;
               rc.bottom += cyClient / 20 ;
               break ;
          }
          
          MoveWindow (hwnd, rc.left, rc.top, rc.right  - rc.left,
                            rc.bottom - rc.top, TRUE) ;
          return 0 ;
          

解决方案 »

  1.   

    你的程序有问题:// case WM_COMMAND :
              GetWindowRect (hwnd, &rc) ;
              
                   // Make the window 10% smaller or larger
              
              switch (wParam)
              {
              case ID_SMALLER :
                   rc.left   += cxClient / 20 ;
                   rc.right  -= cxClient / 20 ;
                   rc.top    += cyClient / 20 ;
                   rc.bottom -= cyClient / 20 ;
                   break ;
                   
              case ID_LARGER :
                   rc.left   -= cxClient / 20 ;
                   rc.right  += cxClient / 20 ;
                   rc.top    -= cyClient / 20 ;
                   rc.bottom += cyClient / 20 ;
                   break ;
              }
              
              MoveWindow (hwnd, rc.left, rc.top, rc.right  - rc.left,
                                rc.bottom - rc.top, TRUE) ;
              return 0 ;你的switch(wParam)不对!
    应该是 switch(LOWORD(wParam)) 才行!
    对于 WM_COMMAND 消息, LOWORD(wParam)对应的是ID, HIWORD(wParam)对应的是Event