SetBkMode(hdc, TRANSPARENT) 不起作用
Posted
技术标签:
【中文标题】SetBkMode(hdc, TRANSPARENT) 不起作用【英文标题】:SetBkMode(hdc, TRANSPARENT) doesn't work 【发布时间】:2012-08-02 14:44:39 【问题描述】:当我在下面的代码中使用SetBkMode(hdc, TRANSPARENT);
时,我在调整主窗口大小时得到了以下效果(因此当孩子收到 WM_PAINT 消息时):
问题是:当我调整主窗口的大小时,“查找:”的旧区域应该被删除,我猜。但它仍然存在。
如果我不使用SetBkMode(hdc, TRANSPARENT);
,我就没有这个问题。它看起来像:
,即它有白色背景。此外,如果我使用SetBkMode(hdc, TRANSPARENT);
,在我调整主窗口大小之前,它看起来和上面一样。所以我不认为SetBkMode(hdc, TRANSPARENT);
在这里工作。
hwnd
是一个静态子元素,样式为 SS_BITMAP
。
你知道为什么会出现这个问题吗?
switch (message)
case WM_PAINT:
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
SelectObject(hdc, gDefaultGuiFont);
SetBkMode(hdc, TRANSPARENT);
RECT rc;
GetClientRect(hwnd, &rc);
DrawText(hdc, _TR("Find:"), -1, &rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
EndPaint(hwnd, &ps);
return 0;
.............
【问题讨论】:
有什么问题?你画“查找”并得到象形文字? 没有。我上传了一张新图片以说明问题。 看起来这是工具栏部分。想一想,它不需要调整大小吗? @Maximus,我不明白你的意思。当我调整主窗口的大小时,它会调用一个函数来调整工具栏的大小。我放了一个 SS_BITMAP 样式的静态子控件,我想在这个静态控件上显示Find:
。
在我看来,你改变了工具栏的高度?
【参考方案1】:
尝试使用“固定”矩形。例如
RECT rc;
GetClientRect(hwnd, &rc);
rc.left += ...; rc.top += ...; // shift up-left point
DrawText(hdc, _TR("Find:"), -1, &rc, DT_SINGLELINE | DT_LEFT | DT_TOP);
这个想法是你在错误的位置(一次)和正确的位置(两次)绘制文本,而背景只更新一次。部分代码不能多说。
【讨论】:
【参考方案2】:问题是 windows 没有更新静态控件后面的控件(及时),你现在负责它的内容。所以你想使用父母提供的背景。好吧,只需让父母在子窗口中为您绘制它:
RECT rc;
GetClientRectRelative(m_hWnd, GetParent(m_hWnd), &rc);
SetWindowOrgEx(m_mdc, rc.left, rc.top, NULL);
SendMessage(GetParent(m_hWnd), WM_PAINT, (WPARAM)(HDC)m_mdc);
SetWindowOrgEx(m_mdc, 0, 0, NULL);
其中
bool GetClientRectRelative(HWND hWnd, HWND hWndRelativeTo, RECT *pRect)
RECT rcWnd, rcRelativeTo;
if (!GetClientRect(hWnd, &rcWnd) ||
!ClientToScreen(hWnd, (POINT*)&rcWnd) ||
!ClientToScreen(hWnd, (POINT*)&rcWnd + 1) ||
!GetClientRect(hWndRelativeTo, &rcRelativeTo) ||
!ClientToScreen(hWndRelativeTo, (POINT*)&rcRelativeTo) ||
!ClientToScreen(hWndRelativeTo, (POINT*)&rcRelativeTo + 1))
return false;
pRect->top = rcWnd.top - rcRelativeTo.top;
pRect->left = rcWnd.left - rcRelativeTo.left;
pRect->right = rcWnd.right - rcRelativeTo.left;
pRect->bottom = rcWnd.bottom - rcRelativeTo.top;
return true;
现在画你喜欢的任何东西,我建议你使用TRANSPARENT
背景模式。
请使用WS_CLIPCHILDREN
和WS_CLIPSIBLINGS
样式创建您所有的子窗口,然后这些问题将立即显现并且避免闪烁。
【讨论】:
以上是关于SetBkMode(hdc, TRANSPARENT) 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
WARNING you have Transparen Huge Pages..
SetBkMode可设置文字背景色:TRANSPARENT或OPAQUE
错误: - 未定义引用 `_imp__GetStockObject@4' 和未定义引用 `_imp__SetBkMode@8'