更改编辑控件的背景色的困难

Difficulties in changing the background color of edit control

本文关键字:背景色 控件 编辑      更新时间:2023-10-16

我在一个对话框中拥有编辑控件,该对话框的输入将被检查是否有效。

如果输入无效,我应该通过更改编辑控件的背景色来指示有效性,否则我什么都不做

我正在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_MYEDITWM_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