EN_MSGFILTER, не может предотвратить распространение сообщений - PullRequest
0 голосов
/ 21 января 2010

У меня есть диалог с расширенным текстом управления. Диалог хочет перехватить события щелчка правой кнопкой мыши на элементе управления; в некоторых случаях диалог должен выполнять свои собственные функции и блокировать сообщение, поступающее к элементу управления, в других случаях он должен позволять элементу управления получать сообщение.

Итак, у меня есть:

ON_NOTIFY(EN_MSGFILTER, IDC_RICHTEXT, OnRichTextMsgfilter)

void CMyDialog::OnRichTextMsgfilter(NMHDR *pNMHDR, LRESULT *pResult)
{
    MSGFILTER *pMsgFilter = reinterpret_cast<MSGFILTER *>(pNMHDR);
    *pResult = 0;
    if (pMsgFilter->msg == WM_RBUTTONUP)
    {
        if(...)
         *pResult=1;
    }
}

Я выполняю код, и pResult устанавливается, когда это должно быть, но элемент управления все еще получает сообщение. Глядя на MSDN , он говорит:

Если элемент управления должен обрабатывать событие, сообщение возвращает ноль значение. Если контроль должен игнорировать событие, сообщение возвращает ненулевое значение.

Но определенная подпись обработчика сообщений не имеет возврата ... Я предполагаю, что это то, для чего * pResult. Разве это не правда? Если да, то как мне этого добиться?

Ответы [ 2 ]

1 голос
/ 21 января 2010

Итак, я попытался воспроизвести это поведение в простом диалоговом приложении, и я действительно не могу - однако я не уверен, что перехватывает сообщение правой кнопки, которое пытается решить.

При этом следующий код полностью блокирует щелчки левой кнопкой мыши в моем тестировании (Если это возвращает TRUE, элемент управления не реагирует на левые нажатия - однако фокус будет установлен на элемент управления при первоначальном нажатии вниз, и это больше выдача оконного менеджера, чем сам элемент управления)

void CTestDlg::OnMsgfilterRichedit1(NMHDR* pNMHDR, LRESULT* pResult) 
{
    MSGFILTER *pMsgFilter = reinterpret_cast<MSGFILTER *>(pNMHDR);

    if (pMsgFilter->msg == WM_LBUTTONUP || pMsgFilter->msg == WM_LBUTTONDOWN)
    {
        *pResult = TRUE;
        return;
    }

    *pResult = FALSE;
}

Если я изменю * pResult = TRUE на * pResult = FALSE, то левые щелчки снова начнут работать.

Возможно, вы хотите поймать и отфильтровать WM_RBUTTONDOWN, а не WM_RBUTTONUP, чтобы делать то, что вы намерены, но так как я не уверен, какие функции вы пытаетесь отфильтровать, я не могу сказать точно.

0 голосов
/ 21 января 2010

WM_RBUTTONDOWN все еще проходит ...

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