# Image 句柄 [v1.1.23+]

要在图像文件名的位置使用一个图标或位图的句柄, 使用如下的语法:

    HBITMAP:bitmap-handle
    HICON:icon-handle

用真实的句柄值替换 bitmap-handle 或 icon-handle. 例如, `hicon:%handle%`(或在表达式中的 `"hicon:" handle`), 这里的 handle 是一个包含图标句柄的变量.

下列命令和函数支持这种语法:

- Gui Add, Picture(和使用 GuiControl 设置 Picture 控件的内容时).
- IL_Add()
- LoadPicture()
- SB_SetIcon()
- ImageSearch
- Menu Tray, Icon 或 Menu MenuName, Icon
- SplashImage

位图或图标句柄是一个标识该位图或图标所处内存的数值. 大多数脚本没有必要处理该句柄, 因为在大多数情况下, AutoHotKey 会自动从文件载入图像并在不用时释放. 上面的语法是当脚本从其他资源中取得图标或位图时(如发送 WM_GETICON 消息到某个窗口) 供脚本使用的. 这也可以和 LoadPicture() 一起使用以避免从文件中多次载入同一图像.

AutoHotKey 默认将 Image 句柄当作从文件中载入图像一样, 比如, 当 GUI 被销毁时用于 Picture 控件的位图也会被释放, 当图像需要调整尺寸时通常也会被立即释放. 为避免此种情况, 在分号和句柄之间加入一个星号, 如: `hbitmap:*%handle%`(或在表达式中的 `"hbitmap:*" handle`). 例外的是用在 ImageSearch 命令中会使该命令复制一份图像.

## 示例

显示一个与模式匹配的前 n 个文件及其图标的菜单.

    pattern := A_ScriptDir "\*"
    n := 15

    ; 为 SHFILEINFOW 结构体申请内存.
    VarSetCapacity(fileinfo, fisize := A_PtrSize + 688)

    Loop, Files, %pattern%, FD
    {
        ; 为每个文件添加一个菜单项.
        Menu F, Add, %A_LoopFileName%, donothing

        ; 获取文件的图标.
        if DllCall("shell32\SHGetFileInfoW", "Wstr", A_LoopFileFullPath
            , "UInt", 0, "Ptr", &fileinfo, "UInt", fisize, "UInt", 0x100)
        {
            hicon := NumGet(fileinfo, 0, "Ptr")
            ; 设置菜单项的图标.
            Menu F, Icon, %A_Index%&, HICON:%hicon%
            ; 因为我们使用了 ":" 而不是 ":*", 在程序退出或菜单被删除时
            ; 这些图标也会被自动释放
        }
    }
    until A_Index = n
    Menu F, Show
    donothing:
    return

参阅: LoadPicture().

dftg