对话框窗口内的子对话框窗口

时间:2012-12-30 17:19:42

标签: c++ c winapi dialog childwindow

我想创建2个对话窗口,一个是另一个窗口的子窗口。以下是代码的一部分。 当我单击菜单项“Parent”时,它创建了2对话框并将其设置为另一个对话框的子对象,如图所示:

enter image description here

问题在于它们都是隐形的。它们的大小如Spy ++所示。 即使我使用ShowWindow和UpdateWindow,它也无济于事。

这是我的第一个任务:

How to fix this?

现在我想创建子对话框窗口的原因是:看下面的图片,

enter image description here

它有一个Preference对话框,其中包含子对话框(由黑线组成的有界矩形)。这些子对话框窗口用于对相关选项进行分组。因此,如果使用选择左侧TreeView中的项目,它会隐藏子对话框窗口并显示另一个子对话框窗口以提供不同的选项。

现在第二个问题:

Is my code is the correct way to achieve such work?


更新2:

这是解决方案!

http://msdn.microsoft.com/en-us/library/windows/desktop/ms644996%28v=vs.85%29.aspx


更新

谢谢你们。

使用CreateDialog(对于子对话)代替DialogBox(...),使用DS_CONTROL代替WS_CHILD,然后删除OK按钮(及其对应的wndproc)孩子对话,我得到了

enter image description here

我甚至可以在父对话框中移动子对话框。删除资源脚本文件中的CAPTION "Child Dialog"无效。

  1. 如何(使用什么标志)使Child Dialog无缝地适合父对话,?这意味着:没有标题栏,没有边框......等等。 (在创建子对话框后使用SetWindowLongWS_BORDER?或者特定于对话框?)

  2. 父对话框的“确定”按钮不再起作用。如何解决这个问题?我不明白如何在这个父子对话案例中管理对话框程序。对它的任何参考?


  3. 这是我的代码:

    1. Message handler for dialogs:
    
    INT_PTR CALLBACK Child(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            {
                hChild = hDlg;
                return (INT_PTR)TRUE;
            }
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
            break;
        }
        return (INT_PTR)FALSE;
    }
    
    INT_PTR CALLBACK Parent(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
    {
        UNREFERENCED_PARAMETER(lParam);
        switch (message)
        {
        case WM_INITDIALOG:
            {
                hParent = hDlg;
                DialogBox(hInst, MAKEINTRESOURCE(IDD_CHILD), hParent, Child);
                SetParent(hChild, hParent);
                return (INT_PTR)TRUE;
            }
        case WM_COMMAND:
            if (LOWORD(wParam) == IDOK)
            {
                EndDialog(hDlg, LOWORD(wParam));
                return (INT_PTR)TRUE;
            }
        break;
        }
        return (INT_PTR)FALSE;
    }
    
    2. Dialog Templates in resource file
    
    IDD_CHILD DIALOGEX 0, 0, 70, 50
    
    
    STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU
    CAPTION "Child Dialog"
    FONT 8, "MS Shell Dlg"
    BEGIN
        LTEXT           "Child Dialog",IDC_STATIC,10,5,35,8,SS_NOPREFIX
        DEFPUSHBUTTON   "OK",IDOK,10,25,50,14,WS_GROUP
    END
    
    IDD_DIALOG_PARENT DIALOGEX 0, 0, 250, 150
    STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
    CAPTION "Parent Dialog"
    FONT 8, "MS Shell Dlg"
    BEGIN
        LTEXT           "Parent",IDC_STATIC,42 - 20,14,35,8,SS_NOPREFIX
        DEFPUSHBUTTON   "OK",IDOK,188, 126,50,14,WS_GROUP
    END
    

1 个答案:

答案 0 :(得分:1)

这不是一个正确的方法。您需要在子对话框(而不是WS_CHILD)上设置DS_CONTROL样式。这告诉窗口管理器您将对话框创建为子窗口而不是真正的弹出对话框。您还必须使用CreateDialog或其变体之一而不是DialogBox来创建子项(根据Raymond的评论)。

此处有更多信息:http://blogs.msdn.com/b/oldnewthing/archive/2004/07/30/201988.aspx

对于第一个问题,我无法真正帮助你。从你提供的片段来看,你所犯的错误并不明显。