我的任务是对一个特定程序的用户界面进行一些修改。部分原因是我正在向特定对话框添加更多信息。为了让它看起来更好,我认为使用标签界面会更好。目前,该程序中的所有布局都在资源(.rc)文件中完成。
我一直在阅读带有标签的对话框,我相信这是通过为每个标签创建一个对话框布局(没有边框和'子'样式),然后根据选择的标签显示布局来完成的。我的问题是我无法找到任何关于如何实际执行此操作的良好文档/示例。
一些代码:
//create the main dialog from WndProc - no problem here
DialogBox(hInst, (char*)IDD_DIALOG_MAIN, hWnd, MainDlgProc);
对话代码:
HWND hTab;
BOOL CALLBACK MainDlgProc(HWND hDlg, UINT Message, WPARAM wParam, LPARAM lParam)
{
TCITEM titem;
switch (Message) {
case WM_INITDIALOG:
//create tab control
//I didn't use a tabcontrol in the resource file because I could not figure out how to get a handle for it
hTab = CreateWindow(WC_TABCONTROL, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE,
30, 30, 400, 550, hDlg,(HMENU) ID_TABCTRL, hInst, NULL);
//add a couple of tabs
titem.mask = TCIF_TEXT;
titem.pszText = "Tab1";
TabCtrl_InsertItem(hTab, 0, &titem);
titem.pszText = "Tab2";
TabCtrl_InsertItem(hTab, 1, &titem);
//add content to tabs using dialog resource IDs???
//Obviously this doesn't work. It doesn't even point to which tab the content should be on
//CreateDialog(hInst,IDD_DIALOG_MAIN_TAB1, hTab, Tab1DlgProc);
//CreateDialog(hInst,IDD_DIALOG_MAIN_TAB2, hTab, Tab2DlgProc);
//EDIT: See my answer below for how I placed the dialogs in the tabs
//etc....
关于我可以在这些内容上阅读更多内容的任何建议将不胜感激。此外,如果我的方法中的任何内容似乎完全错误,请随时告诉我为什么会这样。
答案 0 :(得分:3)
我最终找到了这个页面:How to Create a Tabbed Dialog。
由此我学会了使用类似于:
的代码加载每个选项卡的对话框资源DLGTEMPLATEEX *apRes[N_TABS];
apRes[0] = DoLockDlgRes(MAKEINTRESOURCE(IDD_FIRSTDLG));
apRes[1] = DoLockDlgRes(MAKEINTRESOURCE(IDD_SECONDDLG));
使用
DLGTEMPLATEEX* DoLockDlgRes(LPCTSTR lpszResName)
{
HRSRC hrsrc = FindResource(NULL, lpszResName, RT_DIALOG);
// Note that g_hInst is the global instance handle
HGLOBAL hglb = LoadResource(g_hInst, hrsrc);
return (DLGTEMPLATEEX *) LockResource(hglb);
}
然后使用
加载对话框int currentSlectedTabIndex = 0;
HWND hSelectedTab;
VOID OnSelChanged(HWND hDlg)
{
//get tab control
HWND hTab = GetDlgItem(hDlg, IDC_TAB1);
// Get the index of the selected tab.
currentTabIndex = TabCtrl_GetCurSel(hTab);
// Destroy the current child dialog box, if any.
if (hSelectedTab != NULL)
DestroyWindow(hSelectedTab);
// Create the new child dialog box
hSelectedTab = CreateDialogIndirect(hInst, apRes[currentTabIndex], hDlg, TabDlgProc);
return;
}
TabDlgProc
负责在选项卡中调整对话框的大小和位置。
要检查选项卡是否已切换,请检查TCN_SELCHANGE的WM_NOTIFY消息
case WM_NOTIFY:
switch ( ((LPNMHDR)lParam)->code ) {
case TCN_SELCHANGE:
OnSelChanged(hDlg); //change tab
break;
}
break;
答案 1 :(得分:2)
你走在正确的轨道上。创建子对话框后,您必须调整大小并将它们放在选项卡控件上。你可以使用MoveWindow。
顺便说一句,如果选项卡控件放在资源文件中,您可以使用GetDlgItem(ID)获取其句柄。