使用选定的画笔完全不重新编辑控件

时间:2014-04-30 03:03:11

标签: c++ winapi editcontrol

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

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

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

启用了视觉样式。

当我改变鼠标指针的位置时出现问题。让我来形容一下:

  1. 点击修改控件并输入无效输入。

  2. 我将鼠标指针移动到其他位置,但编辑控件仍然具有焦点。

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

  4. 只要输入有效,颜色就会正确变化,但边框会变得更厚/更暗。

  5. 这些图片说明了问题:

    在输入数据之前编辑控件: enter image description here

    当用户粘贴无效数据时编辑控件(鼠标指针在灰色区域 ): enter image description here

    最后一个字符是r

    现在,如果鼠标指针不在编辑控件的客户区(例如,在对话框的客户区),用户删除r ,这就是我得到的:enter image description here

    注意较粗的边框。

    当鼠标指针悬停在编辑控件上方时,它会正确重新绘制。

    以下是相关的代码段(如果需要,我可以提交一个小的 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
        }
    

    我该如何解决这个问题?

2 个答案:

答案 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());