如何通过与 GDI 对其颜色进行异或运算来在填充的矩形上绘制文本?
How to draw text over filled rectangle by XOR-ing its color with GDI?
我不确定我是否用文字表达正确。最好的方法是用图像来展示它。我正在尝试填充一个矩形,同时反转其中的文本颜色。就像 edit
控件一样:
所以这是一个绘图代码(从WM_PAINT
调用):
//Erase background
::FillRect(hDC, &rcClient, ::GetSysColorBrush(COLOR_WINDOW));
//Draw text
::DrawText(hDC, text, text.size(), &rc,
DT_LEFT | DT_TOP | DT_EDITCONTROL | DT_NOPREFIX | DT_SINGLELINE);
//Draw highlighted rect & invert text
HGDIOBJ hOldBrush = ::SelectObject(hDC, ::GetSysColorBrush(COLOR_HIGHLIGHT));
::PatBlt(hDC, rcDrawFrame.left, rcDrawFrame.top, rcDrawFrame.Width(), rcDrawFrame.Height(), DSTINVERT);
::SelectObject(hDC, hOldBrush);
但是由于某种原因背景矩形显示为黑色,我知道 COLOR_HIGHLIGHT
在这个系统上是蓝色的:
那么我做错了什么?
您可能需要考虑不同的策略; drawing the text twice with inverted clipped region.
我不确定我是否用文字表达正确。最好的方法是用图像来展示它。我正在尝试填充一个矩形,同时反转其中的文本颜色。就像 edit
控件一样:
所以这是一个绘图代码(从WM_PAINT
调用):
//Erase background
::FillRect(hDC, &rcClient, ::GetSysColorBrush(COLOR_WINDOW));
//Draw text
::DrawText(hDC, text, text.size(), &rc,
DT_LEFT | DT_TOP | DT_EDITCONTROL | DT_NOPREFIX | DT_SINGLELINE);
//Draw highlighted rect & invert text
HGDIOBJ hOldBrush = ::SelectObject(hDC, ::GetSysColorBrush(COLOR_HIGHLIGHT));
::PatBlt(hDC, rcDrawFrame.left, rcDrawFrame.top, rcDrawFrame.Width(), rcDrawFrame.Height(), DSTINVERT);
::SelectObject(hDC, hOldBrush);
但是由于某种原因背景矩形显示为黑色,我知道 COLOR_HIGHLIGHT
在这个系统上是蓝色的:
那么我做错了什么?
您可能需要考虑不同的策略; drawing the text twice with inverted clipped region.