C++ 是否可以更改只读编辑控件的背景色
我一直在试图找到一个简单的解决方案来更改具有ES_READONLY标志的编辑控件的颜色。当编辑控件可编辑时,我拥有的代码(某种程度上)可以工作,但是对具有只读标志的编辑控件没有影响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
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
- 初始化此变量以响应
if in window过程。如果在对话框中,则在WM_CREATE
中初始化画笔。类似于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
删除库存对象是没有必要的(但无害的)。”。