我们用于.exe和主窗体的图标是完全相同的,它包含各种分辨率,包括48×48与alpha混合.
我的理论是,当我在Delphi中导入主窗体的.ico文件时,Delphi会忽略/删除图标的额外分辨率.有没有办法预防/解决这个问题?什么是确保使用Delphi编写的应用程序在Windows 7的任务栏中使用正确的图标分辨率的最佳方法?
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');
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。