
_START_ARTICLE_
WM GETDLGCODE
_START_SECTION_
范例
_START_PARAGRAPH_
如果控件处理WM_GETDLGCODE消息时返回某个DLGC_WANT字节，控件将处理指定的消息类型而Windows将对该类型的消息不会做任何默认处理。 _NEWLINE_例如，下拉列表控件（list box）处理WM_GETDLGCODE消息返回码包含了DLGC_WANTARROWS位，指示下拉列表控件将会处理方向键。如果下拉列表控件有输入焦点且用户按下了“向下方向键”, Windows发送WM_GETDLGCODE消息给下拉列表控件。由于返回值包含了DLGC_WANTARROWS值， Windows允许下拉列表控件处理方向键且操作系统不会做任何处理。如果返回值不包含DLGC_WANTARROWS值， Windows将继续处理方向键并且把输入焦点转移为下一个控件。_NEWLINE_另一个例子，编辑框控件返回值包含DLGC_WANTCHARS码而按钮控件返回值则不包含。因此如果一个按钮控件有输入焦点且用户按下了一个有效的控件助记符（mnemonic character，显示为控件标签中的加了底划线的字母）, Windows将设置输入焦点到该控件上。如果一个编辑框控件有输入焦点且用户输入了一个助记符， Windows不会把输入焦点改到别的控件因为编辑框控件会自行处理WM_CHAR消息。_NEWLINE_一个控件处理WM_GETDLGCODE 消息时，如果返回值包含了DLGC_WANTMESSAGE码，表明应用程序不希望系统默认处理lParam参数中包含的消息。这些消息可以是WM_KEYDOWN, WM_SYSCHAR, WM_CHAR. _NEWLINE_下述代码示例，对检查框控件（check box ）子类化，处理WM_GETDLGCODE消息，当用户按下"X"键则选中检查框，如果按下"O"键则清除检查框。_NEWLINE_   case WM_GETDLGCODE:_NEWLINE_      // Call the check box window procedure first_NEWLINE_      lRet = CallWindowProc(lpCheckProc, hWnd, wMessage, wParam,_NEWLINE_                            lParam);_NEWLINE__NEWLINE_      // If lParam points to an MSG structure_NEWLINE_      if (lParam)_NEWLINE_      {_NEWLINE_         lpmsg = (LPMSG)lParam;_NEWLINE_         if (lpmsg->message == WM_CHAR)_NEWLINE_         {_NEWLINE_            if (lpmsg->wParam == 'x' || lpmsg->wParam == 'X')_NEWLINE_            {_NEWLINE_               // Select the check box when user presses "X"_NEWLINE_               SendMessage(hWnd, BM_SETCHECK, TRUE, 0);_NEWLINE_               lRet |= DLGC_WANTMESSAGE;_NEWLINE_            }_NEWLINE_            else if (lpmsg->wParam == 'o' || lpmsg->wParam == 'O')_NEWLINE_            {_NEWLINE_               // Clear the check box when user presses "O"_NEWLINE_               SendMessage(hWnd, BM_SETCHECK, FALSE, 0);_NEWLINE_               lRet |= DLGC_WANTMESSAGE;_NEWLINE_            }_NEWLINE_         }_NEWLINE_      }_NEWLINE_      return lRet;_NEWLINE_上述代码使得Windows对X, x, O, o字符的WM_CHAR消息不会做进一步处理，因为WM_GETDLGCODE返回值包含了DLGC_WANTMESSAGE码。上例中，控件返回值也可以用DLGC_WANTCHARS代替DLGC_WANTMESSAGE。_NEWLINE_下例代码子类化编辑框控件，禁止其通过Tab键获得输入焦点时默认地全部选中编辑框内的文本。_NEWLINE_     // In the subclass procedure_NEWLINE_   case WM_GETDLGCODE:_NEWLINE_      // Call the original edit control window procedure_NEWLINE_      lRet = CallWindowProc(lpEditProc, hWnd, wMessage, wParam,_NEWLINE_                            lParam);_NEWLINE__NEWLINE_      // Clear the DLGC_HASSETSEL bit from the return value_NEWLINE_      lRet &= ~DLGC_HASSETSEL;_NEWLINE__NEWLINE_      return lRet;