2016-05-19 6 views
0

Das folgende ist mein winapi Programm, das Fenster 3 Sätze von Kontrollen enthält:Die Tab-Taste nicht in dem Kind nicht funktioniert steuert

  1. Die Steuerelemente, die
  2. Die Kontrollen in Gruppe1 direkt im Fenster erstellt
  3. Die Kontrollen in Group2

Wenn ich drücken Tab-Taste, es Traverse nur in set1. Warum kann ich nicht mit der Tabulatortaste zum untergeordneten Steuerelement der group1 und group2 wechseln?

#include <Windows.h> 

LRESULT __stdcall WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { 
    switch (message) 
    { 
    case WM_CTLCOLORSTATIC: 
    { 
     HDC hdcStatic = (HDC)wParam; 
     SetTextColor(hdcStatic, RGB(0, 0, 255)); 
     SetBkMode(hdcStatic, TRANSPARENT); 
     return (LRESULT)GetStockObject(NULL_BRUSH); 
    } 
    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 
    default: 
     return DefWindowProc(hWnd, message, wParam, lParam); 
    } 
    return 0; 
} 
//////////////////////////////////////////////////////////////////////////// 
void CreateEdit(const HWND &parent, const int &x, const int &y, const int &id) { 
    CreateWindow(L"EDIT", L"", WS_BORDER | WS_CHILD | WS_VISIBLE | WS_TABSTOP, x, y, 200, 20, parent, (HMENU)id, NULL, NULL); 
} 
//////////////////////////////////////////////////////////////////////////// 
int __stdcall wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int  nCmdShow) 
{ 
    WNDCLASSEX wndclass{}; 

    wndclass.cbSize = sizeof(wndclass); 
    wndclass.style = CS_HREDRAW | CS_VREDRAW; 
    wndclass.lpfnWndProc = WndProc; 
    wndclass.hInstance = hInstance; 
    wndclass.hbrBackground = CreateSolidBrush(RGB(255, 128, 255)); 
    wndclass.lpszClassName = L"test"; 

    RegisterClassEx(&wndclass); 

    HWND hWndMainWindow = CreateWindow(
     wndclass.lpszClassName, 
     L"test", 
     WS_EX_OVERLAPPEDWINDOW | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, 
     100, 100, 500, 500, 
     NULL, NULL, hInstance, NULL); 

    ::ShowWindow(hWndMainWindow, SW_SHOW); 
    ::UpdateWindow(hWndMainWindow); 

    //Creating Controls~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    int x = 10, y = 20, id = 100; 
    HWND g1 = CreateWindow(L"button", L"Group1", WS_CHILD | WS_VISIBLE | BS_GROUPBOX | WS_TABSTOP | WS_GROUP, 0, 50, 220, 200, hWndMainWindow, (HMENU)++id, NULL, NULL); 
    //Controls in Group1 
    CreateEdit(g1, x, (y += 30), ++id); 
    CreateEdit(g1, x, (y += 30), ++id); 
    CreateEdit(g1, x, (y += 30), ++id); 
    CreateEdit(g1, x, (y += 30), ++id); 

    HWND g2 = CreateWindow(L"button", L"Group2", WS_CHILD | WS_VISIBLE | BS_GROUPBOX | WS_TABSTOP | WS_GROUP, 260, 50, 220, 200, hWndMainWindow, (HMENU)++id, NULL, NULL); 
    y = 20; 
    //Controls in Group2 
    CreateEdit(g2, x, (y += 30), ++id); 
    CreateEdit(g2, x, (y += 30), ++id); 
    CreateEdit(g2, x, (y += 30), ++id); 
    CreateEdit(g2, x, (y += 30), ++id); 

    //The controls that create directly in the main window 
    y = 270; 
    CreateWindow(L"static", L"Main Window Controls", WS_CHILD | WS_VISIBLE, x, y, 200, 30, hWndMainWindow, (HMENU)++id, NULL, NULL); 

    CreateEdit(hWndMainWindow, x, (y += 30), ++id); 
    CreateEdit(hWndMainWindow, x, (y += 30), ++id); 
    CreateEdit(hWndMainWindow, x, (y += 30), ++id); 
    CreateEdit(hWndMainWindow, x, (y += 30), ++id); 
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 

    MSG msg; 

    while (GetMessage(&msg, NULL, 0, 0) > 0) { 
     if (!IsDialogMessage(hWndMainWindow, &msg)) 
     { 
      TranslateMessage(&msg); 
      DispatchMessage(&msg); 
     } 
    } 

    return (int)msg.wParam; 
} 
+0

