【问题标题】:Catching EM_SETCHARFORMAT and modifying the CHARFORMAT data in EN_PROTECTED捕获 EM_SETCHARFORMAT 并修改 EN_PROTECTED 中的 CHARFORMAT 数据
【发布时间】: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

标签: mfc winapi


【解决方案1】:

如何分配新对象而不发生内存泄漏?

我不确定重新分配 lParam 是否会起作用,但由于窗口过程不必担心在多个线程上被调用,因此您可以安全地将 lParam 指向静态变量。这样你就不必担心释放它。

case EM_SETCHARFORMAT:
    {
    static CHARFORMAT mycf;
    CHARFORMAT *cf = reinterpret_cast<CHARFORMAT *>(pEP->lParam);
    mycf = *cf;
    pEP->lParam = (LPARAM)(LONG_PTR)&mycf;
    cf->dwEffects |= (CFE_PROTECTED | CFE_ITALIC); 
    cf->dwMask |= (CFM_PROTECTED | CFM_ITALIC);
    *pResult = 0; 
    }
    break;

但是,我真的不认为这会解决您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多