2014-11-02 107 views
1

我已經嘗試了一切,但無法使TAB鍵工作將焦點從一個控件移動到資源對話框中的另一個控件。下面是代碼:C++對話框TAB鍵不工作

IDD_DLG_DIALOG DIALOGEX 0, 0, 219, 198 
STYLE DS_SETFONT | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU | WS_EX_CONTROLPARENT 
EXSTYLE WS_EX_APPWINDOW 
CAPTION "Caption" 
FONT 8, "Tw Cen MT", 400, 0, 0x0 
BEGIN 
     DEFPUSHBUTTON "Done",IDOK,162,175,50,16 
     EDITTEXT  IDC_EDIT1,27,13,185,12,ES_AUTOHSCROLL | WS_TABSTOP | WS_VISIBLE | WS_CHILD 
     PUSHBUTTON  "Add",IDC_Add,109,30,33,13,WS_TABSTOP | WS_VISIBLE | WS_CHILD 
     LISTBOX   IDC_LIST1,7,49,205,121,LBS_SORT | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP | WS_VISIBLE | WS_CHILD 
     EDITTEXT  IDC_EDIT2,27,31,81,12,ES_AUTOHSCROLL | WS_TABSTOP | WS_VISIBLE | WS_CHILD 
     LTEXT   "Name",IDC_STATIC,7,33,18,11 
     LTEXT   "Link",IDC_STATIC,7,15,15,11  
     PUSHBUTTON  "Delete",IDC_DEL,144,30,33,13 | WS_TABSTOP | WS_VISIBLE | WS_CHILD 
     CONTROL   "Autorun at startup",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,174,70,10 
     PUSHBUTTON  "Edit",IDC_EDIT,179,30,33,13,WS_TABSTOP | WS_VISIBLE | WS_CHILD 
END 

主要While循環:

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine,int nCmdShow) 
     { 
      MSG msg; 
      HACCEL hAccelTable; 

      // Perform application initialization: 
      if (!InitInstance (hInstance, nCmdShow)) return FALSE; 
      hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_STEALTHDIALOG); 
      while (GetMessage(&msg, NULL, 0, 0)) 
      { 
      if((!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))||(!IsDialogMessage(msg.hwnd,&msg))) 
         { 
          TranslateMessage(&msg); 
          DispatchMessage(&msg); 
         } 
      } 
    } 

在這裏找出問題所在。謝謝。

+0

根據這篇文章http://support.microsoft.com/kb/71450 IsDialogMessage的hwnd參數應該是對話框hwnd,而不是msg.hwnd。 – 2014-11-02 10:31:49

回答

0

to this postthis kb文章證實:

TranslateAccelerator()發送WM_COMMAND消息,其 手柄您作爲參數傳遞給TranslateAccelerator()的窗口。

您可能正在呼叫TranslateAccelerator()傳遞您的MSG結構的hwnd成員 ;這將成爲重點關注的窗口句柄。相反,您應該通過主窗口的句柄。

這適用於您的代碼。

0

將您的||更改爲&&。目前,如果TranslateAccelerator返回0(除非按下加速鍵)否則IsDialogMessage將永遠不會被調用 - 這就是處理Tab鍵的原因。

(此外,馬可·A.在他的回答意味着,你應該通過你的對話框的HWND,而不是msg.hwnd作爲IsDialogMessage調用的第一個參數。但是,這是無關緊要的,除非IsDialogMessage實際上被調用,它幾乎當你有||而不是&&)。