Перехват EM_SETCHARFORMAT и изменение данных CHARFORMAT в EN_PROTECTED - PullRequest
1 голос
/ 19 февраля 2010

Я получаю сообщение EM_CHARFORMAT в моем обработчике сообщений, когда SetFont () вызывается для моего пользовательского элемента управления. Но когда я изменяю данные в структуре CHARFORMAT, указанной в LPARAM, они не используются.

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 - указатель на объект. Как я могу выделить новый объект без утечки памяти?

1 Ответ

0 голосов
/ 20 февраля 2010

Как я могу выделить новый объект без утечки памяти?

Я не уверен, что перераспределение 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;

Однако я действительно не думаю, что это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...