我正在 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);
}