JWo*_*ood 5 windows user-interface winapi
我正在使用普通的Win32 API(没有MFC或.NET)开发Win32 GUI应用程序.我遇到的问题是使控件显得透明.我想出了一个适用于大多数事情的方法,在Windows Vista +我在WndProc中这样做:
case WM_CTLCOLORSTATIC:
{
SetBkMode((HDC)wParam, TRANSPARENT);
return (INT_PTR)::GetStockObject(NULL_PEN);
}
break;
Run Code Online (Sandbox Code Playgroud)
在Windows XP中,我在WndProc中执行此操作:
case WM_CTLCOLORSTATIC:
{
HBRUSH hbr = (HBRUSH)DefWindowProc(hDlg, message, wParam, lParam);
::DeleteObject(hbr);
SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)(HBRUSH)(COLOR_WINDOW);
}
Run Code Online (Sandbox Code Playgroud)
现在这适用于大多数控件,但是我在组框控件顶部的标签上获得透明背景,该控件在文本中绘制组框线.我开始研究一个只有组合箱的情况,但我确信这是一个必须先解决的问题,我不想重新发明轮子.
是否有经过试验和测试的方法使控件看起来透明?
谢谢,J
要实现透明控制,您必须意识到:
通常,使控件"透明"的目标是使控件下的位图皮肤显示出来.实现这种透明性的方法是为控件的背景创建一个位图.然后CreatePatternBrush
从位图中使用.
这一块DialogProc代码实现了最简单的skinning方法,然后将绘制对话框的背景和支持这种绘制形式的大多数控件:
// _hwnd is the dialogs handle
// _hbrSkin is a pattern brush handle
HWND hwndCtl;
POINT pt;
HDC hdc;
case WM_CTLCOLORDLG:
return (INT_PTR)_hbrSkin;
case WM_CTLCOLORSTATIC:
case WM_CTLCOLORBTN:
hdc = (HDC)wParam;
SetBkMode(hdc,TRANSPARENT); // Ensure that "static" text doesn't use a solid fill
pt.x = 0; pt.y = 0;
MapWindowPoints(hwndCtl,_hwnd,&pt,1);
SetBrushOrgEx(hdc,-pt.x,-pt.y,NULL);
return (INT_PTR)_hbrSkin;
Run Code Online (Sandbox Code Playgroud)
重叠的控件将绘制错误,因为将"透明"背景绘制在另一个上.您可以通过以下方式减少闪烁: