繁体   English   中英

是否可以使静态控件透明?

[英]Is it possible to make a Static control transparent?

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

这就是我现在拥有的:

     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画笔来绘制背景,希望它会使它的背景透明,但它不会强制静态控件不能正确重绘,我的意思是文本被绘制在旧文本之上所以这一切都很混乱。

子类化是唯一的选择吗?

我发现可靠地执行此操作的唯一方法是对静态控件进行子类化并手动绘制背景。

WS_EX_TRANSPARENT不会使控件对底层像素真正透明(虽然它可能看起来像这样)并且WS_EX_COMPOSITED不能用于子窗口。

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

如我所知,让WC_STATIC控件只显示您选择的颜色(在图像或其他表面上)的文本的方法就是返回。 这是从这个链接有用的东西

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;

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

您还可以考虑后台窗口是否应设置WS_CLIPCHILDREN,因为这可能会影响重绘。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM