我在一个对话框中有编辑控件,该对话框中的输入被检查是否有效。
如果输入无效,我应该通过更改编辑控件的背景颜色来指示有效性,否则我不应该做任何事情。
我正在检查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...