如何使用修改后的 DLGTEMPLATEEX 调用 CDialog::DoModal()

Posted

技术标签:

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

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

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

【问题讨论】:

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

【讨论】:

以上是关于如何使用修改后的 DLGTEMPLATEEX 调用 CDialog::DoModal()的主要内容,如果未能解决你的问题,请参考以下文章

如何取到修改后的Textarea的值

如何修改从java传递给jni的int参数

在修改后的异常上使用 `throw;`

如何使用 apktool 在 Mac 上签署修改后的 apk

如何保存修改后的 AMI?

如何升级到 C# 5.0?访问修改后的闭包