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

标签 c++ winapi

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

这是我现在拥有的:

     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 消息。然后,您可以绘制底层位图的适当部分。

关于c++ - 是否可以使静态控件透明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13748831/

相关文章:

c++ - 调用构造函数的次数

C++ vector : Assert when using vector array index -1?

c++ - 使用 EvtSetChannelConfigProperty() 函数时出现访问冲突错误

c++ - WINAPI 光标在应用程序窗口上的单击位置

windows - 如何读出引导顺序?

c++ - 为什么这种将指针从 C++ 传递到 Fortran 的尝试不起作用?

c++ - 如何在 GCC 的 VSCode 中设置 wxWidgets?

c++ - 解压缩图像时多像素操作的高效设计

c++ - 键盘重复计数

C++ 从字符串化字节转换字节数组