【问题标题】:How to call CDialog::DoModal() with modified DLGTEMPLATEEX如何使用修改后的 DLGTEMPLATEEX 调用 CDialog::DoModal()
【发布时间】:2016-06-24 17:48:59
【问题描述】:

我知道我可以使用DLGTEMPLATEEX 在内存中使用DialogBoxIndirectParam 模板创建一个对话窗口。

但是使用 MFC,我可以在调用 DoModal 之前动态修改 CDialog 中的 DLGTEMPLATEEX 吗?

【问题讨论】:

  • 理论上你可以重载CDialog::DoModal,这就是MFC加载对话框模板的地方。我想我前段时间玩过这个并设法改变了对话框模板中的一些东西,但我放弃了它,因为它太复杂了。您想做哪些简单 API 无法完成的事情?
  • 从您链接的文档中:“要从内存中的模板构造模式对话框,首先调用无参数、受保护的构造函数,然后调用 InitModalIndirect。”

标签: c++ windows mfc modal-dialog


【解决方案1】:

我让它工作了。事实证明,MFC 有自己的未记录类:CDialogTemplate。我发现this page 使用以下代码设置字体及其大小。然后可以通过CDialogTemplate类方法中的逻辑访问DLGTEMPLATEEX——使用调试器进入SetFont方法:

#include <afxpriv.h>        //Needed for CDialogTemplate

int CSimpleDialog::DoModal()
{
    CDialogTemplate dlt;
    int nResult;

    // load dialog template
    if (!dlt.Load(MAKEINTRESOURCE(CSimpleDialog::IDD))) {
        return -1;
    }

    // set your own font, for example “Arial”, 10 pts.
    dlt.SetFont("Arial", 10);

    // get pointer to the modified dialog template
    LPSTR pdata = (LPSTR)GlobalLock(dlt.m_hTemplate);

    // let MFC know that you are using your own template
    m_lpszTemplateName = NULL;
    InitModalIndirect(pdata);

    // display dialog box
    nResult = CDialog::DoModal();

    // unlock memory object
    GlobalUnlock(dlt.m_hTemplate);

    return nResult;
}

【讨论】:

    猜你喜欢
    • 2019-12-08
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多