Windows 7的任务栏(启用了MainFormOnTaskbar)的Delphi窗体图标模
我们有一个使用Delphi编写的
Windows桌面应用程序,在Windows 7中可以正常工作,除了主窗体的图标在Windows的新任务栏中看起来模糊.只要应用程序尚未启动,该图标看起来很好(即当它被固定到任务栏时).一旦启动,Windows将使用主窗体的图标(而不是.exe资源图标),并且它是模糊的(它看起来像一个16×16版本的图标被放大).
我们用于.exe和主窗体的图标是完全相同的,它包含各种分辨率,包括48×48与alpha混合. 我的理论是,当我在Delphi中导入主窗体的.ico文件时,Delphi会忽略/删除图标的额外分辨率.有没有办法预防/解决这个问题?什么是确保使用Delphi编写的应用程序在Windows 7的任务栏中使用正确的图标分辨率的最佳方法?
问题在于VCL内的懒惰编程不适合操作系统的行为变化.或多或少是这样的
TCustomForm.CreateWnd,窗口句柄创建后,调用; SendMessage(Handle,WM_SETICON,1,LPARAM(GetIconHandle)) else 注意“1”代替wParam,即ICON_BIG.实际上,VCL设置了表单的大图标.但图标的请求大小(TIcon.FRequestedSize)为16×16(默认情况下),因此表单的TIcon将返回小图标的句柄.这是系统小图标的大小,并且在通过调用GetSystemMetrics的构造函数CreateNew中确定. 由于早期版本的Windows使用任务栏上的小图标,这是没有问题的. Hovewer Alt选项卡对话框有其他方面的问题;如果一个图标被分配给一个表单,它在“Alt”选项卡对话框中显示为“模糊”.无论如何,Windows 7仍然默认为小图标(SM_CXSMICON / SM_CYSMICON)返回16×16,而对于大图标(SM_CXICON / SM_CYICON)则返回32×32,但是如果有的话,大型任务栏会显示大图标. 正确的方法是为大图标分配一个大图像(如果图标中有一个),并为小图标分配一个小图像(如果有的话).由于大小不一定要有完全匹配,所以这需要一个复杂的算法.相反,实现了更简单而破碎的设计. 对于解决方法,我不分配一个图标到OI中的表单,而是使用它; procedure SetFormIcons(FormHandle: HWND; SmallIconName,LargeIconName: string); var hIconS,hIconL: Integer; begin hIconS := LoadIcon(hInstance,PChar(SmallIconName)); if hIconS > 0 then begin hIconS := SendMessage(FormHandle,ICON_SMALL,hIconS); if hIconS > 0 then DestroyIcon(hIconS); end; hIconL := LoadIcon(hInstance,PChar(LargeIconName)); if hIconL > 0 then begin hIconL := SendMessage(FormHandle,ICON_BIG,hIconL); if hIconL > 0 then DestroyIcon(hIconL); end; end; 并在项目中包含一个带有16×16和32×32图像的命名图标的“icons.res”.所有表单中的OnCreate调用 SetFormIcons(Handle,'MYFORM','MYFORM'); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Windows – Active Directory环境中的桌面联网打印机管理
- windows-8 – 向WinJS.Binding.converter()函数发送多个参数
- windows-server-2008 – 如何检索Windows 2008和2003全局编
- 以编程方式在.NET中的Windows7中显示屏幕键盘
- windows-7 – 从Server 2012监控Windows 7性能计数器
- Windows Azure表存储帐户的限制
- Windows azure,错误为Microsoft.WindowsAzure.Plugins.Cach
- 我可以在Microsoft C中测量sprintf所需的缓冲区吗?
- 2、开发环境搭建-window平台
- 安装程序 – 有谁知道一个好的MSI日志查看器?