2016-03-22 13 views
0

明らかに、私はwin32でコーディングしていて、MFC、wxWidgets、または.netを使用していません。タブコントロールの子ウィンドウの非表示/表示Win32

私の問題は、2つのタブを持つタブコントロールがあることです。デバッグの目的で、各タブには単一のSTATICウィンドウがあります。初期化すると、次のコードが実行されます。WndProc

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); 
} 

、私はWM_NOTIFYメッセージを処理しています

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

。私は、適切な機能(ShowTab1()ShowTab2())を呼び出して、正しく実行されていることを確認して確認できます。

これら2つの機能は、選択が変更されたときに適切なタブを表示および非表示にするように設計されています。彼らは次のようにします:

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

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

これらは、私が理解するように適切なタブを隠して表示する必要があります。

私の問題は、プログラムがロードされるときに、正しいタブ(1)が表示されることです。タブ2をクリックすると、タブ1(Task1Tab)の内容は正しく隠されますが、タブ2(Task2Tab)の内容は正しく表示されません。タブ1に戻ると、Task1Tabが正しく表示されます。

2つのコードが実質的に同一であるため、2つのコードに違いがある理由はわかりません。

nb。初期設定でShowWindow(Task1Tab, SW_SHOW)のコードをテストしましたが、これはコンテンツなしでタブを作成し、タブ2をクリックすると何も表示されませんが、タブ1をクリックすると、Task1Tabが正しく表示されます。

+0

あなたは決して 'CreateStaticViewTab2'を呼び出しません。 'CreateStaticViewTab1'を2回呼び出します。 'Task2Tab'は決して割り当てられません。あるいは、このコードは偽造ですか?私のアドバイスは、[mcve]を作り、私たちがあなたと同じコードを見ているという自信を持っています。 –

+0

いいえ、あなたは完全です。おっとっと! –

+1

また、 'TCHAR'の使用を中止する時もあります。あなたのコードはUnicodeをターゲットにしています。 'wchar_t'を使います。コードがANSIを対象とすることはできません。できない。 –

答えて

1

あなたは一部の日常的なコピー/ペーストエラーによってキャッチされたようです。 CreateStaticViewTab1を2回呼び出し、CreateStaticViewTab2に決して電話することはありません。 CreateStaticViewTab1CreateStaticViewTab2の両方がTask1Tabに割り当てられます。これらの間違いはあなたが観察する行動を説明するでしょう。

コードがエラーチェックを実行していた場合は、問題が発生していました。エラーをチェックすると、無効なウィンドウハンドルのためにShowWindow(Task2Tab, ...)が失敗していることが明らかになりました。だから、もう一つの重要な教訓は、クリップボードを気にすること以外に、Windows API関数を呼び出すときに常にエラーをチェックすべきであるということです。

0

明らかな問題 - CreateStaticViewTab2()は決して呼び出されませんでした。

関連する問題