您需要创建一个画笔并跟踪它。然后你返回这个画笔而不是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
设置文本背景的颜色,这与控件的背景颜色不同。这就是为什么我们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 以查找此场景的示例)。
希望这会有所帮助,如果您还有其他问题,请发表评论,我会尽力提供帮助。此致。