Vin*_*nce 6 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)); // Set text color to white
SetBkColor(hdc, RGB(255, 255, 255)); // Set background color to black
//}
return 0;
}
break;
Run Code Online (Sandbox Code Playgroud)
我在那里发表评论只是为了检查我的代码是否有效,并且它在编辑控件上是不可读的.如果我在我的其他编辑控件上取出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 );
}
Run Code Online (Sandbox Code Playgroud)
在绘制编辑/静态控件时,您有3个可用于绘画的部分:
为了将整个控件绘制成所需的颜色,您必须返回具有所需颜色的画笔(return (LRESULT)someBrush用于窗口过程或return (INT_PTR)someBrush对话框).
您对呼叫SetBkColor台的颜色文本背景,这是不同的,从控制的背景颜色.这就是为什么我们SetBkMode用TRANSPARENT参数调用,"说"我们希望文本背景与控件的背景匹配.
在你的情况下,我使用了库存刷,因为你不需要跟踪它,也不需要在不再需要它之后删除它.
不过,可能会出现需要其他颜色的情况.在这种情况下,您需要做的是:
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以查找此方案的示例).
希望这有帮助,如果你有进一步的问题留下评论,我会尽力帮助.最好的祝福.
| 归档时间: |
|
| 查看次数: |
3705 次 |
| 最近记录: |