Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以更改只读编辑控件的背景色_C++_Winapi_Background Color_Editcontrol - Fatal编程技术网

C++ 是否可以更改只读编辑控件的背景色

C++ 是否可以更改只读编辑控件的背景色,c++,winapi,background-color,editcontrol,C++,Winapi,Background Color,Editcontrol,我一直在试图找到一个简单的解决方案来更改具有ES_READONLY标志的编辑控件的颜色。当编辑控件可编辑时,我拥有的代码(某种程度上)可以工作,但是对具有只读标志的编辑控件没有影响 case WM_CTLCOLOREDIT: { HDC hdc = (HDC)wParam; //if (GetDlgItem(hwnd, IDC_EDIT_IN) == (HWND)lParam) //{ SetTextColor(hdc, RGB(255, 255, 255)); // S

我一直在试图找到一个简单的解决方案来更改具有ES_READONLY标志的编辑控件的颜色。当编辑控件可编辑时,我拥有的代码(某种程度上)可以工作,但是对具有只读标志的编辑控件没有影响

case WM_CTLCOLOREDIT:
{
  HDC hdc = (HDC)wParam;
  //if (GetDlgItem(hwnd, IDC_EDIT_IN) == (HWND)lParam)
  //{
      SetTextColor(hdc, RGB(255, 255, 255)); // Set text color to white
      SetBkColor(hdc, RGB(255, 255, 255)); // Set background color to black
  //}
  return 0;
}
break;

我在那里有注释只是为了检查我的代码是否工作,它在编辑控件上不是只读的。如果我在我的另一个编辑控件上取出ES_READONLY,它确实可以工作。我正在创建聊天程序,不希望用户能够在聊天框区域键入内容。当它是只读的时候,它会变成灰色,但我想要白色。还有别的办法吗?此外,该颜色仅为文本所在的区域着色,而不是编辑控件的整个高度。我做错了什么?

您需要创建一个笔刷并跟踪它。然后返回此画笔,而不是代码段中的
返回0
。一旦不再需要画笔,您必须将其删除。这通常是为了响应
WM\u DESTROY
消息而进行的

在您的情况下,您可以使用库存刷子躲避子弹,这是我的建议。

在只读模式下,编辑控件响应
WM\u CTLCOLORSTATIC
,而不是
WM\u CTLCOLOREDIT
,因此您必须正确处理此消息:

case WM_CTLCOLORSTATIC:
{
    if( (HWND)lParam == GetDlgItem(hwnd, IDC_EDIT_IN) )
    {
        SetBkMode( (HDC)wParam, TRANSPARENT );  
        SetTextColor(hdc, RGB(255, 255, 255));
        return (LRESULT)( (HBRUSH)GetStockObject(BLACK_BRUSH) );  
        // if edit control is in dialog procedure change LRESULT to INT_PTR
    }
    else  // this is some other static control, do not touch it!!
        return DefWindowProc( hwnd, message, wParam, lParam );
}
绘制编辑/静态控件时,有3个零件可用于绘制:

  • 文本颜色
  • 文本背景
  • 控件的背景
为了将整个控件绘制成所需的颜色,必须返回具有所需颜色的画笔(
return(LRESULT)someBrush
用于窗口过程,或
return(INT_PTR)someBrush
用于对话框)

调用
SetBkColor
设置文本的背景颜色,该背景颜色与控件的背景颜色不同。这就是为什么我们使用
TRANSPARENT
参数调用
SetBkMode
,以“表示”我们希望文本背景与控件的背景匹配

在您的情况下,我使用了stock brush,因为您不需要跟踪它,也不需要在不再需要它之后删除它

不过,在某些情况下,您可能需要其他颜色。在这种情况下,您需要做的是:

  • 在窗口/对话框过程中创建全局
    HBRUSH
    变量或
    静态HBRUSH
    变量
  • 初始化此变量以响应
    WM_CREATE
    if in window过程。如果在对话框中,则在
    WM\u INITDIALOG
    中初始化画笔。类似于
    someBrush=CreateSolidBrush(RGB(255,0255))有关更多信息和示例,请参见
  • 返回此画笔,就像我在上面的示例中所示(
    return(LRESULT)someBrush
    用于窗口过程,或
    return(INT\u PTR)someBrush
    用于对话框)
  • 不再需要时删除笔刷。这通常在
    WM_DESTROY
    中使用
    DeleteObject(someBrush)完成呼叫
    
我强烈建议您针对
WM\u DESTROY
而不是
WM\u CLOSE
执行删除操作,因为这是您的窗口将始终收到的消息,而
WM\u CLOSE
有时可能会被跳过(搜索Internet以查找此场景的示例)


希望这有帮助,如果你有进一步的问题,请留下评论,我会尽力帮助你。致以最诚挚的问候。

我建议您查看
WM_ctlcolorstic
阅读MSDN文章,它告诉您返回画笔。引用MSDN的话:“通过调用
DeleteObject
删除库存对象是没有必要的(但无害的)。”。