首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设置对话框的所有者(或父)?

如何设置对话框的所有者(或父)?
EN

Stack Overflow用户
提问于 2020-12-14 23:14:47
回答 1查看 153关注 0票数 2

我有六个窗口都可以生成一个对话框。对话框需要知道六个窗口中哪个生成了它。我相信我应该能够从对话框中调用GetParent(hWnd)或GetWindow(hWnd,GW_OWNER),但这两个调用都返回整个项目窗口,而不是传递给DialogBox()的第三个arg。

下面是生成对话框的代码(所有六个窗口共享相同的wndproc函数),以及一些printf调试:

代码语言:javascript
复制
        case ID_SETTINGS_BUTTON:
            OutputDebugStringA("hWnd from Caller to DialogBox: ");
            char buffer[128];
            GetClassNameA(hWnd, buffer, 128);
            OutputDebugStringA(buffer);
            OutputDebugStringA("\n");
            DialogBox(hInst, MAKEINTRESOURCE(IDD_PORTSETTINGS), hWnd, portSettingsProc);
            break;

下面是对话框proc开头的代码:

代码语言:javascript
复制
INT_PTR CALLBACK portSettingsProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
    switch (message) {
    case WM_INITDIALOG:
        for (int k = 0; k < PaneInfo::BAUDRATE_I_COUNT; k++)
            SendDlgItemMessage(hWnd, IDC_PORTSETTINGS_BAUDRATE, CB_ADDSTRING, 0, (LPARAM)PaneInfo::BAUDRATE_NAME_ARR[k]);
        for (int k = 0; k < PaneInfo::DATABITS_I_COUNT; k++)
            SendDlgItemMessage(hWnd, IDC_PORTSETTINGS_DATABITS, CB_ADDSTRING, 0, (LPARAM)PaneInfo::DATABITS_NAME_ARR[k]);
        for (int k = 0; k < PaneInfo::STOPBITS_I_COUNT; k++)
            SendDlgItemMessage(hWnd, IDC_PORTSETTINGS_STOPBITS, CB_ADDSTRING, 0, (LPARAM)PaneInfo::STOPBITS_NAME_ARR[k]);
        for (int k = 0; k < PaneInfo::PARITY_I_COUNT; k++)
            SendDlgItemMessage(hWnd, IDC_PORTSETTINGS_PARITY, CB_ADDSTRING, 0, (LPARAM)PaneInfo::PARITY_NAME_ARR[k]);
        OutputDebugStringA("GetParent(hWnd): ");
        char buffer[128];
        GetClassNameA(GetParent(hWnd), buffer, 128);
        OutputDebugStringA(buffer);
        OutputDebugStringA("\n");

        OutputDebugStringA("GetWindow(hWnd, GW_OWNER): ");
        GetClassNameA(GetWindow(hWnd, GW_OWNER), buffer, 128);
        OutputDebugStringA(buffer);
        OutputDebugStringA("\n");
        ...

下面是定义对话框的代码:

代码语言:javascript
复制
IDD_PORTSETTINGS DIALOGEX DISCARDABLE 0, 0, 200, 200
STYLE DS_CENTER | DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION
CAPTION "Port Settings"
FONT 8, "MS Shell Dlg"
BEGIN
LTEXT           "BaudRate:", IDC_STATIC, 10, 6, 100, 14
COMBOBOX        IDC_PORTSETTINGS_BAUDRATE, 10, 20, 180, 60, CBS_DROPDOWNLIST
LTEXT           "DataBits:", IDC_STATIC, 10, 40, 100, 14
COMBOBOX        IDC_PORTSETTINGS_DATABITS, 10, 54, 180, 60, CBS_DROPDOWNLIST
LTEXT           "StopBits:", IDC_STATIC, 10, 74, 100, 14
COMBOBOX        IDC_PORTSETTINGS_STOPBITS, 10, 88, 180, 60, CBS_DROPDOWNLIST
LTEXT           "Parity:", IDC_STATIC, 10, 108, 100, 14
COMBOBOX        IDC_PORTSETTINGS_PARITY, 10, 122, 180, 60, CBS_DROPDOWNLIST
DEFPUSHBUTTON   "OK", IDOK, 80, 180, 50, 14
PUSHBUTTON      "Cancel", IDCANCEL, 140, 180, 50, 14
END

以下是我的printf语句的输出:

代码语言:javascript
复制
hWnd from Caller to DialogBox: PaneClass
GetParent(hWnd): WINDOWSPROJECT2
GetWindow(hWnd, GW_OWNER): WINDOWSPROJECT2
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-14 23:27:46

这两个调用都返回整个项目窗口,而不是传递给DialogBox的第三个arg。

对话框的所有者必须是重叠窗口或弹出窗口.如果OP的六个窗口是子窗口,那么传递给DialogBoxDialogBox将被用来定位一个合格的祖先作为所有者使用,大概是主窗口。

来自拥有Windows文档:

只有重叠或弹出窗口可以是所有者窗口;子窗口不能是所有者窗口。..。hwndParent参数必须标识重叠或弹出窗口.如果hwndParent标识子窗口,则系统将所有权分配给子窗口的顶层父窗口。 对话框和消息框默认为自有窗口。

如果调用DialogBox的发起人窗口必须为对话框所知,那么该信息必须以其他方式单独传递。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65297871

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档