如何在 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:DialogBoxDialogBoxIndirect

无模式对话框类似于窗口:您在对话框模板的帮助下创建它们并立即获得控制权,它们由消息分发提供支持。这就是你所做的,但你希望它们表现得好像它们是模态的。 API:CreateDialogCreateDialogIndirect

无论是模态对话框还是非模态对话框,您都可以使用自己的DialogProc 控制对话框,并使用资源对话框模板创建对话框,该模板会自动创建控件(当然,您可以在代码中添加控件)。

【讨论】:

以上是关于如何在 Win32 API 的对话框中显示自定义消息?的主要内容,如果未能解决你的问题,请参考以下文章

怎样用win32 API函数弹出对话框

在 MSVC 中有 MFC 自定义控件(设计时)之类的东西,有没有 win32 自定义控件之类的东西?

如何用纯Win32 API写模态窗口?

Win32API:如何向父窗口请求嵌入式 Windows 事件通知

自定义编辑控件win32

VC++ win32 application里如何建一个子窗口