c++ - 对话窗口内的子对话窗口

标签 c++ c winapi dialog childwindow

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

enter image description here

问题是它们都是不可见的。它们的大小已按照 Spy++ 的指示进行了调整。 即使我使用 ShowWindow 和 UpdateWindow,也无济于事。

这是我的第一个问题:

如何解决这个问题?

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

enter image description here

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

现在第二个问题:

我的代码是实现此类工作的正确方法吗?


更新 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. 如何(应该使用什么标志)使子对话框无缝地适应父对话框?这意味着:没有标题栏,没有边框......等等。 (在创建子对话框后使用 SetWindowLongWS_BORDER ?或者对话框的特定内容?)

  2. 父对话框的确定​​按钮不再起作用。如何解决这个问题?我不明白如何管理这个父子对话案例中的对话过程。有什么引用资料吗?


这是我的代码:

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_CONTROL 样式(而不是 WS_CHILD)。这告诉窗口管理器您正在将对话框创建为子窗口而不是真正的弹出对话框。您还必须使用 CreateDialog 或其变体之一而不是 DialogBox 来创建子项(根据 Raymond 的评论)。

更多信息在这里:https://devblogs.microsoft.com/oldnewthing/20040730-00/?p=38293

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

关于c++ - 对话窗口内的子对话窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14092795/

相关文章:

security - 如果从 Windows 8 RTM 中设置的提升进程和非默认浏览器运行,ShellExecute 会失败

c++ - 从 Win32 C++ 程序上传文件到 OneDrive(SkyDrive)

c++ - 用于编译 HDF5 的 CMakelists.txt?

c++ - Bison 风格 : is using my own stack bad? 全局变量不好吗?

c++ - 促进类(class)交流c++

c++ - 为什么 Visual Studio 正在删除我的反斜杠字符串

c++ - SQLite C++ 按名称访问列

c - 具有相同参数的相同函数会产生不同的结果

c - 如何将字符串的一部分复制到另一个变量?

wpf - 确保 WPF 窗口始终位于顶部,即使用户单击另一个最大化的应用程序也是如此