我有一个编辑控件,背景颜色取决于用户输入的有效性。
如果输入有效,编辑控件应保持默认外观,否则背景颜色应变为浅灰色。
我正在检查EN_UPDATE
处理程序的有效性,如果它无效,我会将编辑控件的HWND
存储到vector
。
启用了视觉样式。
当我改变鼠标指针的位置时出现问题。让我来形容一下:
点击修改控件并输入无效输入。
我将鼠标指针移动到其他位置,但编辑控件仍然具有焦点。
现在我按 backspace 删除无效输入。
只要输入有效,颜色就会正确变化,但边框会变得更厚/更暗。
这些图片说明了问题:
在输入数据之前编辑控件:
当用户粘贴无效数据时编辑控件(鼠标指针在灰色区域 ):
最后一个字符是r
。
现在,如果鼠标指针不在编辑控件的客户区(例如,在对话框的客户区),用户删除r
,这就是我得到的:
注意较粗的边框。
当鼠标指针悬停在编辑控件上方时,它会正确重新绘制。
以下是相关的代码段(如果需要,我可以提交一个小的 SSCCE ):
// minimal code snippet for EN_UPDATE
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case IDC_MYEDIT:
{
if( HIWORD(wParam) == EN_CHANGE )
{
if( /* invalid input */ )
{
// store HWND into vector
}
// InvalidateRect(...); // tried this too...
}
}
break;
// minimal code snippet for WM_CTLCOLOREDIT
case WM_CTLCOLOREDIT:
{
if( /* this control is stored in vector */ )
{
//=== then this is invalid entry->paint it grey ===//
// Needed SetBkMode for text's background transparency
SetBkMode( (HDC)wParam, TRANSPARENT );
// return light gray brush
return (INT_PTR)( (HBRUSH)GetStockObject( LTGRAY_BRUSH ) );
}
else
return DefWindowProc( ... ); // default processing
}
我该如何解决这个问题?
答案 0 :(得分:0)
我找到了解决问题的方法。我刚刚添加了RedrawWindow
而不是InvalidateRect
,并且有序框架也要重新绘制:
// minimal code snippet for EN_UPDATE
case WM_COMMAND:
{
switch( LOWORD(wParam) )
{
case IDC_MYEDIT:
{
if( HIWORD(wParam) == EN_CHANGE )
{
if( /* invalid input */ )
{
// store HWND into vector
}
// after finishing validation, redraw window INCLUDING THE FRAME
// This solves the problem with edges entirely
RedrawWindow( (HWND)lParam, NULL, NULL,
RDW_ERASE | RDW_FRAME | RDW_INVALIDATE );
}
}
break;
答案 1 :(得分:-1)
请尝试处理邮件CTLCOLOR_MSGBOX
的案例。有关更多详细信息,请参阅此MSDN文章。
How to change the background color of an MFC edit control
链接
中给出的示例代码快照 case CTLCOLOR_EDIT:
case CTLCOLOR_MSGBOX:
// Set color to green on black and return the background
brush.
pDC->SetTextColor(RGB(0, 255, 0));
pDC->SetBkColor(RGB(0, 0, 0));
return (HBRUSH)(m_pEditBkBrush->GetSafeHandle());