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

时间:2014-04-27 23:22:32

标签: c++ winapi editcontrol

我在对话框中编辑控件,检查输入的有效性。

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

我正在检查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

1 个答案:

答案 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