Проблема с краской при обработке WM_CTLCOLOREDIT - PullRequest
0 голосов
/ 31 марта 2011

У меня есть не редактируемый элемент управления только для чтения, для которого мне нужно изменить цвета, поэтому я обрабатываю WM_CTLCOLOREDIT.Это работает хорошо, когда я печатаю непрерывно, но проблема в том, что, когда я нажимаю клавишу «Backspace», удаляю или даже начинаю печатать с середины существующего текста, дисплей весь не работаетЭто остается до тех пор, пока я не вызову перерисовку путем изменения размера родительского элемента и т. Д. Как это исправить?

Редактировать: Некоторые детали.Проблема возникает только тогда, когда цвет фона установлен, а не только цвет текста.Код выглядит так

ON_MESSAGE(WM_CTLCOLOREDIT, OnEditColor)

LRESULT CMyWindow::OnEditColor(WPARAM wp, LPARAM lp)
{
    HDC hdc = (HDC)wp;
    HWND hwnd = (HWND)lp;
    if(hwnd == m_edit.GetSafeHwnd())
    {
    //  SetBkMode(hdc, TRANSPARENT);
        MyControlInfo*pcti;// accessed from somewhere
        SetTextColor(hdc, pcti->theme.clrText);
    //  return (LRESULT)pcti->brush.GetSafeHandle();
    }
    return 0;
}

Спасибо

Ответы [ 3 ]

1 голос
/ 31 марта 2011

Вы должны установить цвет фона с помощью SetBkColor (и не использовать SetBkMode) и вернуть правильную кисть. (Вы не знаете, как его рисует элемент управления, можно использовать ExtTextOut с ETO_OPAQUE и т. Д.)

1 голос
/ 31 марта 2011

Я скорее сомневаюсь, что это вызвано этим кодом. Это проблема, с которой вы сталкиваетесь, когда пытаетесь создать подкласс элемента управления редактирования и переопределить рисование. Windows версии 2, работавшая на 386SUX и 20-летнем appcompat, не позволила Microsoft исправить этот элемент управления, поэтому он рисует себя только в обработчике сообщений WM_PAINT. Это действительно рисует прямо на экран, когда вы возвращаетесь. Там нет обходного пути для этого.

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

0 голосов
/ 31 марта 2011

http://msdn.microsoft.com/en-us/library/bb761691(v=vs.85).aspx

Возвращаемое значение

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

Так что попробуйте что-то вроде:

return static_cast<LRESULT>(::GetSysColorBrush(COLOR_WINDOW));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...