我在对话框中编辑控件,检查输入的有效性。
我应该通过更改编辑控件的背景颜色来指示有效性如果输入无效,否则我什么都不做。
我正在检查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
的{{1}}处理程序中,则问题似乎消失了:
IDC_MYEDIT
答案 0 :(得分:4)
错误在这里
else
return FALSE; // say we didn't handle it
// so dialog procedure can do that for us
WM_CTLCOLOREDIT
消息列为one of the special exceptions to the rule,返回FALSE
表示&#34;未处理&#34;。必须处理它。如果您不想处理它,可以将邮件传递给DefWindowProc
。