Сложности в изменении цвета фона элемента управления редактирования

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

Я должен указать правильность, изменив цвет фона элемента управления редактирования если ввод неверен, иначе Я ничего не должен делать.

Я проверяю вход в EN_CHANGE обработчик, и если ввод недействителен, я сохраняю дескриптор элемента редактирования в векторе. В конце я звоню InvalidateRect( (HWND)lParam, NULL, TRUE ); так что редактирование управления может быть перекрашено в нужный цвет.

Перекрасить редактирование управления я обрабатываю WM_CTLCOLOREDIT как это:

case WM_CTLCOLOREDIT:
{
bool IsInvalid = false;  // does this edit control hold invalid text ?

// vector InvalidInput contains handles of edit controls
// with invalid input, so we check if our window is stored there
for( vector<HWND>::size_type i = 0;
!IsInvalid && ( i < InvalidInput.size() ); i++ )
{
if( InvalidInput[i] == (HWND)lParam )
IsInvalid = true;
}

// if input is invalid change background color to light gray
if( IsInvalid )
{
// Needed SetBkMode for text background transparency
SetBkMode( (HDC)wParam, TRANSPARENT );
// return light gray brush
return (INT_PTR)( (HBRUSH)GetStockObject( LTGRAY_BRUSH ) );
}
else
return FALSE;   // say we didn't handle it
// so dialog procedure can do that for us
}

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

После того, как я наберу действительная запись Правка редактирования нарисована правильно.

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

Если я удаляю недопустимый символ, тогда фон остается серым вместо возврата к системному цвету по умолчанию.

Что я делаю не так и как мне это исправить?

РЕДАКТИРОВАТЬ:

Если я поставлю InvalidateRect() в моем WM_COMMAND обработчик для IDC_MYEDIT тогда проблема вроде бы исчезла

case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case IDC_MYEDIT:
{
if( HIWORD(wParam) == EN_CHANGE )
{
//do your validation stuff
}
InvalidateRect(...);
}
break;
// the rest of the code...

1

Решение

Ошибка здесь

    else
return FALSE;   // say we didn't handle it
// so dialog procedure can do that for us

WM_CTLCOLOREDIT сообщение указано как одно из особых исключений из правила что возвращение FALSE означает «не обрабатывается». Это должно быть обработано. Если вы не хотите обрабатывать это, вы можете передать сообщение DefWindowProc,

4

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector