【问题标题】:Is it possible to make a Static control transparent?是否可以使静态控件透明?
【发布时间】:2012-12-06 17:08:53
【问题描述】:

我正在尝试实现一个静态控件,该控件刷新(更改文本)以响应某些事件,该事件每秒发生一次。由于我不想每秒都绘制整个客户区,所以我决定使用静态控件,现在的问题是父窗口是蒙皮的,这意味着它有自定义位图作为背景,而静态控件没有适合,所以我正在寻找使静态控件的背景透明的方法。

这就是我现在拥有的:

     hHandle = CreateWindowEx( WS_EX_TRANSPARENT, "STATIC", "", WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS, 60, 212, 477, 20, hwnd, 0, hInstance, 0) ;


     case WM_CTLCOLORSTATIC: 
          {
              HDC hdC = (HDC)wParam;

              SetTextColor( hdC, RGB(31,122,179) );

              SetBkMode( hdC, TRANSPARENT );


              return 0;//(HRESULT)GetStockObject(NULL_BRUSH);
          }
          break;

我尝试返回 NULL 画笔来绘制背景,希望它可以使其背景透明,但它并没有强制静态控件无法正确重新绘制,我的意思是文本被绘制在顶部旧文本,所以很乱。

子类化是唯一的选择吗?

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    我发现可靠地做到这一点的唯一方法是对静态控件进行子类化并手动绘制背景。

    WS_EX_TRANSPARENT 不会使控件对底层像素真正透明(尽管它可能看起来像那样),WS_EX_COMPOSITED 不能用于子窗口。

    相反,将静态子类化并捕获WM_ERASEBKGND 消息。然后,您可以绘制底层位图的适当部分。

    【讨论】:

      【解决方案2】:

      据我所知,让 WC_STATIC 控件仅显示您选择的颜色的文本(在图像或其他表面上)的方法是返回。这就是 link 对我有用的。

      case WM_CTLCOLORSTATIC:
         SetTextColor((HDC)wParam, RGB(255, 0, 0));
         SetBkMode((HDC)wParam, TRANSPARENT);
      
         // the correct return needs HOLLOW_BRUSH
         return (LRESULT)GetStockObject(HOLLOW_BRUSH);
      break;
      

      【讨论】:

      【解决方案3】:

      您没有提到静态控件上的窗口样式,特别是扩展样式 WS_EX_TRANSPARENT 似乎旨在解决您描述的重绘问题。另外据我了解,WS_EX_COMPOSITED 在您的上下文中可能很有用。

      您也可以考虑背景窗口是否应该设置 WS_CLIPCHILDREN,因为这可能会影响重绘。

      【讨论】:

      • 它似乎只适用于新文本下的静态控件背景部分,如果新文本长度小于前一个,则前一个绘制的剩余文本不是在新文本下,它不会消失(对不起英语:P)
      猜你喜欢
      • 2014-06-19
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 2012-07-05
      • 2011-09-10
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多