Проблема с отрисовкой при обработке WM_CTLCOLOREDIT

У меня есть элемент управления редактирования, не предназначенный только для чтения, для которого мне нужно изменить цвета, поэтому я обрабатываю 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;
}

Спасибо


person joseph    schedule 31.03.2011    source источник
comment
трудно сказать, не зная, что вы делаете   -  person David Heffernan    schedule 31.03.2011
comment
@David Помогут ли детали, которые я обновил?   -  person joseph    schedule 31.03.2011
comment
Я не вижу никакой живописи.   -  person David Heffernan    schedule 31.03.2011
comment
Разве мы не должны просто вернуть кисть? Система не будет рисовать? Я думал, что мы раскрашиваем себя только в собственных элементах управления.   -  person joseph    schedule 31.03.2011
comment
return 0 приведет к отсутствию рисования   -  person David Heffernan    schedule 31.03.2011
comment
О, но даже когда я возвращаю кисть, удаление пробела и т. д. не будет правильно рисовать. Я пытался вернуть кисть всегда. В любом случае, поскольку у меня есть только один элемент управления редактированием, нулевой возврат не должен влиять.   -  person joseph    schedule 31.03.2011


Ответы (3)


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

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

person Hans Passant    schedule 31.03.2011

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

person Anders    schedule 31.03.2011

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

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

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

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

return static_cast<LRESULT>(::GetSysColorBrush(COLOR_WINDOW));
person Adrian McCarthy    schedule 31.03.2011