BOOL CALLBACK AboutDlgProc (HWND hDlg, UINT message, 
                            WPARAM wParam, LPARAM lParam)
{
     static HWND hCtrlBlock ;
     static int  iColor, iFigure ;
     
     switch (message)
     {
     case WM_INITDIALOG:
          iColor  = iCurrentColor ;
          iFigure = iCurrentFigure ;
          
          CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE,   iColor) ;
          CheckRadioButton (hDlg, IDC_RECT,  IDC_ELLIPSE, iFigure) ;
          
          hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ;
          
          SetFocus (GetDlgItem (hDlg, iColor)) ;
            return FALSE ;
          
     case WM_COMMAND:
          switch (LOWORD (wParam))
          {
          case IDOK:
               iCurrentColor  = iColor ;
               iCurrentFigure = iFigure ;
               EndDialog (hDlg, TRUE) ;
               return TRUE ;
               
          case IDCANCEL:
               EndDialog (hDlg, FALSE) ;
               return TRUE ;
               
          case IDC_BLACK:
          case IDC_RED:
          case IDC_GREEN:
          case IDC_YELLOW:
          case IDC_BLUE:
          case IDC_MAGENTA:
          case IDC_CYAN:
          case IDC_WHITE:
               iColor = LOWORD (wParam) ;
               CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE, LOWORD (wParam)) ;
               PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
               return TRUE ;
               
          case IDC_RECT:
          case IDC_ELLIPSE:
               iFigure = LOWORD (wParam) ;
               CheckRadioButton (hDlg, IDC_RECT, IDC_ELLIPSE, LOWORD (wParam)) ;
               PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
               return TRUE ;
          }
          break ;
          
     case WM_PAINT:
          PaintTheBlock (hCtrlBlock, iColor, iFigure) ;
          break ;
     }
     return FALSE ;
}
以上是window程序设计第十一章第二个例子,问题有两个首先
case WM_INITDIALOG:
          iColor  = iCurrentColor ;
          iFigure = iCurrentFigure ;
          
          CheckRadioButton (hDlg, IDC_BLACK, IDC_WHITE,   iColor) ;
          CheckRadioButton (hDlg, IDC_RECT,  IDC_ELLIPSE, iFigure) ;
          
          hCtrlBlock = GetDlgItem (hDlg, IDC_PAINT) ;
          
          SetFocus (GetDlgItem (hDlg, iColor)) ;
            return FALSE ;
我看msdn知道这块应该是return FALSE;但是我改为return true;完全没影响,看到一个前辈发的帖子说是有区别的
可是我怎么测都一样,按照msdn的说法,当返回为真的时候,应该是有系统来设置焦点的位置,根据WS_TABSTOP这个属性,设置焦点为一的控件或得焦点,但是我改了这个序列号,也没什么影响。这是个第一个问题。第二个问题是大家看看,这个对话框的最后return FALSE;就是说没有返回到默认的窗口消息,处理函数,也就是没让window处理别的消息,完全屏蔽(不知道这么说对不对),但是键盘的箭头按键还起作用,tap也起作用。这是为什么搞不懂,苦恼啊!

解决方案 »

  1.   

    1.你看看是否设置了默认按钮2.你定义的是对话框窗口过程。具体你到msdn上面查查DialogProc:If the dialog box procedure returns FALSE, the dialog manager performs the default dialog operation in response to the message.
    另外关于窗口过程和对话框过程的不同在windows程序设计上这本书上有讲,你找一下。
      

  2.   

    应该是return FALSE;但是我改为return true;完全没影响我曾经也以为没关系,后来给对话框设置气泡提示,始终不能正确运行,后来才发现问题出在这里。
      

  3.   

    return true 是告诉对话框处理程序自己的处理程序处理了该消息,false是告诉对话框处理程序没有处理?
    这样理解?和你的想法相反