Элемент редактирования не полностью перекрашен выбранной кистью

У меня есть контроль редактирования, цвет фона которого зависит от достоверности ввода пользователя.

Если введенные данные действительны, элемент управления должен сохранять внешний вид по умолчанию, в противном случае цвет фона должен измениться на светло-серый.

Я проверяю действительность в EN_UPDATE обработчик, и если он недействителен, я храню HWND элемента управления редактирования в vector,

Визуальные стили включены.

Проблема возникает, когда я меняю положение указателя мыши. Позвольте мне описать это:

  1. Я нажимаю на элемент управления и введите неправильный ввод.

  2. Я перемещаю указатель мыши в другое место, но контроль редактирования все еще имеет фокус.

  3. Теперь я удаляю неверный ввод нажатием возврат на одну позицию.

  4. Как только ввод вступит в силу, цвет изменится правильно, но границы становятся толще / темнее.

Эти картинки иллюстрируют проблему:

Редактировать контроль перед вводом данных: введите описание изображения здесь

Изменить элемент управления, когда пользователь вставляет неверные данные (указатель мыши в серой зоне ): введите описание изображения здесь

Последний символ r,

Теперь, если указатель мыши находится вне клиентской области элемента управления редактирования (например, в клиентской области диалога) и пользователь удаляет r вот что я получаю: введите описание изображения здесь

Обратите внимание на более толстую границу.

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

Вот соответствующие фрагменты кода (при необходимости я могу отправить небольшой SSCCE ):

// minimal code snippet for EN_UPDATE
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case IDC_MYEDIT:
{
if( HIWORD(wParam) == EN_CHANGE )
{
if( /* invalid input */ )
{
// store HWND into vector

}
// InvalidateRect(...); // tried this too...
}
}
break;

// minimal code snippet for WM_CTLCOLOREDIT
case WM_CTLCOLOREDIT:
{
if( /* this control is stored in vector */ )
{
//=== then this is invalid entry->paint it grey ===//

// Needed SetBkMode for text's background transparency
SetBkMode( (HDC)wParam, TRANSPARENT );
// return light gray brush
return (INT_PTR)( (HBRUSH)GetStockObject( LTGRAY_BRUSH ) );
}
else
return DefWindowProc( ... );  // default processing
}

Как я могу это исправить?

2

Решение

Я нашел решение своей проблемы. Я только добавил RedrawWindow вместо InvalidateRect и заказал кадр, который будет также перерисован:

// minimal code snippet for EN_UPDATE
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case IDC_MYEDIT:
{
if( HIWORD(wParam) == EN_CHANGE )
{
if( /* invalid input */ )
{
// store HWND into vector

}

// after finishing validation, redraw window INCLUDING THE FRAME
// This solves the problem with edges entirely

RedrawWindow( (HWND)lParam, NULL, NULL,
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE );
}
}
break;
0

Другие решения

Пожалуйста, попробуйте обработать случай для сообщения CTLCOLOR_MSGBOX также. Обратитесь к этой статье MSDN для более подробной информации.

Как изменить цвет фона элемента управления MFC

Снимок примера кода приведен в ссылке

  case CTLCOLOR_EDIT:
case CTLCOLOR_MSGBOX:
// Set color to green on black and return the background
brush.
pDC->SetTextColor(RGB(0, 255, 0));
pDC->SetBkColor(RGB(0, 0, 0));
return (HBRUSH)(m_pEditBkBrush->GetSafeHandle());
-1

По вопросам рекламы [email protected]