加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows 7的任务栏(启用了MainFormOnTaskbar)的Delphi窗体图标模

发布时间:2020-12-13 20:15:24 所属栏目:Windows 来源:网络整理
导读:我们有一个使用Delphi编写的 Windows桌面应用程序,在Windows 7中可以正常工作,除了主窗体的图标在Windows的新任务栏中看起来模糊.只要应用程序尚未启动,该图标看起来很好(即当它被固定到任务栏时).一旦启动,Windows将使用主窗体的图标(而不是.exe资源图标),
我们有一个使用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');

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读