我在一个对话框中拥有编辑控件,该对话框的输入将被检查是否有效。
如果输入无效,我应该通过更改编辑控件的背景色来指示有效性,否则我什么都不做
我正在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()
放在IDC_MYEDIT
的WM_COMMAND
处理程序中,那么问题似乎消失了:
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
。