Pie*_*aud 6 windows winapi icons
我想定义 Win32 窗口的应用程序图标,例如通过调用SetClassLong
withGCL_HICON
并将句柄传递给图标(请参阅MSDN 上的SetClassLong 函数)。
这很好用,但我还没有弄清楚应该如何加载图标(从 ICO 文件)以保留所有可用尺寸(例如 16x16、32x32、48x48 和全尺寸 PNG 图标)。当我将图标文件加载LoadImage
到内存中以获取时HICON
,我必须指定我想要的大小(请参阅我对相关问题的回复)。
我的 ICO 文件包含一个小尺寸图像,应用作窗口图标(标题栏的左上角),并且设计得非常清晰,但也包含应显示在 Alt-Tab 对话框中的较大变体,但是...
加载 16x16 图标会在标题栏中显示正确的图标,但是,当然,当我按 Alt-Tab 时,它会出现丑陋的拉伸版本。而且任务栏中显示的也不是很漂亮。
当我按 Alt-Tab 时,加载 48x48 图标会显示一个漂亮的图标,但标题栏中显示的图标很模糊,因为它是 48x48 图标的缩小版本。
有什么方法可以告诉 Windows 我的 Windows 有一个多尺寸图标吗?是否有一些我错过的明显的 API?
.ICO 文件中包含多个图像。但 HICON 只是其中之一。如果您使用 LR_DEFAULTSIZE,那么可能会出现一些神奇的行为,保留 .ico 文件的链接并使用其中的适当图像,但我对此表示怀疑。
如果这不起作用,那么什么也做不了。
HICON hicon = LoadImage(NULL, "filename.ico", IMAGE_ICON,
0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE);
Run Code Online (Sandbox Code Playgroud)
一点背景。
当 .ico 文件包含在应用程序的资源中时,该文件将被破解,文件中的每个图像都会成为单独的资源。文件头被修改,成为ICON资源。因此,当向 LoadIcon/LoadImage 传递 ICON 资源的资源 id 时,它实际上是向其他资源的目录传递的。它会选择符合当时请求的图像并将其转换为 HICON。实际执行此操作的函数称为LookupIconIdFromDirectory
这就是为什么当您GetIconInfo获取 HICON 时,您仅返回一个 ICONINFO 结构。
typedef struct _ICONINFO {
BOOL fIcon;
DWORD xHotspot;
DWORD yHotspot;
HBITMAP hbmMask;
HBITMAP hbmColor;
} ICONINFO;
Run Code Online (Sandbox Code Playgroud)
GCL_HICON 设置“大”图标,GCL_HICONSM 设置小图标(大小通常为 32x32 和 16x16,但您应该使用 GetSystemMetrics 和 SM_CXICON 和 SM_CXSMICON 来查找实际大小(对于大图标,您也可以将 LR_DEFAULTSIZE 传递给 LoadImage 0 尺寸))
归档时间: |
|
查看次数: |
6610 次 |
最近记录: |