C++ 更改编辑控件背景色的困难
我有一个对话框中的编辑控件,检查输入的有效性 如果输入无效,我应该通过更改编辑控件的背景色来指示有效性,否则我什么也不做 我正在检查EN_CHANGE handler中的输入,如果输入无效,我将编辑控件的句柄存储在向量中。最后我调用HWNDlParam,NULL,TRUE;所以编辑控件可以用适当的颜色重新绘制 要重新绘制编辑控件,我将按如下方式处理WM_CTLCOLOREDIT:C++ 更改编辑控件背景色的困难,c++,winapi,editcontrol,C++,Winapi,Editcontrol,我有一个对话框中的编辑控件,检查输入的有效性 如果输入无效,我应该通过更改编辑控件的背景色来指示有效性,否则我什么也不做 我正在检查EN_CHANGE handler中的输入,如果输入无效,我将编辑控件的句柄存储在向量中。最后我调用HWNDlParam,NULL,TRUE;所以编辑控件可以用适当的颜色重新绘制 要重新绘制编辑控件,我将按如下方式处理WM_CTLCOLOREDIT: case WM_CTLCOLOREDIT: { bool IsInvalid = false
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上执行此操作。谢谢。投票通过并被正式接受。至于我面临的其他问题,我决定提出一个单独的问题。祝您下次愉快,谢谢。投票通过并被正式接受。至于我面临的其他问题,我决定提出一个单独的问题。祝你下次愉快。