繁体   English   中英

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

[英]Is it possible to change the background color of a read only edit control

在此输入图像描述 我一直在尝试找到一个简单的解决方案来更改具有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,它确实可以正常工作。 我正在创建一个聊天程序,并且不希望用户能够输入聊天框区域。 当它只读时,它会变成灰色,但我想要一种白色。 还有另一种方法吗? 此外,颜色仅为文本所在的区域着色,而不是编辑控件的整个高度。 我究竟做错了什么?

您需要创建一个画笔并跟踪它。 然后返回此画笔,而不是在代码段中return 0 一旦不再需要刷子,您必须删除它。 这通常是为了响应WM_DESTROY消息而完成的。

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

在只读模式下,编辑控件响应WM_CTLCOLORSTATIC而不是WM_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来“说”我们希望文本背景与控件的背景匹配。

在你的情况下,我使用了库存刷,因为你不需要跟踪它,也不需要在不再需要它之后删除它。

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

  • 在窗口/对话框过程中创建全局HBRUSH变量或static HBRUSH变量。
  • 如果在窗口过程中,则初始化此变量以响应WM_CREATE 如果在对话框过程中初始化WM_INITDIALOG的画笔。 someBrush = CreateSolidBrush( RGB( 255, 0, 255 ) ); 有关更多信息和示例,请参阅文档
  • 返回这个画笔,就像我在上面的例子中给你看的那样( return (LRESULT)someBrush用于窗口过程,或者return (INT_PTR)someBrush用于对话框)。
  • 不再需要时删除画笔。 这通常使用DeleteObject(someBrush);WM_DESTROY完成DeleteObject(someBrush); 呼叫。

我强烈建议您删除以响应WM_DESTROY而不是WM_CLOSE因为这是您的窗口将始终收到的消息,而有时可以跳过WM_CLOSE (搜索Internet以查找此方案的示例)。

希望这有帮助,如果你有进一步的问题留下评论,我会尽力帮助。 最好的祝福。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM