如何使用修改后的 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()的主要内容,如果未能解决你的问题,请参考以下文章