Sind Sie sicher, dass der Fokus nicht bewegt? Sie verwenden ein 'NULL_BRUSH', um Ihre Bearbeitungssteuerelemente zu rendern, und möglicherweise sehen Sie nicht das Verschieben des Fokusrechtecks. – IInspectable

+0

Der Fokus wird nur auf die Steuerelemente des Hauptfensters und nicht auf die Gruppensteuerelemente verschoben. – SaeidMo7

+1

Ich bin mir nicht 100% sicher, aber ich denke nicht, dass Gruppenboxen die Eltern der Kontrollen sein sollen, die sie zu enthalten scheinen. Ich bekomme diese Idee wegen der Art, wie der WS_GROUP-Stil funktioniert. – Stuart

Antwort

2

Die zwei untergeordneten Fenster, die "Group1" und "Group2" hosten, müssen beide als "Steuerelement-Eltern" mit dem WS_EX_CONTROLPARENT-Stil gekennzeichnet werden. Dieser Stil bedeutet:

Das Fenster selbst enthält untergeordnete Fenster, die an Dialogfeldnavigation teilnehmen sollten. Wenn dieser Stil festgelegt ist, der Dialogmanager rekursiv in Kinder dieses Fenster, wenn die Navigation durchführen Operationen wie Umgang mit der TAB-Taste, eine Pfeiltaste oder eine Tastatur mnemonic

Ändern Sie den Code die Fenster erstellen . wie folgt:

HWND g1 = CreateWindowEx(WS_EX_CONTROLPARENT, L"button", L"Group1", WS_CHILD | WS_VISIBLE | BS_GROUPBOX | WS_TABSTOP | WS_GROUP, 0, 50, 220, 200, hWndMainWindow, (HMENU)++id, NULL, NULL); 
HWND g2 = CreateWindowEx(WS_EX_CONTROLPARENT, L"button", L"Group2", WS_CHILD | WS_VISIBLE | BS_GROUPBOX | WS_TABSTOP | WS_GROUP, 260, 50, 220, 200, hWndMainWindow, (HMENU)++id, NULL, NULL); 

(als Nebenwirkung scheint es falsch Ihre Fenster Kinder der groupbox machen Sie müssen nicht sein - man kann sie in ihm nur die Position, sondern sie Geschwister davon machen statt Die Groupbox wurde speziell dafür entwickelt, so zu arbeiten - ich weiß nicht wie lle es wird mit den Steuerelementen als Kinder funktionieren.)

+0

Danke, es hat funktioniert. – SaeidMo7

1

Da Sie ein Dialogfeld nicht erstellen, sollte Ihr Hauptfenster mit dem WS_EX_CONTROLPARENT Stil erstellt werden.

Stellen Sie sicher, dass Sie nur diesen Stil in Ihrem Hauptfenster platzieren. Die untergeordneten Fenster sollten diesen Stil nicht verwenden.

+0

Ich habe WS_EX_CONTROLPARENT Stil nur für das Hauptfenster verwendet und die anderen Steuerelemente haben nicht diesen Stil, aber es funktioniert noch nicht. – SaeidMo7

+1

@ SaeidMo7 Verwenden Sie [CreateWindowEx] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms632680 (v = vs.85) .aspx), um die erweiterten Fensterstile (erster Parameter) zu verwenden), sie werden nicht auf 'CreateWindow' funktionieren. – BeyelerStudios

+1

Es ist nicht das Hauptfenster, das es benötigt, sondern die zwei untergeordneten Fenster, die" Gruppe 1 "und" Gruppe 2 "hosten. –

Verwandte Themen