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