我想制作一个透明的对话框。我在CDialog派生类中捕获OnCtlColor消息......这是代码:
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(bSetBkTransparent_)
{
pDC->SetBkMode(TRANSPARENT);
hbr = (HBRUSH)GetStockObject(NULL_BRUSH);
}
return hbr;
}
它适用于所有控件,但是组框(CStatic)。所有标签(CStatic)都涂有透明文本背景,但组框的文本不透明。
我已经谷歌搜索了这个,但我找不到解决方案。有人知道如何制作一个真正透明的组合框吗?
顺便说一句,我在Windows XP中工作。我不想完全绘制控件,以避免在应用程序迁移到另一个操作系统时更改代码。
谢谢,
哈维尔
注意:我最后更改了对话框,这样我就不需要让它透明了。无论如何,我添加此信息是因为可能有人仍在尝试这样做。 groupbox不是CStatic而是CButton(我知道这不是新的)。我将Windows XP主题更改为Windows classic,然后groupbox backgraund是透明的。糟糕的新情况是,在这种情况下,框架线在文本下方可见......所以如果有人遵循这种方法,我想也许他/她会更好地遵循Adzm的建议。
答案 0 :(得分:1)
您有两种选择。
您无法使用Common Controls v6(XP-Styled控件),这将使您的应用程序失去新版Windows的风格。然而,IIRC的groupbox将尊重CTLCOLOR问题。如果您还没有使用它,并且它仍然不尊重您的颜色,那么您只有一个选项......
这是自己绘制的。我知道你说你不想,但有时你必须这样做。值得庆幸的是,组合框是一个非常简单的控件。此页面有一个绘制经典样式组框的示例:http://www.codeguru.com/cpp/controls/controls/groupbox/article.php/c2273/您也可以使用XP +附带的UxTheme库非常简单地绘制它。
如果应用程序将迁移到另一个操作系统,您将有足够的资源来处理通过MFC应用程序进行迁移。如果这是您的目标,那么您应该真正考虑使用跨平台UI工具包进行开发。
答案 1 :(得分:1)
只需为组框设置WS_EX_TRANSPARENT扩展窗口样式。
答案 2 :(得分:0)
我知道这是一个 12 年前的问题,但让我感到沮丧的是到目前为止没有人正确回答。
您所要做的就是处理WM_CTLCOLORSTATIC:
case WM_CTLCOLORSTATIC:
{
HDC hDC = (HDC)wParam;
SetTextColor(hDC, RGB(255, 255, 255));
SetBkMode(hDC, TRANSPARENT);
return (INT_PTR)GetStockObject(HOLLOW_BRUSH);
}
break;