2

我有一个编辑控件,其背景颜色取决于用户输入的有效性。

如果输入有效,则编辑控件应保持默认外观,否则背景颜色应更改为浅灰色。

我正在检查EN_UPDATE处理程序中的有效性,如果它无效,我将HWND编辑控件的存储到vector.

视觉样式已启用。

当我更改鼠标指针的位置时,问题就来了。让我描述一下:

  1. 我单击编辑控件并键入无效输入。

  2. 我将鼠标指针移到别处,但编辑控件仍有焦点。

  3. 现在我按 删除无效输入backspace

  4. 一旦输入有效,颜色就会正确更改,但边框会变粗/变暗。

这些图片说明了问题:

在输入数据之前编辑控件: 在此处输入图像描述

用户粘贴无效数据时的编辑控件(鼠标指针在灰色区域): 在此处输入图像描述

最后一个字符是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
    }

我怎样才能解决这个问题?

4

2 回答 2

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;
于 2014-05-08T06:37:38.823 回答
-1

请尝试处理消息CTLCOLOR_MSGBOX的案例。有关更多详细信息,请参阅此 MSDN 文章。

如何更改 MFC 编辑控件的背景颜色

链接中给出的示例代码的快照

  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());
于 2014-04-30T04:19:41.377 回答