1 (изменено: 1srafel, Вчера 02:19:30)

Тема: AHK: Цвета в Popup меню

Не знает ли кто примера использования цвета в таком меню? -

https://s1.hostingkartinok.com/uploads/thumbs/2026/08/17202f2a2b53d64f34327f6c9a2cf2ac.png

2

Re: AHK: Цвета в Popup меню

А чего именно вы хотите добиться?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Цвета в Popup меню

Чтобы черные квадраты в пунктах воспроизводили коды цветов. ИИ не справляются, хотел им показать пример реализации.

4

Re: AHK: Цвета в Popup меню

Примерно так:

#Requires AutoHotkey v2.0

COLORS := ["EAF4FF", "E7F8EC", "FFF4DE", "FDE9E9", "F0EAFB",
           "E4F7F7", "FFE9F3", "F2F2F2", "FFFFFF", "EDF3D8"]

SM_CXSMICON := 49
SWATCH_SIZE := DllCall("GetSystemMetrics", "Int", SM_CXSMICON)
SWATCH_BMPS := []

PALETTE := Menu()
for hex in COLORS
    PALETTE.Add("#" hex, OnPickColor)
AttachSwatches(PALETTE, COLORS)

PALETTE.Show()

OnExit(Cleanup)

OnPickColor(itemName, itemPos, mnu) {
    A_Clipboard := itemName
    ToolTip itemName " скопирован"
    SetTimer () => ToolTip(), -1200
}

AttachSwatches(mnu, colors) {
    static MIIM_BITMAP := 0x0080
    hMenu   := mnu.Handle
    miiSize := (A_PtrSize = 8) ? 80 : 48
    ofsBmp  := (A_PtrSize = 8) ? 72 : 44

    mii := Buffer(miiSize, 0)
    NumPut("UInt", miiSize, mii, 0)
    NumPut("UInt", MIIM_BITMAP, mii, 4)

    for i, hex in colors {
        hbm := MakeSwatch(Integer("0x" hex), SWATCH_SIZE)
        SWATCH_BMPS.Push(hbm)
        NumPut("Ptr", hbm, mii, ofsBmp)
        DllCall("SetMenuItemInfoW", "Ptr", hMenu, "UInt", i - 1, "Int", true, "Ptr", mii)
    }
}

MakeSwatch(rgb, size, border := 0xB0B0B0) {
    bi := Buffer(40, 0)                ; BITMAPINFOHEADER
    NumPut("UInt",   40, bi,  0)       ; biSize
    NumPut("Int",  size, bi,  4)       ; biWidth
    NumPut("Int", -size, bi,  8)       ; biHeight < 0 -> top-down rows
    NumPut("UShort",  1, bi, 12)       ; biPlanes
    NumPut("UShort", 32, bi, 14)       ; biBitCount
    NumPut("UInt",    0, bi, 16)       ; biCompression = BI_RGB

    hbm := DllCall("CreateDIBSection", "Ptr", 0, "Ptr", bi, "UInt", 0    ; DIB_RGB_COLORS
                 , "Ptr*", &bits := 0, "Ptr", 0, "UInt", 0, "Ptr")
    if (!hbm)
        throw OSError("CreateDIBSection failed")

    fill := 0xFF000000 | rgb
    edge := 0xFF000000 | border
    last := size - 1
    loop size {
        y := A_Index - 1
        loop size {
            x := A_Index - 1
            onEdge := (x = 0 || y = 0 || x = last || y = last)
            NumPut("UInt", onEdge ? edge : fill, bits, (y * size + x) * 4)
        }
    }
    return hbm
}

Cleanup(*) {
    for hbm in SWATCH_BMPS
        DllCall("DeleteObject", "Ptr", hbm)
    return 0
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder