ダイアログであるすべてのタブページは、作成されたタブの子として設定する必要があります。タブは、あなたがこのようなあなたのDialogProcで処理することができます通知メッセージが表示されます変更した場合:
case WM_NOTIFY: {
switch(((LPNMHDR) lParam) -> code) {
case TCN_SELCHANGE: {
if(TabCtrl_GetCurSel(((LPNMHDR) lParam) -> hwndFrom) == 0) {
ShowWindow(hwndPathSettings, SW_SHOW);
ShowWindow(hwndStartSettings, SW_HIDE);
} else {
ShowWindow(hwndPathSettings, SW_HIDE);
ShowWindow(hwndStartSettings, SW_SHOW);
}
break;
}
ユーザーがタブを変更したとき、あなたが見ることができるように、コードが新しいタブの子を示し、古いを隠しますもの。この場合のhwndPathSettingsとhwndStartSettingsは、子ダイアログへのウィンドウハンドルです。コンテキストにそれを置くために
は、あなたのWM_INITDIALOGであなたはおそらく、タブを設定するには、次のようないくつかのコードを持っているでしょう:
HWND hwndTab = GetDlgItem(hwndDlg, IDC_TAB);
TCITEM tci = {0};
tci.mask = TCIF_TEXT;
tci.pszText = _T("Path");
TabCtrl_InsertItem(hwndTab, 0, &tci);
tci.pszText = _T("Run on Start");
TabCtrl_InsertItem(hwndTab, 1, &tci);
hwndPathSettings = CreateDialogParam(GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_PATHSETTINGS), hwndTab, PathSettingsProc, lParam);
hwndStartSettings = CreateDialog(GetModuleHandle(NULL),
MAKEINTRESOURCE(IDD_STARTSETTINGS), hwndTab, StartSettingsProc);
break;
+1、と私はWTLを使用することをお勧め - それは、ゼロ・オーバーヘッドですWindows APIのラッパー。 – ybungalobill
いいえ、ダイアログボックスはこのコードで変更されますが、ここで使用した矛盾したコードを実際に理解していません。最初の 'hwndPathSettings'宣言は2番目とは異なる機能を使用しています。 3番目のタブにはどのような機能が使用されますか? 'if(TabCtrl_GetCurSel(((LPNMHDR)lParam) - > hwndFrom)== 0)'、それがどのフォームに変更されたかチェックするのでしょうか?なぜゼロとの比較ですか?これはもっとうまくいきません: 'if(TabCtrl_GetCurSel(GetDlgItem(hDlg、IDC_TAB2))== 0)' ..? – Rookie
2番目のコードブロックは、WM_INITDIALOGに含まれるものです。これにより、ページがタブコントロールに挿入され、子が作成されます。最初のコードブロックは、ページ内容を切り替えるタブを変更するハンドラです。既にlParamからhwndTabを取得している場合、GetDlgItemは必要ありません。 –