我正在尝试实现一个静态控件,它会刷新(更改文本)以响应某些事件,每秒发生一次。由于我不想每秒都绘制整个客户区域,所以我决定使用静态控件,现在问题是父窗口是蒙皮的,这意味着它有自定义位图作为其背景,而静态控件不是适合,所以我正在寻找使静态控件的背景透明的方法。
这就是我现在所拥有的:
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画笔来绘制背景,希望它会使背景透明,但它不会强制静态控件不能正确重绘,我的意思是文本被绘制在顶部旧文,所以它一切都很乱。
子类化是唯一的选择吗?
答案 0 :(得分:3)
我发现可靠的唯一方法是对静态控件进行子类化并手动绘制背景。
WS_EX_TRANSPARENT
不会使控件对底层像素真正透明(尽管可能看起来像这样)并且WS_EX_COMPOSITED
不能用于子窗口。
相反,将静态子类化,并捕获WM_ERASEBKGND
消息。然后,您可以绘制基础位图的相应部分。
答案 1 :(得分: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;
答案 2 :(得分:0)
您没有提到静态控件上的窗口样式,特别是扩展样式WS_EX_TRANSPARENT似乎旨在解决您使用重绘描述的问题。另据我的理解,WS_EX_COMPOSITED可能对您的上下文有用。
您也可以考虑后台窗口是否应该设置WS_CLIPCHILDREN,因为这可能会影响重绘。