У меня есть контроль редактирования, цвет фона которого зависит от достоверности ввода пользователя.
Если введенные данные действительны, элемент управления должен сохранять внешний вид по умолчанию, в противном случае цвет фона должен измениться на светло-серый.
Я проверяю действительность в EN_UPDATE
обработчик, и если он недействителен, я храню HWND
элемента управления редактирования в vector
,
Визуальные стили включены.
Проблема возникает, когда я меняю положение указателя мыши. Позвольте мне описать это:
Я нажимаю на элемент управления и введите неправильный ввод.
Я перемещаю указатель мыши в другое место, но контроль редактирования все еще имеет фокус.
Теперь я удаляю неверный ввод нажатием возврат на одну позицию.
Как только ввод вступит в силу, цвет изменится правильно, но границы становятся толще / темнее.
Эти картинки иллюстрируют проблему:
Редактировать контроль перед вводом данных:
Изменить элемент управления, когда пользователь вставляет неверные данные (указатель мыши в серой зоне ):
Последний символ 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
}
Как я могу это исправить?
Я нашел решение своей проблемы. Я только добавил 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;
Пожалуйста, попробуйте обработать случай для сообщения 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());