У меня есть контроль редактирования в диалоговом окне, вход которого проверяется на достоверность.
Я должен указать правильность, изменив цвет фона элемента управления редактирования если ввод неверен, иначе Я ничего не должен делать.
Я проверяю вход в 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...
Ошибка здесь
else
return FALSE; // say we didn't handle it
// so dialog procedure can do that for us
WM_CTLCOLOREDIT
сообщение указано как одно из особых исключений из правила что возвращение FALSE
означает «не обрабатывается». Это должно быть обработано. Если вы не хотите обрабатывать это, вы можете передать сообщение DefWindowProc
,