所有版本的Windows上的Win32透明控件
我正在使用普通的Win32 API(没有MFC或.NET)开发Win32 GUI应用程序.我遇到的问题是使控件显得透明.我想出了一个适用于大多数事情的方法,在
Windows Vista中,我在WndProc中执行此操作:
case WM_CTLCOLORSTATIC: { SetBkMode((HDC)wParam,TRANSPARENT); return (INT_PTR)::GetStockObject(NULL_PEN); } break; 在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); } 现在这适用于大多数控件,但是我在组框控件顶部的标签上获得透明背景,该控件在文本中绘制组框线.我开始研究一个只有组合箱的情况,但我确信这是一个必须先解决的问题,我不想重新发明轮子. 是否有经过试验和测试的方法使控件看起来透明? 谢谢, 解决方法
要实现透明控制,您必须意识到:
>你不能真的.标准的Windows控件只是不支持“透明”绘画. 通常,使控件“透明”的目标是使控件下的位图皮肤显示出来.实现这种透明性的方法是为控件的背景创建一个位图.然后使用位图中的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; 重叠的控件将绘制错误,因为将“透明”背景绘制在另一个上.您可以通过以下方式减少闪烁: >不允许调整对话框的大小.>在对话框上设置WS_EX_COMPOSITED样式,但由于Windows NT 6 DWM不支持它,它在Vista上基本没用.>在对话框中设置WS_CLIPCHILDREN样式&或WS_CLIPSIBLINGS – 这些样式阻止使用组框和选项卡控件,因为它们依赖于控件重叠.>继承所有控件,使用WM_PRINTCLIENT消息将它们绘制到后备缓冲区,然后在一次传递中将准备好的后备缓冲区blit.努力而不是所有控件都支持WM_PRINTCLIENT. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在Windows/Linux/Mac上的Java程序中对全局热键进行响应?
- windows-server-2008 – 断开连接后,RDP会话的GUI是否仍然有
- Windows&Appium&Java&Python自动化测试-配置开
- 【原】无脑操作:Windows下搭建Kafka运行环境
- 如何在Window Builder中添加SwingX调色板?
- .net – 在windows.forms之间传递信息的最佳实践
- 在运行Windows Server 2012的大量计算机上更新密码的最佳做
- AVX2字节用uint16索引收集到__m256i中
- windows – 我可以使用本地组策略覆盖域组策略作为本地管理
- 为什么Microsoft不通过Windows更新强制Silverlight进入用户
- xaml – WinRT&Light主题
- windows – Java日历问题,JDK 1.6.0.22
- 需要在Windows / Python中快速创建大量新进程
- windows-server-2003 – IBM LTO 3磁带机定期“脱
- .net – 通过SetSecurityDescriptor设置WMI ACL
- Windows 7外观上的Java Swing渲染错误?
- Userprofile register windows 位置
- Windows中的文件重定向和%errorlevel%
- windows-server-2012 – 识别Windows 2012 Serve
- Wix安装程序问题:为什么RestartManager将服务标