当您调用 时TIcon.LoadFrom...(),它将原始图标数据的副本存储到内部内存块中,然后退出。直到下一次TIcon.HandleNeeded()调用该块时才会处理该块,例如使用该TIcon.Handle属性时。
如果图标数据表示类型的图标RC3_STOCKICON(通常不会遇到),则使用IDI_APPLICATION图标 from LoadIcon()。否则,如果图标数据表示类型的图标(通常情况下),则解析数据并传递与当前和属性值RC3_ICON最匹配的图像(如果尚未分配维度,则传递和指标)到.TIcon.WidthTIcon.HeightSM_CXICONSM_CYICONGetSystemMetrics()TIconCreateIcon()
从那时起,orHICON返回的图像将用于 的剩余生命周期,或者至少直到通过, , ,等释放/释放。LoadIcon()CreateIcon()TIconHICONTIcon.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 发出一个MainFormOnTaskbarApplicationMainFormOnTaskbarWM_SETICONForm, 如果已分配,则使用Form's own Icon,否则,如果已分配,则使用Application's Icon,否则LoadIcon()用于加载默认IDI_APPLICATION图标。
因此,如果您真的想要为角图标和任务栏图标提供不同分辨率的不同Form图标,您将不得不使用单独TIcon的对象来加载所需的分辨率图像,如上所述,然后相应地发出您自己的WM_SETICON消息。