Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更改编辑控件背景色的困难_C++_Winapi_Editcontrol - Fatal编程技术网

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

C++ 更改编辑控件背景色的困难,c++,winapi,editcontrol,C++,Winapi,Editcontrol,我有一个对话框中的编辑控件,检查输入的有效性 如果输入无效,我应该通过更改编辑控件的背景色来指示有效性,否则我什么也不做 我正在检查EN_CHANGE handler中的输入,如果输入无效,我将编辑控件的句柄存储在向量中。最后我调用HWNDlParam,NULL,TRUE;所以编辑控件可以用适当的颜色重新绘制 要重新绘制编辑控件,我将按如下方式处理WM_CTLCOLOREDIT: case WM_CTLCOLOREDIT: { bool IsInvalid = false

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

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

我正在检查EN_CHANGE handler中的输入,如果输入无效,我将编辑控件的句柄存储在向量中。最后我调用HWNDlParam,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
    }
错误就在这里

    else     
        return FALSE;   // say we didn't handle it 
                        // so dialog procedure can do that for us
WM_CTLCOLOREDIT消息被列为返回FALSE表示未处理。它必须被处理。如果您不想处理它,可以将消息传递给DefWindowProc。

错误在这里

    else     
        return FALSE;   // say we didn't handle it 
                        // so dialog procedure can do that for us

WM_CTLCOLOREDIT消息被列为返回FALSE表示未处理。它必须被处理。如果您不想处理它,可以将消息传递给DefWindowProc。

n.m我先前删除的评论。您能否尝试将无效测试移出此重绘函数,并检查输入测试中给出的测试?这可能是一个时间问题-并非所有WM_xx消息都按照您期望的顺序出现在队列中。我很抱歉,但我不完全理解您的意思。你能澄清一下吗?非常感谢。最好的问候。我以为你在测试有效性,但在二读时我看到你在检查窗口是否被标记为无效。检查是否显式返回另一个“有效”笔刷工作;这样你就可以看出整个想法是否正确。@Jongware:行为是一样的。但是,如果我从EN_CHANGE handler中删除invalidate调用,可能会发生一些重要的事情:如果我键入123,颜色就可以了。如果我再粘贴字母编辑控件,则数字颜色不变。删除该字符后,文本背景色将正确更改,但编辑后的背景色保持不变。此外,如果我从编辑控件更改焦点,然后再次单击,则正确完成绘制。最小化/最大化也是如此。何时更新无效向量?如果您在EN_CHANGE上执行此操作,则控件已重新绘制自身。试着在EN_UPDATE上更新。n.m我之前删除的评论。您能否尝试将无效测试移出此重绘函数,并检查输入测试中给出的测试?这可能是一个时间问题-并非所有WM_xx消息都按照您期望的顺序出现在队列中。我很抱歉,但我不完全理解您的意思。你能澄清一下吗?非常感谢。最好的问候。我以为你在测试有效性,但在二读时我看到你在检查窗口是否被标记为无效。检查是否显式返回另一个“有效”笔刷工作;这样你就可以看出整个想法是否正确。@Jongware:行为是一样的。但是,如果我从EN_CHANGE handler中删除invalidate调用,可能会发生一些重要的事情:如果我键入123,颜色就可以了。如果我再粘贴字母编辑控件,则数字颜色不变。删除该字符后,文本背景色将正确更改,但编辑后的背景色保持不变。此外,如果我从编辑控件更改焦点,然后再次单击,则正确完成绘制。最小化/最大化也是如此。何时更新无效向量?如果您在EN_CHANGE上执行此操作,则控件已重新绘制自身。请尝试在EN_UPDATE上执行此操作。谢谢。投票通过并被正式接受。至于我面临的其他问题,我决定提出一个单独的问题。祝您下次愉快,谢谢。投票通过并被正式接受。至于我面临的其他问题,我决定提出一个单独的问题。祝你下次愉快。