9

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

4

1 回答 1

9

您需要创建一个画笔并跟踪它。然后你返回这个画笔而不是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设置文本背景的颜色,这与控件的背景颜色不同。这就是为什么我们SetBkModeTRANSPARENT参数调用,以“说”我们希望文本背景与控件的背景相匹配。

在您的情况下,我使用了股票刷,因为您不需要跟踪它,也不需要在不再需要它后将其删除。

不过,在某些情况下,您可能会想要其他颜色。在这种情况下,您必须执行以下操作:

  • 在您的窗口/对话框过程中创建全局HBRUSH变量或变量。static HBRUSH
  • 初始化此变量以响应WM_CREATE窗口过程中的 if。如果在对话框程序中初始化画笔WM_INITDIALOG。类似someBrush = CreateSolidBrush( RGB( 255, 0, 255 ) );查看文档以获取更多信息和示例。
  • 返回这个画笔,就像我在上面的示例中向您展示的那样(return (LRESULT)someBrush用于窗口过程或return (INT_PTR)someBrush对话框)。
  • 不再需要时删除画笔。这通常通过WM_DESTROY调用DeleteObject(someBrush);来完成。

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

希望这会有所帮助,如果您还有其他问题,请发表评论,我会尽力提供帮助。此致。

于 2015-01-02T01:42:24.267 回答