如何将对话框(从资源文件)添加到选项卡

时间:2013-07-09 19:48:14

标签: c winapi tabs

我的任务是对一个特定程序的用户界面进行一些修改。部分原因是我正在向特定对话框添加更多信息。为了让它看起来更好,我认为使用标签界面会更好。目前,该程序中的所有布局都在资源(.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....

关于我可以在这些内容上阅读更多内容的任何建议将不胜感激。此外,如果我的方法中的任何内容似乎完全错误,请随时告诉我为什么会这样。

2 个答案:

答案 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)获取其句柄。