Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对话框窗口内的子对话框窗口_C++_C_Winapi_Dialog_Childwindow - Fatal编程技术网

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

C++ 对话框窗口内的子对话框窗口,c++,c,winapi,dialog,childwindow,C++,C,Winapi,Dialog,Childwindow,我想创建两个对话框窗口,一个是另一个的子窗口。下面是代码的一部分。 当我单击菜单项“Parent”时,它创建了2对话框,并将其中一个设置为另一个的子对话框,如图所示: 问题是它们都是隐形的。它们的大小如Spy++所示。 即使我使用ShowWindow和UpdateWindow,也没有帮助 这是我的第一个问题: 如何解决此问题? 现在我想创建子对话框窗口的原因是:看下图 它有一个首选项对话框,其中包含子对话框(以黑线为边界的矩形)。这些子对话框窗口用于对相关选项进行分组。因此,如果使用“在左侧

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

问题是它们都是隐形的。它们的大小如Spy++所示。 即使我使用ShowWindow和UpdateWindow,也没有帮助

这是我的第一个问题:

如何解决此问题?

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

它有一个首选项对话框,其中包含子对话框(以黑线为边界的矩形)。这些子对话框窗口用于对相关选项进行分组。因此,如果使用“在左侧树状视图中选择项目”,则会隐藏一个子对话框窗口,并显示另一个子对话框窗口以提供不同的选项

现在是第二个问题:

我的代码是实现这些工作的正确方法吗?


更新2:

这就是解决办法


更新:

谢谢你们

使用
CreateDialog
(用于子对话框)代替
对话框(…)
,使用
DS\u控件代替
WS\u child
,并从子对话框中删除
OK
按钮(及其相应的wndproc)后,我得到了

我甚至可以在父对话框中移动子对话框。删除资源脚本文件中的
标题“子对话框”
没有帮助

  • 如何(应该使用什么标志)使子对话框与父对话框无缝匹配,?这意味着:没有标题栏,没有边框…等等。(在创建子对话框后使用
    SetWindowLong
    WS_BORDER
    ,或者在对话框中使用特殊的东西?)

  • 父对话框的“确定”按钮不再工作。如何解决这个问题?我不明白在这种父子对话的情况下如何管理对话过程。有参考资料吗


  • 这是我的密码:

    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
    

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

    更多信息请点击此处:


    关于第一个问题,我真的帮不了你。从您提供的代码片段中看不出您做错了什么。

    您需要使用
    CreateDialog
    ,而不是
    DialogBox
    <代码>对话框
    将运行它自己的模式循环。昨天有,有源代码。我明白了。但问题是,我没有看到m_ChildDialog.Create是如何实现的,所以我不知道如何在纯winapi中实现这一点。似乎源代码不会提示我必须使用DS\u控件和CreateDialog,而不是WS\u CHILD和DialogBox。但我真的很感激你的帮助。