2010-02-09 126 views
1

我有一個窗口,裏面有10個子編輯控件。我想通過按Tab鍵從一個編輯控件移動到另一個編輯控件 - 我該怎麼做?Win32 GUI:編輯控件的Tab-Sequence

我的意思是,即使我能找出我是否按下了tab鍵,我如何找到下一個編輯控件來關注它?我希望自己不必跟蹤編輯控件,因爲我已將它們添加到父窗口中。

PS:按 「下一步」 我的意思是我創建的編輯控件的順序...

編輯:我在Win32使用純C.

編輯2:樣品



#include 

#define NAME "test" 

LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    HWND edit1, edit2; 
    switch (msg) 
    { 
     case WM_CREATE: 
      edit1 = CreateWindow("edit", "", WS_CHILD|WS_VISIBLE, 0, 0, 200, 50, hWnd, NULL, NULL, NULL); 
      edit2 = CreateWindow("edit", "", WS_CHILD|WS_VISIBLE, 250, 0, 200, 50, hWnd, NULL, NULL, NULL); 
      return 0; 

     case WM_CLOSE: 
      DestroyWindow(hWnd); 
      return 0; 

     case WM_DESTROY: 
      PostQuitMessage(0); 
      return 0; 
    } 
    return DefWindowProc(hWnd, msg, wParam, lParam); 
} 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
{ 
    WNDCLASS wc; 
    wc.style = 0; 
    wc.lpfnWndProc = WinProc; 
    wc.cbClsExtra = 0; 
    wc.cbWndExtra = 0; 
    wc.hInstance = hInstance; 
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); 
    wc.lpszMenuName = NAME; 
    wc.lpszClassName = NAME; 
    RegisterClass(&wc); 

    HWND win; 
    win = CreateWindow(NAME, "test", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, hInstance, NULL); 

    ShowWindow(win, nCmdShow); 
    UpdateWindow(win); 

    MSG msg; 
    while(GetMessage(&msg, NULL, 0, 0) > 0) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 
    return msg.wParam; 

} 

+0

孩子,不幼稚。 – SLaks 2010-02-09 22:44:04

+0

從原始的C Windows編程觀點來看 - 標籤順序不是順序,因爲它們被添加到窗口中(Z順序)?你嘗試將光標放在一個並按下Tab鍵? – 2010-02-09 22:47:02

+0

是的,我做了,它保持在相同的控制。 – 2010-02-09 22:48:39

回答

3

對話管理器爲你做了很多工作,所以如果你沒有足夠的理由來創建你自己的窗口類,你可以考慮創建一個對話框。

如果你是一個心態依然推出自己的,你必須要攔截WM_CHAR,尋找VK_TABVK_SHIFT | VK_TAB。對話管理器使用稱爲「z順序」的東西作爲標籤順序(http://msdn.microsoft.com/en-us/library/ms632599%28VS.85%29.aspx#zorder)。

FWIW,我的建議是不要低估在嘗試像這樣在Windows中重新創建現有設施時所承擔的負擔。對於你所知道的每一種行爲,通常至少有你不知道的行爲。例如,您的應用程序如何在筆式設備上運行?輔助功能擴展怎麼樣?屏幕閱讀器能夠正確處理它嗎?所有這些東西已經被燒入對話管理器。

我不知道我跟着...我想 對話只是一個浮動窗口 「常規」(?)一個以上。它是否可能是 應用程序使用 只是一個對話框,而不是正確的 CreateWindow()?

對話框可以是主應用程序窗口的模式或無模式的孩子,但他們也可以主應用程序窗口。這通常稱爲基於對話框的應用程序

如果你想要一個基於對話框的應用程序(即,以作爲它的主窗口對話框的應用程序),你會做這樣的事情:

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) 
{ 
    MSG msg; 
    HWND hDlg = CreateDialog(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc); 
    if (hDlg != NULL) 
    { 
     ShowWindow(hDlg, SW_SHOWNORMAL); 

     while (GetMessage(&msg, NULL, 0, 0)) { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 
    return 0; 
} 

完整的例子可能是太長列表在這裏,但如果你是谷歌的CreateDialog,你應該找到一些這樣的例子。

...是否有可能通過 在對話框中添加其他窗口? 即使使用自定義窗口過程? (換句話說,在對話框中,我不是 限制只是默認 控件,比如編輯和靜態?)

是的,你可以在對話框中創建自定義的控件。在你的DIALOG部分。RC文件,您可以包括像:

CONTROL "",IDC_MYCUSTOM,"MyCtrlClassName",WS_TABSTOP,10,20,30,40 

您還可以創建新的控制並將其添加到對話框動態(我會讓你谷歌的例子)。

另外,如果我想推出我自己的產品,我如何知道下一個控件是什麼? 我真的不認爲會有 更多的使用情況下比一個基本的桌面

使用GetNextDlgTabItem()如果你想通過控制循環Tab鍵順序對話框中:http://msdn.microsoft.com/en-us/library/ms645495%28VS.85%29.aspx

如果」重新滾動你自己,那麼你可能想是這樣的EnumChildWindows()功能:http://msdn.microsoft.com/en-us/library/ms633494%28VS.85%29.aspx

這也可能是有用的:http://msdn.microsoft.com/en-us/library/bb775501%28VS.85%29.aspx

+0

我不知道我跟着...我認爲對話框只是一個浮動窗口上面的「常規」(?)之一。應用程序是否可能只使用對話框而不是正確的CreateWindow()?是否有可能在對話框中添加其他窗口?即使使用自定義窗口過程? (換句話說,在對話框中,我不僅限於默認控件,如編輯和靜態?) – 2010-02-10 00:08:57

+0

另外,如果我想推出自己的,我如何找出下一個控件?我真的不認爲會有比基本桌面更多的用例... – 2010-02-10 00:37:38

0

這種處理可以輕鬆添加到應用程序中: - 在消息循環中添加對IsDialogMessage()的呼叫 - 所有控件都必須具有WS_TABSTOP樣式。

父窗口可能必須是對話框類,因爲對話框窗口類存儲狀態,允許它在失去並恢復激活時將焦點恢復到正確的控件。