如何在 Win32 API 的对话框中显示自定义消息?
Posted
技术标签:
【中文标题】如何在 Win32 API 的对话框中显示自定义消息?【英文标题】:How to show custom messages in a dialog box in Win32 API? 【发布时间】:2013-09-17 10:10:59 【问题描述】:如何在 Win32 API 中使用对话框显示自定义消息,而不是在默认的MessageBox
函数中显示它们?
我做了一个函数如下:
void DialogBox_Custom (HWND hWndParent, LPSTR contentToShow)
HWND hDialog = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_DIALOG1), hWndParent, DialogProc);
if (!IsWindowVisible(hDialog))
ShowWindow(hDialog, SW_SHOW);
SetDlgItemText(hDialog, IDC_EDIT1, contentToShow);
但是当我调用这个函数时,对话框就像每秒出现数百万次一样,直到我强制关闭程序才结束。
请有人帮我制作一个自定义对话框,我可以在其中显示一些从父窗口发送到对话框中的EDIT
控制窗口的内容。
【问题讨论】:
【参考方案1】:使用DialogBoxParam
函数创建模态(暂停执行直到窗口关闭)对话框。
DialogBoxParam(instance, MAKEINTRESOURCE(IDD_YOURDIALOG), hWndParent, YourWndProc, (LPARAM)contentToShow);
然后您必须创建一个函数 YourWndProc 来处理要绘制的消息并提供关闭窗口的机制,以便在您的 DialogBox() 调用后继续执行。
INT_PTR CALLBACK YourWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
switch (message)
case WM_INITDIALOG:
SetDlgItemText(hDlg, IDC_EDIT1, (LPSTR)lParam);
return (INT_PTR)TRUE;
case WM_CLOSE:
EndDialog(hDlg, LOWORD(wParam));
break;
return DefWindowProc(hDlg, message, wParam, lParam);
【讨论】:
如果对话框中有按钮,则要处理按钮,请使用消息类型 WM_COMMAND、BN_CLICKED 通知代码以及资源中按钮的 ID,然后只需调用 EndDialog()再次【参考方案2】:在 winprog.org 上查看 this tutorial。步骤是:
-
为您的自定义对话框创建一个资源文件。添加将包含消息的 CTEXT 或 LTEXT 控件。
为其编写一个对话过程。您可以使用 WM_INITDIALOG 中的 SetDlgItemText 设置消息,即 CTEXT 控件的文本。
通过调用 DialogBox 打开对话框。
【讨论】:
【参考方案3】:模态对话框类似于MessageBox
:当对话框关闭时,您的代码会重新获得控制权。 API:DialogBox
,DialogBoxIndirect
。
无模式对话框类似于窗口:您在对话框模板的帮助下创建它们并立即获得控制权,它们由消息分发提供支持。这就是你所做的,但你希望它们表现得好像它们是模态的。 API:CreateDialog
,CreateDialogIndirect
。
无论是模态对话框还是非模态对话框,您都可以使用自己的DialogProc
控制对话框,并使用资源对话框模板创建对话框,该模板会自动创建控件(当然,您可以在代码中添加控件)。
【讨论】:
以上是关于如何在 Win32 API 的对话框中显示自定义消息?的主要内容,如果未能解决你的问题,请参考以下文章
在 MSVC 中有 MFC 自定义控件(设计时)之类的东西,有没有 win32 自定义控件之类的东西?