2016-03-22 9 views
0

Um klar zu sein, ich bin in Win32 codieren und verwende keine MFC, WxWidgets oder .net.Verstecken/Zeigen Kind Windows eines Tab Control Win32

Mein Problem ist, dass ich ein Tab-Steuerelement mit 2 Registerkarten habe. Zu Debugging-Zwecken verfügt jede Registerkarte über ein einzelnes STATIC-Fenster. Bei der Initialisierung wird der folgende Code ausgeführt:

createTabControl(); 
CreateStaticViewTab1(); 
CreateStaticViewTab1(); 
ShowWindow(Task1Tab, SW_SHOW); 

Wo

void createTabControl(){ 
    TCITEM tie = { 0 }; 
    hWndInputTab = CreateWindow(WC_TABCONTROL, L"Input", WS_VISIBLE | WS_CHILD , 10, 40, 300, 650, hWnd, (HMENU)TAB_INPUT, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE), NULL); 
    SetDefaultFont(hWndInputTab); 

    tie.mask = TCIF_TEXT; 

    TCHAR pszTab1[] = L"TAB 1"; 
    tie.pszText = pszTab1; 
    TabCtrl_InsertItem(hWndInputTab, 0, &tie) 

    TCHAR pszTab2[] = L"TAB 2"; 
    tie.pszText = pszTab2; 
    TabCtrl_InsertItem(hWndInputTab, 1, &tie) 
} 

void CreateStaticViewTab1(){ 

    Task1Tab = CreateWindowEx(0,L"STATIC",L"Static Control on Tab1",WS_CHILD | WS_BORDER | SS_CENTER | SS_CENTERIMAGE, 75, 75, 200, 60, hWndInputTab,NULL, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),NULL); 

    SetDefaultFont(Task1Tab); 
} 

void CreateStaticViewTab2(){ 

    Task1Tab = CreateWindowEx(0,L"STATIC",L"Static Control on Tab2",WS_CHILD | WS_BORDER | SS_CENTER | SS_CENTERIMAGE, 75, 75, 200, 60, hWndInputTab,NULL, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE),NULL); 

    SetDefaultFont(Task2Tab); 
} 

Im WndProc ich die WM_NOTIFY Nachricht am Umgang. Ich habe überprüft und kann bestätigen, dass es korrekt ausgeführt wird, die entsprechenden Funktionen (ShowTab1() und ShowTab2()) aufrufen.

Diese beiden Funktionen dienen zum Ein- und Ausblenden der entsprechenden Registerkarten, wenn sich die Auswahl ändert. Sie tun dies durch die folgende:

void ShowTab1(){ 
    ShowWindow(Task2Tab, SW_HIDE); 
    ShowWindow(Task1Tab, SW_SHOW); 
} 

void ShowTab2(){ 
    ShowWindow(Task1Tab, SW_HIDE); 
    ShowWindow(Task2Tab, SW_SHOW); 
} 

Diese sollten - wie ich es verstehe - verstecken und zeigen die richtige Tabs als angemessen.

Mein Problem ist, dass beim Laden des Programms die richtige Registerkarte (1) angezeigt wird. Wenn Tab 2 angeklickt wird, ist der Inhalt von Tab 1 (Task1Tab) korrekt ausgeblendet, der Inhalt von Tab 2 (Task2Tab) wird jedoch nicht korrekt angezeigt. Wenn Sie zu Tab 1 zurückkehren, wird Task1Tab korrekt angezeigt.

Ich kann nicht identifizieren, warum es einen Unterschied zwischen den zwei Teilen des Codes gibt, wie sie praktisch identisch sind.

nb. Ich habe den Code ohne die ShowWindow(Task1Tab, SW_SHOW) in der Initialisierung getestet, dies erstellt die Registerkarten ohne Inhalt und wenn Tab 2 geklickt wird, wird nichts angezeigt, wenn jedoch auf Tab 1 geklickt wird, wird Task1Tab korrekt angezeigt.

+0

Sie rufen niemals CreateStaticViewTab2 auf. Sie rufen 'CreateStaticViewTab1' zweimal auf. 'Task2Tab' wird niemals zugewiesen. Oder ist dieser Code gefälscht? Mein Rat, produziere einen [mcve], damit wir darauf vertrauen können, dass wir den gleichen Code wie du sehen. –

+0

Nein, Sie sind völlig richtig. Hoppla! –

+1

Es ist auch Zeit, auf 'TCHAR' zu verzichten. Ihr Code zielt auf Unicode ab. Verwende 'wchar_t'. Geben Sie nicht vor, dass Ihr Code auf ANSI ausgerichtet sein kann. Es kann nicht. –

Antwort

1

Sie scheinen von einigen Kopier-/Einfügefehlern überrascht worden zu sein. Sie rufen zweimal die Nummer CreateStaticViewTab1 an und rufen nie CreateStaticViewTab2 an. Und beide CreateStaticViewTab1 und CreateStaticViewTab2 zuweisen zu Task1Tab. Diese Fehler würden das beobachtete Verhalten erklären.

Wenn Ihr Code eine Fehlerüberprüfung durchgeführt hat, dann hätte Sie das Problem verursacht. Die Überprüfung auf Fehler hätte ergeben, dass ShowWindow(Task2Tab, ...) wegen eines ungültigen Fensterhandle fehlgeschlagen ist. Eine weitere wichtige Lektion ist, dass Sie beim Aufrufen von Windows-API-Funktionen immer nach Fehlern suchen sollten.

0

Offensichtliches Problem - CreateStaticViewTab2() wurde nie aufgerufen.

Verwandte Themen