1 Вчера 02:18:21 (изменено: 1srafel, Вчера 02:19:30)
Re: AHK: Цвета в Popup меню
А чего именно вы хотите добиться?
Re: AHK: Цвета в Popup меню
Чтобы черные квадраты в пунктах воспроизводили коды цветов. ИИ не справляются, хотел им показать пример реализации.
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
}
