【发布时间】:2010-02-19 11:40:25
【问题描述】:
当在我的自定义控件上调用 SetFont() 时,我在消息处理程序中收到 EM_CHARFORMAT 消息。但是当我更改 LPARAM 中指向的 CHARFORMAT 结构中的数据时,它并没有被使用。
void CMyRichEdit::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
{
ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;
*pResult = 1;
switch(pEP->msg)
{
case EM_SETCHARFORMAT:
{
CHARFORMAT *cf = reinterpret_cast<CHARFORMAT *>(pEP->lParam);
cf->dwEffects |= (CFE_PROTECTED | CFE_ITALIC);
cf->dwMask |= (CFM_PROTECTED | CFM_ITALIC);
*pResult = 0;
}
break;
MSDN 文档说,只有当 lParam 值发生变化时,才会在原始值上使用它......但这里 lParam 是指向对象的指针。如何分配一个新对象而不发生内存泄漏?
【问题讨论】:
-
我无法理解这段代码。为什么有 NMHDR?为什么要设置 pResult?该消息需要通过默认窗口过程进行处理才能使您的更改生效。
-
不,它没有。这是工作代码。破解默认窗口进程是最后的手段。阅读 EN_PROTECTED、CRichEditCtrl::SetEventMask() 和 ON_NOTIFY_REFLECT