加载图像/图标时指定 同一文件重复以 _LR_SHARED 选项加载时也会返回不同的位图/图标句柄。
因此要避免用这种方式频繁自内存创建 _LR_SHARED 图像或句柄。。 使用原生句柄(数据类型为 使用 gcdata 创建托管句柄(数据类型为 将一个普通图标句柄 返回的托管指针 hIcon 负责管理绑定图标句柄的生命周期,托管指针被回收时会自动调用析构函数并执行 托管指针/句柄在传入支持原生类型的 API 函数或 aardio 函数时会自动解包为普通指针,在一般使用时与普通指针没有区别。 参考:托管指针 使用 win.form 对象自动管理图标句柄 实际上在 aardio 开发中使用 GDI 位图并不多见。
大多时候我们使用 gdip.bitmap 或者 com.picture 处理图像,一般无需自行处理资源释放问题。 而控件图标基本都已经被更简洁的文字图标替代(例如 fonts.fontAwesome )。
但设置窗体本身的图标(主要显示在窗口标题栏与系统任务栏)却必须指定图标句柄(加载自 *.ico 文件)。 图标句柄的生命周期管理非常复杂,但 win.form 的 setIcon 方法封装并简化了这些操作。 最简单的用法: 窗口初始化或系统 DPI 缩放时会自动调用 winform.afterDpiChanged 。
winform.setIcon 的参数如果是图标文件路径时(必须是硬盘存在的文件,不能是内嵌资源文件),
aardio 会自动选择合适的分辨率,并加载合适的小图标、大图标,并自动管理加载的图标句柄(不用时自动释放)。
这让一切事情都变得很简单。 直接指定图标句柄的格式如下:
如果参数 @gc 为 true,winform 会负责自动释放传入的图标句柄。
如果参数 @hSmall,@hBig 是托管句柄并且 @gc 为 true,那么 winform 仅添加与解除引用(不会执行 ::DestroyIcon )。
这种托管句柄的图标可以安全地用于多个窗口。 但如果 @hSmall,@hBig 是普通图标句柄且参数 @gc 为 true,
则 winform 在释放图标时会对图标执行 ::DestroyIcon 调用。
因此不能将普通图标句柄用 winform.setIcon 指定到多个窗口,并且将参数 @gc 为 true 。 对于使用 _LR_SHARED 选项加载的共享图标,
也不能将参数 @gc 设为 true,共享图标由系统在进程退出时释放。 要注意在现代界面开发主要使用更方便的字体图标,
需要用到原生 icon 图标的场景并不多见,因此不必要把简单的事搞复很复杂。必读
管理位图/图标句柄的生命周期 #
0x8000/*_LR_SHARED*/ 选项。返回句柄全局有效,只管创建不管释放。在进程退出时由系统自动释放。pointer)自行管理图标的生命周期。谁创建谁释放。cdata ),由 aardio 自动管理图标句柄的生命周期。变量存活图标就有效,变量被回收则自动释放句柄。win.image.loadIconFromFile(iconPathOrData,true) 会返回托管句柄(参数 @2 指定为 true) 。hIcon (数据类型为 pointer 的原生指针)转换为托管指针的关键代码如下:/*
返回 cdata 类型托管指针,
元表 hIcon@ 设置为参数指定的表对象。
*/
var gcIcon = gcdata(
//_topointer 可以是指针或返回指针的函数
_topointer = hIcon; //在 API 函数或结构体中自动转换为指针值
_gc = function(){
// hIcon 被回收时自动调用 _gc 指定的析构函数
::DestroyIcon(owner); //owner 自动转换为元属性 _topointer 返回的指针值
}
);
::DestroyIcon(hIcon) 释放自身。
因此不能再手动调用 ::DestroyIcon(gcIcon) (这会导致错误地重复释放操作)。winform.afterDpiChanged = function(scaleX,scaleY,origScaleX,origScaleY){
winform.setIcon("/example.ico")
}
winform.setIcon(hSmall,hBig,gc)
自内存加载 *.ani 格式的动画光标。
参数也可以是文件、或资源文件路径
在图标数据中加载指定像素的图标,失败返回空值
自内存创建图标,失败返回空值。
图标数据:也可以是路径,或资源文件路径,
是否图标:可省略,默认为 true ,载入光标请指定为 false ,仅支持单色光标
最小分辨率:可省略,如果不匹配则取最接近的图标。
最大位宽:可省略,默认值为32位
选项:保留参数,不必指定
如果选项不指定_LR_SHARED,返回的句柄不再使用时必须调用 ::DestroyIcon销毁
自内存创建共享图标,失败返回空值。
图标数据:也可以是路径,或资源文件路径,
是否图标:可省略,默认为 true ,载入光标请指定为 false ,仅支持单色光标
最小分辨率:可省略,如果不匹配则取最接近的图标。
最大位宽:可省略,默认值为32位
选项:保留参数,不必指定
返回的句柄句柄系统管理,不能自行调用 ::DestroyIcon 销毁。
图标全局有效,进程退出时自动释放。
注意不能大量创建这种图标(无法提前释放)。
同一文件多次创建共享图标也会返回不同的句柄。
索引默认为 1,如果为 0,则返回图标总数,
参数二默认为true
获取窗口图标句柄。
返回的句柄不应被释放,共享图标返回空值
自光标资源载入光标(鼠标指针),
返回句柄无需释放
自参数 @1 指定的文件路径载入光标(鼠标指针),
支持 aardio 内嵌资源文件路径。
自图标资源载入图标,
返回句柄无需释放
自参数图标文件(支持内嵌资源文件)或内存数据加载图标。
可选指定一个或多个分辨率。
加载一个或多个图标。
0x8000/*_LR_SHARED*/返回共享图标句柄。自位图资源载入位图,n返回句柄无需释放
自参数 @1 指定的文件路径载入位图,
支持 aardio 内嵌资源文件路径。
参数 @2 默认为 true
加载一个或多个共享图标。
等价于调用 win.image.loadIconFromFile 并将 flags 参数指定为 0x8000/*_LR_SHARED*/。
同一文件重复以 _LR_SHARED 选项加载时也会返回不同的位图/图标句柄
win.image.queryIconFromResource(/*图标数据或路径*/,true,
function(count,index,width,height,bpp,colorCount,planes){
if ( width == 48 & bpp == 32 ) {
return true;
}
}
)
设置窗口图标。
此函数设置的图标窗口不会负责自动释放。
参数 @3 设为 true 仅设置大图标,设为 false 仅设置小图标
如果替换了小图标,返回值为窗口原来的小图标
如果替换了大图标,返回值为窗口原来的大图标
设置 aardio 窗口的图标请改用 win.form 对象的 setIcon 方法(支持自动选择分辨率,自动释放图标)。