# 图像句柄

要使用图标或位图句柄代替图像文件名, 请使用以下语法:

    HBITMAP:bitmap-handle
    HICON:icon-handle

用实际句柄值替换 bitmap-handle 或 icon-handle. 例如, `"hicon:" handle`, 其中 handle 是包含图标句柄的变量.

以下内容支持此语法:

- Gui.AddPicture(和设置图片控件的内容时的 GuiCtrl.Value).
- IL_Add
- LoadPicture
- SB.SetIcon
- ImageSearch
- TraySetIcon 或 Menu.SetIcon

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

默认情况下, AutoHotkey 会将句柄视为从文件中载入图像 - 例如, 销毁 GUI 时会删除 Picture 控件上使用的位图, 并且如果需要调整图像大小, 通常会立即删除该图像. 为避免这种情况, 请在冒号和句柄之间放置一个星号. 例如: `"hbitmap:*" handle`. 除了 ImageSearch, 这会强制该函数获取图像的副本.

## 示例

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

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

    ;创建菜单.
    Fmenu := Menu()

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

    Loop Files, pattern, "FD"
    {
        ; 为每个文件添加一个菜单项.
        Fmenu.Add A_LoopFileName, (*) => "" ; Do nothing.

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

另请参阅: LoadPicture.

dftg