如何在 Tab 控件中显示子对话框?
Posted
技术标签:
【中文标题】如何在 Tab 控件中显示子对话框?【英文标题】:How to show child dialog inside Tab control? 【发布时间】:2012-12-08 08:55:24 【问题描述】:WM_INITDIALOG 和 WM_NOTIFY 代码段。
HWND hTabCtrl = nullptr;
HWND hCurrentTab = nullptr;
HWND hTab1 = nullptr;
LRESULT CALLBACK WINPROC(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
hTabCtrl = GetDlgItem(hWnd, IDC_TAB1);
g_hWnd = hWnd;
ShowWindow(hTab1, SW_SHOW);
switch(uMsg)
case WM_INITDIALOG:
//hInstance = 0; // Useless?
INITCOMMONCONTROLSEX ix;
ix.dwSize = sizeof(INITCOMMONCONTROLSEX);
ix.dwICC = ICC_TAB_CLASSES|ICC_UPDOWN_CLASS;
InitCommonControlsEx(&ix);
//ShowWindow(hTabCtrl, SW_SHOW);
TCITEM ti;
memset(&ti, 0, sizeof(ti));
ti.mask = TCIF_TEXT;
ti.pszText = L"Basic Options";
ti.cchTextMax = 255;
TabCtrl_InsertItem(hTabCtrl,0,&ti); //
ti.pszText = L"Antis";
TabCtrl_InsertItem(hTabCtrl,1,&ti);
TabCtrl_SetCurSel(hTabCtrl,0);
hTab1 = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DLG2), /*handle of the tab control*/ hTabCtrl, (DLGPROC)GeneralDlgPrc);
break;
// Macro so you don't need the crazy styled cast.
case WM_NOTIFY:
switch( ( ( LPNMHDR ) lParam) -> code )
case TCN_SELCHANGE:
if( TabCtrl_GetCurSel( ( ( LPNMHDR ) lParam) -> hwndFrom ) == 0 )
ShowWindow( hTab1, SW_SHOW );
else
break;
我试过这样,它没有出现。它覆盖了选项卡边框之一,因此它应该存在,但它在表单控件上不可见。
截图如下:http://puu.sh/1yt1b
编辑:可以,但是位置不对,我应该手动设置位置吗?
【问题讨论】:
Add Controls To Specific Tab Page in TabControl in C++ Win32的可能重复 查看这个答案,它提供了在选项卡控件中使用对话框的详尽示例。 ***.com/a/53108864/1466970 【参考方案1】:我只需要使用 SetWindowPos() 来设置我的无模式对话框的当前位置。
【讨论】:
【参考方案2】:您应该在资源文件中定义控件的初始 x/y 偏移量,而不是使用会让您付出运行时成本的 SetWindowPos
。您使用的资源编辑器应该允许这样做。
【讨论】:
以上是关于如何在 Tab 控件中显示子对话框?的主要内容,如果未能解决你的问题,请参考以下文章
VC6.0中基于对话框的MFC EXE中的Tab Control控件如何使用???
MFC中如何实现Tab控件里子对话框里的控件跟着对主话框伸缩而改变位置