如何使组框文本背景透明

时间:2008-11-03 21:33:27

标签: c++ visual-studio-2005 mfc

我想制作一个透明的对话框。我在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的建议。

3 个答案:

答案 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;