对话框和创建对话框之间的不同行为不被理解



我正在 DLL 中创建一个对话框,虽然 DialogBox 创建了它 - 但似乎很难以编程方式停止,CreateDialog 只显示对话框的边框(和标题(,并且在创建后"没有响应">

我正在向现有程序添加一些功能 - 不受我的控制。对于某些外部设备,控制此附加功能需要用户执行一些特定于此设备的设置的设置,主程序中的控件未涵盖这些设置。为此,我添加一个带有小对话框的 DLL,一个带有三个控制元素的 DLL。对话框由 DialogBox 函数在单独的线程和功能中启动,除了终止之外:主程序的使用可能希望从一个设备切换到另一个设备,而不必通过触摸对话框上的某些按钮或控件来明确退出对话框。 因此,我认为最好使用CreateDialog,因为它提供了一个句柄。 但是,当这样做时 - 当然添加 ShowWindow(句柄,WS_SHOW(以使对话框可见,仅显示原始小部件,没有控件可见并且遭受"不响应"的困扰

`   //  DialogBox (hInstance,`
`    widgetHandle = CreateDialog (hInstance,`
`                        MAKEINTRESOURCE(IDD_DIALOG1), NULL, ialog1Proc);`
`    err     = GetLastError ();`
`    fprintf (stderr, "Last Error = %dn", err);`
`       if (err == 0) {`
`          ShowWindow (widgetHandle, SW_SHOW);`
`          while (running)`
`             Sleep (100);`
`       }`

由于 - 使用 CreateBox 时,小部件的轮廓 - 以及对话框的标题 - 是可见的,我假设资源被正确看到, 但它就是这样无法使用的。 因此有两个问题 一个。我假设 CreateBox 可以在 DLL 中的线程中使用是错误的吗 b.我完全愿意在这里使用 DialogBox,但是我需要一些关于如何以编程方式终止对话框(框(的建议,即从 DLL 中的其他地方终止。 任何帮助将不胜感激

DialogBox创建自己的消息循环,并且在对话框关闭之前不会返回。它本质上是CreateDialog+ 消息循环。

CreateDialog在创建窗口后返回,它希望您为其处理消息。

HWND hDlg = CreateDialog(...);
ShowWindow(hDlg, SW_SHOW);
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
if (!IsWindow(hDlg)) break;
if (IsDialogMessage(hDlg, &msg)) continue;
TranslateMessage(&msg); 
DispatchMessage(&msg);  
}

如果您的唯一要求是能够从不同的线程关闭对话框,您也可以使用DialogBox将其拉开:

HWND g_hDlg = 0; // Assumes you only have one dialog instance open at the time
.. MyDlgProc(HWND hDlg, UINT Msg, ..)
{
switch(Msg)
{
case WM_INITDIALOG:
g_hDlg = hDlg;
return TRUE;
case WM_DESTROY:
g_hDlg = 0;
break;
case WM_CLOSE:
EndDialog(hDlg, 0);
break;
}
return FALSE;
}
EXTERN_C void WINAPI CloseDialog()
{
if (g_hDlg) SendMessage(g_hDlg, WM_CLOSE, 0, 0);
}

最新更新