当您调用 时TIcon.LoadFrom...()
,它将原始图标数据的副本存储到内部内存块中,然后退出。直到下一次TIcon.HandleNeeded()
调用该块时才会处理该块,例如使用该TIcon.Handle
属性时。
如果图标数据表示类型的图标RC3_STOCKICON
(通常不会遇到),则使用IDI_APPLICATION
图标 from LoadIcon()
。否则,如果图标数据表示类型的图标(通常情况下),则解析数据并传递与当前和属性值RC3_ICON
最匹配的图像(如果尚未分配维度,则传递和指标)到.TIcon.Width
TIcon.Height
SM_CXICON
SM_CYICON
GetSystemMetrics()
TIcon
CreateIcon()
从那时起,orHICON
返回的图像将用于 的剩余生命周期,或者至少直到通过, , ,等释放/释放。LoadIcon()
CreateIcon()
TIcon
HICON
TIcon.ReleaseHandle()
TIcon.Assign()
TIcon.LoadFrom...()
TIcon.SetHandle()
TIcon
仅当释放、TIcon.Assign()
调用或加载新图像源时才释放内存块本身。所以它应该是可能的,例如,调用TIcon.ReleaseHandle()
释放当前HICON
(然后你必须通过手动释放它DestroyIcon()
),然后调整TIcon
尺寸,然后调用TIcon.HandleNeeded()
重新解析内存块以加载下一个最接近的匹配图片。
更新:TIcon
不能同时加载多个不同分辨率的图像。AForm
的角图标及其任务栏图标(请记住,当Application->MainFormOnTaskbar
为 false 时,任务栏按钮由隐藏Application
窗口控制,而不是由MainForm
窗口控制,除非您手动覆盖该行为)实际上是操作系统层上的单独图标,通过WM_SETICON
消息使用不同的输入参数(wParam=ICON_SMALL
和wParam=ICON_BIG
,分别)。然而,VCL 只WM_SETICON
用于设置窗口的大图标,从不设置小图标。因此, 的角图标只是其任务栏图标(何时为真)或的任务栏按钮(何时为假)Form
的缩小版本。当 VCL 发出一个MainFormOnTaskbar
Application
MainFormOnTaskbar
WM_SETICON
Form
, 如果已分配,则使用Form
's own Icon
,否则,如果已分配,则使用Application
's Icon
,否则LoadIcon()
用于加载默认IDI_APPLICATION
图标。
因此,如果您真的想要为角图标和任务栏图标提供不同分辨率的不同Form
图标,您将不得不使用单独TIcon
的对象来加载所需的分辨率图像,如上所述,然后相应地发出您自己的WM_SETICON
消息。