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

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

我正在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
        }
    

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

    最佳答案

    我已经找到解决问题的方法。我只是添加了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;
    

    08-16 01:10