这段代码实现了一个图形化的颜色选择工具,支持丰富的交互功能,包括颜色选择、调整、预览和保存。

 

Plain text
复制到剪贴板
Open code in new window
EnlighterJS 3 Syntax Highlighter
#NoEnv
#Warn
#SingleInstance, Force
INI := ""
FileRead, INI, Menu.ini
GuiOptions := { "Title" : "Choose colors"
, "New" : "-MinimizeBox"
, "Show" : "x50 yCenter"
, "Menu" : INI }
History := ["663399", "D2B48C", "BF00FF", "FF9F00", "00BFFF"
, "FF0000", "FF69B4", "3399FF", "FAEBD7", "D2691E"] ; up to 25 colors
Colors := ChooseColors(GuiOptions, History*)
If Colors.Count()
MsgBox % Colors[1]
; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=92145
ChooseColors(GuiOptions:="", Colors*) { ; ChooseColors() v0.97 by SKAN, on D46L/D47K @ tiny.cc/choosecolors
Local
_Batchlines:= A_BatchLines
SetBatchLines -1
TextFont := ["s11", "Calibri"]
MonoFont := ["S12", "Consolas"]
CancelW := 70 ; min 60 px max 80 px
CancelH := 24 ; min 23 px max 32 px
SliderH := 3 ; min 1 px max 14 px
KeyUp := "F1" ; Key for adding colors to History
Glob := { "Gui":{}, "Func":{}, "CoordMode":{}, "Settings":{}, "Paint":1, "Esc":0 }
Loop % ( Min(Colors.Count(), 25), Var := "")
Var .= Format("{:06X}", "0x" . Colors[A_Index]) . "|"
Glob.Que := RTrim(Var, "|")
Color := OldColor := ( StrLen(Glob.Que) ? StrSplit(Glob.Que, "|",, 2).1 : "FF0000" )
Glob.SysColor := Format("0x{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit( Format("{:06X}"
, DllCall("User32.dll\GetSysColor", "Int",15)))* )
Title := StrLen(GuiOptions.Title) ? GuiOptions.Title : "ChooseColors()"
NewOptions := GuiOptions.New
ShowOptions := GuiOptions.Show
DefaultOpts := "-Resize +Sysmenu +LabelChooseColors_Gui +HwndhGui"
Glob.Menu := "|" . StrReplace(StrReplace(GuiOptions.Menu, "`r`n", "`n"), "`n", "|") . "|[]"
_DefaultGui := A_DefaultGUI
Gui, ChooseColors: New, +AlwaysOnTop %NewOptions% %DefaultOpts%, %Title%
Gui, %_DefaultGui%: Default
ChooseColors_RegisterClass(Glob, True) ; Register "CcStatic"
Glob.CCUI := "ahk_id" . (Glob.Gui.Hwnd := hGui)
Glob.Gui.Hicon := ChooseColors_GetIcon("caption.png")
DllCall("SendMessage", "Ptr",Glob.Gui.Hwnd, "Int",WM_SETICON:=0x80, "Ptr",0, "Ptr",Glob.Gui.Hicon)
Glob.Func.Keypressed := Func("ChooseColors_Keypress").Bind(KeyUp)
Glob.Func.Gui := Func("ChooseColors_Gui").Bind(Glob)
Glob.Func.GuiControl := Func("ChooseColors_GuiControl").Bind(Glob)
Glob.Func.GuiControlGet := Func("ChooseColors_GuiControlGet").Bind(Glob)
Glob.Func.SetImage := Func("ChooseColors_SetImage")
Glob.Func.CreateGradient := Func("ChooseColors_CreateGradient")
Glob.Func.CreateBitmap := Func("ChooseColors_CreateBitmap")
Glob.Func.CreateBitmapText := Func("ChooseColors_CreateBitmapText").Bind(Glob)
Glob.Func.Settings := Func("ChooseColors_Settings").Bind(Glob)
Glob.Func.CoordMode := Func("ChooseColors_CoordMode").Bind(Glob)
Glob.Func.GetHexColor := Func("ChooseColors_GetHexColor").Bind(Glob)
Glob.Func.SetColorName := Func("ChooseColors_SetColorName").Bind(Glob)
Glob.Func.HistorySetBitmap := Func("ChooseColors_HistorySetBitmap").Bind(Glob)
Glob.Func.SetImageAnimate := Func("ChooseColors_SetImageAnimate").Bind(Glob)
Glob.Func.EditHex := Func("ChooseColors_Hex").Bind(Glob)
Glob.Func.ClipCursor := Func("ChooseColors_ClipCursor")
Glob.Func.GetWindowRect := Func("ChooseColors_GetWindowRect")
Glob.Func.GetMonitorRect := Func("ChooseColors_GetMonitorRect")
Glob.Func.SetRect := Func("ChooseColors_SetRect")
Glob.Func.GetImage := Func("ChooseColors_GetImage")
Glob.Func.DeleteBitmap := Func("ChooseColors_DeleteBitmap")
Glob.Func.UpdateRGBHSL := Func("ChooseColors_UpdateRGBHSL")
Glob.Func.SetSystemCursor := Func("ChooseColors_SetSystemCursor")
Glob.Func.MemDC := Func("ChooseColors_MemDC")
Gui := Glob.Func.Gui
GuiControl := Glob.Func.GuiControl
GuiControlGet := Glob.Func.GuiControlGet
SetImage := Glob.Func.SetImage
CreateBitmap := Glob.Func.CreateBitmap
CreateGradient := Glob.Func.CreateGradient
AddUpDown := Func("ChooseColors_AddUpDown").Bind(Glob)
AddGoSub := Func("ChooseColors_GoSub").Bind(Glob)
Gui.Call("+DpiScale")
Gui.Call("Font", TextFont*)
Gui.Call("Margin", 0, 0)
Gui.Call("Add", "Button", "HwndCancelB x0 y0 w0 h0 -Tabstop", "&Cancel")
AddGoSub.Call("CancelB", "ChooseColors_GuiCancel", Glob)
Gui.Call("Add", "Button", "HwndOkayB Default x+0 yp w0 h0 -Tabstop", "&Ok")
AddGoSub.Call("OkayB", "ChooseColors_GuiOkay", Glob)
Gui.Call("Add", "Custom", "HwndGradient CcStatic w288 h288 SS_NOTIFY SS_REALSIZECONTROL SS_BITMAP")
AddGoSub.Call("Gradient", "ChooseColors_HueSelect", Glob)
Gui.Call("Add", "Custom", "HwndHue CcStatic x0 y+0 w288 h16 SS_NOTIFY SS_REALSIZECONTROL SS_BITMAP")
AddGoSub.Call("Hue", "ChooseColors_HueSelect", Glob)
HueColors := [0xFF0000, 0xFFFF00, 0x00FF00, 0x00FFFF, 0x0000FF, 0xFF00FF, 0xFF0000]
Hbm := CreateGradient.Call(Glob.Hue.W, 1, False, HueColors*)
SetImage.Call(Glob.Hue.Hwnd, Hbm, 1)
SH := Max(2, Min(14, SliderH))
Gui.Call("Margin", 16, 12)
Gui.Call("Add", "Text", "x16 w16 Section", "R")
Gui.Call("Add", "Text", "x+0 w0", "&R")
Gui.Call("Add", "Edit", "HwndEditR x+0 w40 h26 Number Limit3 Right")
AddGoSub.Call("EditR", "ChooseColors_RGB", Glob)
AddUpDown.Call("EditR", "HwndUpdown Range0-255")
Gui.Call("Add", "Custom", "HwndSlider1 CcStatic x16 y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
AddGoSub.Call("Slider1", "ChooseColors_Slider", Glob)
Tbm := CreateBitmap.Call(Glob.Slider1.W, SH, 0xDD0000), SetImage.Call(Glob.Slider1.Hwnd, Tbm)
Gui.Call("Margin", 16, 6)
Gui.Call("Add", "Text", "x16 w16", "G")
Gui.Call("Add", "Text", "x+0 w0", "&G")
Gui.Call("Add", "Edit", "HwndEditG x+0 w40 h26 Number Limit3 Right")
AddGoSub.Call("EditG", "ChooseColors_RGB", Glob)
AddUpDown.Call("EditG", "HwndUpdown Range0-255")
Gui.Call("Add", "Custom", "HwndSlider2 CcStatic x16 y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
AddGoSub.Call("Slider2", "ChooseColors_Slider", Glob)
Tbm := CreateBitmap.Call(Glob.Slider2.W, SH, 0x00DD00), SetImage.Call(Glob.Slider2.Hwnd, Tbm)
Gui.Call("Add", "Text", "x16 w16", "B")
Gui.Call("Add", "Text", "x+0 w0", "&B")
Gui.Call("Add", "Edit", "HwndEditB x+0 w40 h26 Number Limit3 Right")
AddGoSub.Call("EditB", "ChooseColors_RGB", Glob)
AddUpDown.Call("EditB", "HwndUpdown Range0-255")
Gui.Call("Add", "Custom", "HwndSlider3 CcStatic x16 y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
AddGoSub.Call("Slider3", "ChooseColors_Slider", Glob)
Tbm := CreateBitmap.Call(Glob.Slider3.W, SH, 0x0000DD), SetImage.Call(Glob.Slider3.Hwnd, Tbm)
Gui.Call("Add", "Text", "x+m ys w16 Section", "H")
Gui.Call("Add", "Text", "x+0 w0", "&H")
Gui.Call("Add", "Edit", "HwndEditH x+0 w40 h26 Number Limit3 Right")
AddGoSub.Call("EditH", "ChooseColors_HLS", Glob)
AddUpDown.Call("EditH", "HwndUpdown Range0-360 Wrap")
Gui.Call("Add", "Text", "x+4 w12 hp 0x200 Disabled", Chr(176))
Gui.Call("Add", "Custom", "HwndSlider4 CcStatic xs y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
AddGoSub.Call("Slider4", "ChooseColors_Slider", Glob)
Tbm := CreateGradient.Call(Glob.Slider4.W, SH, False, HueColors*), SetImage.Call(Glob.Slider4.Hwnd, Tbm)
Gui.Call("Add", "Text", "xs w16 hp", "S")
Gui.Call("Add", "Text", "x+0 w0", "&S")
Gui.Call("Add", "Edit", "HwndEditS x+0 w40 h26 Number Limit3 Right")
AddGoSub.Call("EditS", "ChooseColors_HLS", Glob)
AddUpDown.Call("EditS", "HwndUpdown Range0-100")
Gui.Call("Add", "Text", "x+4 w12 hp 0x200 Disabled", "%")
Gui.Call("Add", "Custom", "HwndSlider5 CcStatic xs y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
AddGoSub.Call("Slider5", "ChooseColors_Slider", Glob)
Tbm := CreateGradient.Call(Glob.Slider5.W, SH, False, 0x7F7F7F, 0x7F7F7F, 0x7F7F7F)
SetImage.Call(Glob.Slider5.Hwnd, Tbm)
Gui.Call("Add", "Text", "xs w16 hp", "L")
Gui.Call("Add", "Text", "x+0 w0", "&L")
Gui.Call("Add", "Edit", "HwndEditL x+0 w40 h26 Number Limit3 Right")
AddGoSub.Call("EditL", "ChooseColors_HLS", Glob)
AddUpDown.Call("EditL", "HwndUpdown Range0-100")
Gui.Call("Add", "Text", "x+2 w12 hp 0x200 Disabled", "%")
Gui.Call("Add", "Custom", "HwndSlider6 CcStatic xs y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
AddGoSub.Call("Slider6", "ChooseColors_Slider", Glob)
Tbm := CreateGradient.Call(Glob.Slider6.W, SH, False, 0x444444, 0xAAAAAA, 0xFFFFFF)
SetImage.Call(Glob.Slider6.Hwnd, Tbm)
Gui.Call("Add", "Text", "HwndColorName x16 y+0 w250 h16 SS_CENTERIMAGE Right")
Gui.Call("Add", "Custom", "HwndHistory CcStatic y+2 w250 h12 SS_NOTIFY SS_REALSIZECONTROL SS_BITMAP +E0x20000")
AddGoSub.Call("History", "ChooseColors_HueSelect2", Glob)
Gui.Call("Add", "Button", "HwndDelQB xp yp w0 hp -Tabstop", "&D", hDelQB:=0)
AddGoSub.Call("DelQB", "ChooseColors_DelColorFmQ", Glob)
Gui.Call("Margin", 16, 12)
IH := Max(23, Min(32, CancelH))
Gui.Call("Add", "Picture", "HwndPickScr x16 y+m w24 Left SS_CENTERIMAGE SS_ICON h" . IH)
GuiControl.Call("", Glob.PickScr.Hwnd, "*w0 *h0 hicon:" . ChooseColors_GetIcon("pickscr.png"))
AddGoSub.Call("PickScr", "ChooseColors_PickScr", Glob)
Gui.Call("Add", "Picture", "HwndPickClr x+8 yp wp hp SS_CENTERIMAGE SS_ICON")
GuiControl.Call("", Glob.PickClr.Hwnd, "*w0 *h0 hicon:" . ChooseColors_GetIcon("pickclr.png"))
AddGoSub.Call("PickClr", "ChooseColors_PickScr", Glob)
CW := Max(60, Min(80, CancelW))
Gui.Call("Add", "Custom", "HwndCancel CcStatic x+m hp -Tabstop Center SS_NOTIFY SS_BITMAP w" . CW, "&Cancel")
AddGoSub.Call("Cancel", "ChooseColors_GuiCancel", Glob)
Tbm := Glob.Func.CreateBitmapText.Call(Glob.Cancel.Hwnd)
SetImage.Call(Glob.Cancel.Hwnd, Tbm)
Gui.Call("Add", "Custom", "HwndOkay CcStatic x+m hp -Tabstop Center SS_NOTIFY SS_BITMAP w" . (CW//3)*2, "&OK")
AddGoSub.Call("Okay", "ChooseColors_GuiOkay", Glob)
Tbm := Glob.Func.CreateBitmapText.Call(Glob.Okay.Hwnd)
SetImage.Call(Glob.Okay.Hwnd, Tbm)
Gui.Call("Margin", 16, 6)
Gui.Call("Add", "Text", "x157 ys w40 Right Section h40 BackgroundTrans", "Old")
Gui.Call("Add", "Progress", "x+6 w68 hp Disabled Border Background" . OldColor)
Gui.Call("Add", "Custom", "HwndOld CcStatic xp yp wp hp BackgroundTrans SS_NOTIFY WS_EX_STATICEDGE")
AddGoSub.Call("Old", "ChooseColors_SetNew", Glob, OldColor)
Gui.Call("Add", "Text", "HwndRandom xs w40 y+m hp Right", "New")
Gui.Call("Add", "Button", "HwndRandomB x+0 yp w0 hp -Tabstop", "&N")
AddGoSub.Call("Random", "ChooseColors_GenRandom", Glob)
AddGoSub.Call("RandomB", "ChooseColors_GenRandom", Glob)
Gui.Call("Add", "Progress", "HwndNew x+6 w68 hp Disabled Border Background" . OldColor)
Gui.Call("Add", "Custom", "HwndPreview CcStatic xp yp wp hp BackgroundTrans SS_NOTIFY WS_EX_STATICEDGE")
AddGoSub.Call("Preview", "ChooseColors_Preview", Glob, Glob.Preview.Hwnd)
Gui.Call("Add", "Text", "HwndAddQ xs y+m w40 h26 Right", "#")
Gui.Call("Add", "Button", "HwndAddQB x+0 yp w0 h0 -Tabstop", "&A")
AddGoSub.Call("AddQ", "ChooseColors_AddColorToQ", Glob)
AddGoSub.Call("AddQB", "ChooseColors_AddColorToQ", Glob)
Gui.Call("Add", "Text", "x+0 w0", "&X")
Gui.Call("Font", MonoFont*)
Gui.Call("Add", "Edit", "HwndEdit0 x+6 w0 h0 ReadOnly -Tabstop", &Glob)
Gui.Call("Add", "Edit", "HwndEditHex xp yp w68 h26 Uppercase Limit6 Right", Color)
AddGoSub.Call("EditHex", "ChooseColors_Hex", Glob)
Gui.Call("Font", TextFont*)
Gui.Call("-DpiScale")
RM := Glob.Old.W + Glob.Old.X
GuiControl.Call("Move", Glob.Okay.Hwnd, "x" . RM - Glob.Okay.W )
GuiControl.Call("Move", Glob.Cancel.Hwnd, "x" . RM - Glob.Okay.W - Glob.PickScr.X - Glob.Cancel.W)
NW := (Glob.History.W // 25) * 25
GuiControl.Call("Move", Glob.ColorName.Hwnd, "x" . (RM-NW) . " w" . (NW))
GuiControl.Call("Move", Glob.History.Hwnd, "x" . (RM-NW) . " w" . (NW))
GuiControl.Call("Move", Glob.PickScr.Hwnd, "x" . (RM-NW))
GuiControlGet.Call("Pos", Glob.PickScr.Hwnd, X, Y, W, H)
GuiControl.Call("Move", Glob.PickClr.Hwnd, "x" . (X + W + (8*(A_ScreenDPI/96))))
Gui.Call("+DpiScale")
Dim := Glob.Hue.W
ChooseColors_GradientStruct(Dim, VERT, MESH)
hMainBM := CreateBitmap.Call(Dim, Dim)
Glob.Func.MemDC.Call(hMainDC, hMainBM)
Glob.Func.GradientPaint := Func("ChooseColors_GradientPaint").Bind(hMainDC, &VERT, &MESH, Dim, Glob.Gradient.Hwnd)
Glob.Func.GradientSet := Func("ChooseColors_GradientSet").Bind(Glob.Gradient.Hwnd, hMainBM)
hMsimg32 := DllCall("Kernel32.dll\LoadLibrary", "Str","Msimg32.dll", "Ptr")
hShlwapi := DllCall("Kernel32.dll\LoadLibrary", "Str","Shlwapi.dll", "Ptr")
Glob.Func.HistorySetBitmap()
Gui.Call("Margin", 0, 12)
Gui.Call("Show", "Hide AutoSize xCenter yCenter")
Glob.Func.GradientPaint.Call("0x" . Color)
Glob.Func.GradientSet.Call()
Gui.Call("Show", ShowOptions . " AutoSize")
GuiControl.Call("", Glob.EditHex.Hwnd, Color)
If ( WinActive("ahk_id" . Glob.Gui.Hwnd) )
GuiControl.Call("Focus", Glob.EditHex.Hwnd)
SetBatchLines, %_Batchlines%
Glob.Okay := False
WinWaitClose, % "ahk_id" . Glob.Gui.Hwnd
Glob.Func.MemDC.Call(hMainDC, False)
Glob.Func.DeleteBitmap.Call(hMainBM)
DllCall("User32.dll\DestroyIcon", "Ptr",Glob.Gui.Hicon)
DllCall("Kernel32.dll\FreeLibrary", "Ptr",hMsimg32)
DllCall("Kernel32.dll\FreeLibrary", "Ptr",hShlwapi)
ChooseColors_RegisterClass(Glob, False) ; Unregister "CcStatic"
Return ( Glob.Okay ? StrSplit(Glob.Que, "|") : "" )
}
; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
ChooseColors_GuiOkay(Glob) {
If ! ( StrLen(Glob.Que) )
SoundPlay *-1
Else DllCall("SendMessage", "Ptr",Glob.Gui.Hwnd, "Int",0x10 * (Glob.Okay := True), "Ptr",0, "Ptr",0) ; WM_CLOSE
}
ChooseColors_GuiCancel(Glob) {
DllCall("SendMessage", "Ptr",Glob.Gui.Hwnd, "Int",0x10, "Ptr",0, "Ptr",0) ; WM_CLOSE
}
ChooseColors_GuiEscape(hGui) {
If ( GetKeyState("LButton", "P") = False )
DllCall("SendMessage", "Ptr",hGui, "Int",0x10, "Ptr",0, "Ptr",0) ; WM_CLOSE
Return
}
ChooseColors_GuiClose(hGui) {
Gui, %hGui%:Destroy
}
ChooseColors_GuiContextMenu(GuiHwnd, CtrlHwnd, EventInfo, IsRightClick, X, Y) {
Local
GuiControlGet, ObjPtr, %GuiHwnd%:, Edit7
Glob := Object(ObjPtr)
MouseGetPos,,,, hCtrl, 2
Switch ( hCtrl )
{
Case Glob.History.Hwnd : ChooseColors_HistoryMenu(Glob)
Case Glob.Gradient.Hwnd : ChooseColors_PaletteMenu(Glob, Glob.Gradient.Hwnd)
Case Glob.Preview.Hwnd : ChooseColors_PaletteMenu(Glob, Glob.Preview.Hwnd)
}
}
; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
ChooseColors_RegisterClass(Glob, Register:=1) {
Local
If ( Register=False )
{
DllCall("Kernel32.dll\GlobalFree", "Ptr",Glob.StaticProc, "Ptr")
Return DllCall("User32.dll\UnregisterClass", "Str","CcStatic", "Ptr",0)
}
P8 := (A_PtrSize=8), Classname := "CcStatic"
VarSetCapacity(WNDCLASS, P8 ? 72 : 40, 0)
DllCall("User32.dll\GetClassInfo", "Ptr",0, "Str","Static", "Ptr",&WNDCLASS)
OldProc := NumGet(WNDCLASS, A_PtrSize, "Ptr")
StaticProc := Glob.StaticProc := RegisterCallback("ChooseColors_CcStaticProc",, 4, OldProc)
hCursor := DllCall("User32.dll\LoadCursor", "Ptr",0, "Int",32649, "Ptr") ; IDC_HAND
NumPut(hCursor, WNDCLASS, P8 ? 40 : 24, "Ptr")
NumPut(StaticProc, WNDCLASS, A_PtrSize, "Ptr")
NumPut(&Classname, WNDCLASS, P8 ? 64 : 36, "Ptr")
Return DllCall("User32.dll\RegisterClass", "Ptr",&WNDCLASS)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_CcStaticProc(Hwnd, Msg, WP, LP) {
Local
If ( Msg = 2 ) ; WM_DESTROY
If ( Hbm := DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",0x173, "Ptr",0, "Ptr",0, "Ptr") ) ; STM_GETIMAGE
DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm)
Return DllCall("User32.dll\CallWindowProc", "Ptr",A_EventInfo, "Int",Hwnd, "Int",Msg, "Ptr",WP, "Ptr",LP)
}
; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
ChooseColors_Preview(Glob, hCtrl:=0) {
Local
If GetKeyState("Shift", "P")
Return ChooseColors_AddColorToQ(Glob, hCtrl, "")
Glob.Func.GetHexColor.Call(Color)
Hbm := Glob.Func.CreateBitmap.Call(1, 1)
DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",4*1, "UIntP","0x" . Color)
Glob.Func.SetImage.Call(Glob.Gradient.Hwnd, Hbm, True)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_HLS(Glob, hCtrl, GuiEvent, EventInfo) {
Local
If ( DllCall("User32.dll\GetFocus", "Ptr") != hCtrl )
Return
GuiControl := Glob.Func.GuiControl
GuiControlGet := Glob.Func.GuiControlGet
GuiControlGet.Call("", Glob.EditH.Hwnd, H:=0)
GuiControlGet.Call("", Glob.EditL.Hwnd, L:=0)
GuiControlGet.Call("", Glob.EditS.Hwnd, S:=0)
Color := DllCall("Shlwapi.dll\ColorHLSToRGB", "Short",H/1.5, "Short",L*2.4, "Short",S*2.4, "UInt")
Color := Format( "{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Format("{:06X}", Color))*)
GuiControl.Call("", Glob.EditHex.Hwnd, Color)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_RGB(Glob, hCtrl, GuiEvent, EventInfo) {
Local
If ( DllCall("User32.dll\GetFocus", "Ptr") != hCtrl )
Return
GuiControl := Glob.Func.GuiControl
GuiControlGet := Glob.Func.GuiControlGet
GuiControlGet.Call("", Glob.EditR.Hwnd, R)
GuiControlGet.Call("", Glob.EditG.Hwnd, G)
GuiControlGet.Call("", Glob.EditB.Hwnd, B)
Color := Format("{:02X}{:02X}{:02X}", Min(R, 255), Min(G, 255), Min(B, 255))
GuiControl.Call("", Glob.EditHex.Hwnd, Color)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GetHexColor(Glob, ByRef Color:="") {
Local
Glob.Func.GuiControlGet.Call("", Glob.EditHex.Hwnd, Color:="")
Return ( Color := Format("{:06X}", "0x" . Color) )
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_Hex(Glob, hEditHex, GuiEvent, EventInfo) {
Local
Critical On
Glob.Func.GetHexColor.Call(Hex)
Glob.Func.GuiControl.Call("+Background" . Hex, Glob.New.Hwnd)
Glob.Func.SetColorName.Call(Hex)
Glob.Func.UpdateRGBHSL.Call(Glob, Hex)
If ( Glob.Paint=True )
Glob.Func.GradientPaint.Call("0x" . Hex)
If ( GetKeyState("LButton", "P")=False )
{
GradientSet := Glob.Func.GradientSet
SetTimer, %GradientSet%, -100
}
Critical Off
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_UpdateRGBHSL(Glob, Hex) {
Local
hFocus := DllCall("User32.dll\GetFocus", "Ptr")
GuiControl := Glob.Func.GuiControl
Color := Format( "0x{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Hex)*)
DllCall("Shlwapi.dll\ColorRGBToHLS", "Int",Color, "ShortP",H:=0, "ShortP",L:=0, "ShortP",S:=0)
_ := ( Glob.EditH.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditH.Hwnd, Round(H*1.5))
, _ := ( Glob.EditL.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditL.Hwnd, Round(L/2.4))
, _ := ( Glob.EditS.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditS.Hwnd, Round(S/2.4))
, RGB := Format("0x{:x}", "0x" . Hex) + 0
, _ := ( Glob.EditR.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditR.Hwnd, RGB>>16 & 255)
, _ := ( Glob.EditG.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditG.Hwnd, RGB>>8 & 255)
, _ := ( Glob.EditB.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditB.Hwnd, RGB & 255)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GetMonitorRect(Hwnd, ByRef RECT:="", ByRef x1:=0, ByRef y1:=0, ByRef x2:=0, ByRef y2:=0) {
Local
hMon := DllCall("User32.dll\MonitorFromWindow", "Ptr",HWnd, "Int",0x2, "Ptr") ; _DEFAULTTONEAREST = 0x2
, VarSetCapacity(MONITORINFO, 40, 0), NumPut(40, MONITORINFO, "Int")
, DllCall("User32.dll\GetMonitorInfo", "Ptr",hMon, "Ptr",&MONITORINFO)
, VarSetCapacity(RECT, 16)
, x1 := NumGet(MONITORINFO, 4, "Int"), y1 := NumGet(MONITORINFO, 8, "Int")
, x2 := NumGet(MONITORINFO, 12, "Int"), y2 := NumGet(MONITORINFO, 16, "Int")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GetWindowRect(Hwnd, ByRef RECT:="", ByRef x1:=0, ByRef y1:=0, ByRef x2:=0, ByRef y2:=0) {
Local
VarSetCapacity(RECT, 16)
, DllCall("User32.dll\GetWindowRect", "Ptr",Hwnd, "Ptr",&RECT)
, x1 := NumGet(RECT,0, "Int"), y1 := NumGet(RECT,4, "Int")
, x2 := NumGet(RECT,8, "Int"), y2 := NumGet(RECT,12,"Int")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_SetRect(ByRef RECT, x1, y1, x2, y2) {
Local
VarSetCapacity(RECT, 16)
DllCall("User32.dll\SetRect", "Ptr",&RECT, "Int",x1, "Int",y1, "Int",x2, "Int",y2)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_SetSystemCursor(Which:=0, With:=0) {
Local
If ! ( Which ) ; SPI_SETCURSORS := 0x57
Return DllCall("User32.dll\SystemParametersInfo", "Int",0x57, "Int",0, "Int",0, "Int",0)
IDC := { "IDC_APPSTARTING":32650, "IDC_ARROW":32512, "IDC_CROSS":32515, "IDC_HAND":32649
, "IDC_HELP":32651, "IDC_IBEAM":32513, "IDC_NO":32648, "IDC_SIZEALL":32646, "IDC_SIZENESW":32643
, "IDC_SIZENS":32645, "IDC_SIZENWSE":32642, "IDC_SIZEWE":32644, "IDC_UPARROW":32516, "IDC_WAIT":32514 }
hCursor := DllCall("User32.dll\LoadCursor", "Ptr",0, "Int",IDC[With], "Ptr")
DllCall("User32.dll\SetSystemCursor", "Ptr",hCursor, "Int",IDC[Which])
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_ClipCursor(ByRef RECT:=0) {
Local
DllCall("User32.dll\ClipCursor", "Ptr",IsByRef(RECT) ? &RECT : 0)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GradientSet(hGradient, hMainBM) {
Local ; ; STM_GETIMAGE = 0x173
Hbm := DllCall("User32.dll\CopyImage", "Ptr",hMainBM, "Int",0x0, "Int",0, "Int",0, "Int",0x2000, "Ptr")
ChooseColors_SetImage(hGradient, Hbm)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GradientPaint(mDC, pVERT, pMESH, W, hGradient, Color) {
Local
Color := Format("{:06X}", Color & 0xFFFFFF)
, Color := Format("0x{5:}{6:}00{3:}{4:}00{1:}{2:}00", StrSplit(Color)*)
, NumPut(Color, pVERT+24, "Int64")
, DllCall("Msimg32.dll\GradientFill", "Ptr",mDC, "Ptr",pVERT, "Int",4, "Ptr",pMESH, "Int",2, "Int",2)
, hDC := DllCall("User32.dll\GetDC", "Ptr",hGradient, "Ptr")
, DllCall("Gdi32.dll\GdiAlphaBlend"
, "Ptr",hDC, "Int",0, "Int",0, "Int",W, "Int",W
, "Ptr",mDC, "Int",0, "Int",0, "Int",W, "Int",W, "Int",16711680) ; 0x00FF0000 = 16711680
, DllCall("User32.dll\ReleaseDC", "Ptr",hGradient, "Ptr",hDC)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GradientMemDC(ByRef mDC, W:=0) {
Local
If ( W )
Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",24, "PtrP",0, "Ptr")
, Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",W, "Int",0x200C, "Ptr")
, mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
, DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
, DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
Else
DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
, mDC := DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC) * 0
, Hbm := DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm) * 0
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GradientStruct(W, ByRef VERT, ByRef MESH) {
Local
VarSetCapacity(VERT, 4*16, 0), VarSetCapacity(MESH, 2*12, 0)
, NumPut(0xFE00CA00DE00, NumPut(0xFF00FF00FF00, VERT, 8, "Int64")+8, "Int64")
, NumPut(W, NumPut(W, NumPut(W, NumPut(W, VERT, 16, "Int")+16, "Int")+8, "Int"), "Int")
, NumPut(1, NumPut(3, NumPut(2, NumPut(2, NumPut(1, MESH, 4, "Int"), "Int"), "Int"), "Int"), "Int")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_SetNew(Glob, Color, Esc:=0) {
Local
Glob.Esc := Esc
Glob.Func.GuiControl.Call("Focus", Glob.EditHex.Hwnd)
Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_HueSelect2(Glob, hCtrl, GuiEvent, EventInfo) {
Local
Glob.Func.CoordMode.Call("Save")
MouseGetPos, X, Y
PixelGetColor, Color, %X%, %Y%, RGB
Color := SubStr(Color, 3)
Glob.Func.CoordMode.Call("Restore")
If ( InStr(Glob.Que, Color) = False )
Return
If ( GetKeyState("Shift", "P")=False )
Return ChooseColors_HueSelect(Glob, hCtrl, GuiEvent, EventInfo)
ChooseColors_DelColorFmQ(Glob, 0, Color)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_HueSelect(Glob, hCtrl, GuiEvent, EventInfo) {
Local
Glob.Func.Settings.Call("Save")
Glob.Func.GuiControl.Call("Focus", Glob.Edit0.Hwnd)
Glob.Func.GetWindowRect.Call(hCtrl, RECT, x1, y1, x2, y2)
If ( hCtrl = Glob.History.Hwnd )
StrReplace(Glob.Que, "|", "|", nColors:=0)
, W := x2 - x1
, x1 := x1 + (W // 25) * (24-nColors) + 1
, x2 -= 1
If ( hCtrl != Glob.Gradient.Hwnd )
y3 := y1 + ((y2-y1)//2)
, _ := Glob.Func.SetRect.Call(RECT, x1, y3, x2, y3+1)
Else ( Glob.Paint := False )
Glob.Func.ClipCursor.Call(RECT)
PColor := 0, Color := ""
While ( WinActive(Glob.CCUI) && GetKeyState("LButton", "P") && !GetKeyState("Escape", "P") )
{
Sleep 1
MouseGetPos, X, Y
PixelGetColor, Color, %X%, %Y%, RGB
Color := SubStr(Color,3)
If ( Glob.Func.Keypressed() )
ChooseColors_AddColorToQ(Glob, 0, Color)
If ( PColor != Color )
Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, PColor:=Color)
}
Glob.Esc := ( GetKeyState("Escape", "P")=True || WinActive(Glob.CCUI)=False )
Glob.Func.ClipCursor.Call(False)
If ( Glob.Esc )
Glob.Func.Settings.Call("Restore")
Else
{
If ( hCtrl=Glob.History.Hwnd )
ChooseColors_AddColorToQ(Glob, 0, Color)
Glob.Func.Settings.Call("Clear")
}
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_Slider(Glob, hCtrl, GuiEvent, EventInfo) {
Local
Glob.Func.Settings.Call("Save")
Glob.Func.GuiControlGet.Call("", hCtrl, hUpDown:=0)
DllCall("SendMessage", "Ptr",hUpDown, "Int",UDM_GETRANGE32 := 0x470, "PtrP",Min:=0, "PtrP",Max:=0)
Glob.Func.GuiControlGet.Call("", hUpdown, Pos:=0)
Glob.Func.GuiControl.Call("", hUpDown, Pos)
hBuddy := DllCall("User32.dll\SendMessage", "Ptr",hUpDown, "Int",UDM_GETBUDDY := 0x46A, "Ptr",0, "Ptr",0, "Ptr")
Glob.Func.GuiControl.Call("Focus", hBuddy)
Glob.Func.GetWindowRect.Call(hCtrl, RECT, x1, y1, x2, y2)
y3 := y1 + ((y2-y1)//2) ; Vertical center
W := x2 - x1 - 1 ; Width of control
X := X1 + Round(W * (Pos/Max)) ; Find X pos for MouseMove
Glob.Func.SetRect.Call(RECT, x1, y3, x2, y3+1)
SavedX := X
MouseMove, %X%, %y3%, 0
Glob.Func.ClipCursor.Call(RECT)
PX := 0
While ( WinActive(Glob.CCUI) && GetKeyState("LButton", "P") && !GetKeyState("Escape", "P") )
{
Sleep 1
If ( Glob.Func.Keypressed() )
Color := Glob.Func.GetHexColor.Call()
, ChooseColors_AddColorToQ(Glob, 0, Color)
MouseGetPos, X
If ( PX = X )
Continue
Else PX := X
Val := ( (X-X1) / W )
Glob.Func.GuiControl.Call("", hUpDown, Max*Val)
If ( Max=255 )
Tooltip % Round(Val*100) . "%",,, 20
}
Glob.Esc := ( GetKeyState("Escape", "P")=True || WinActive(Glob.CCUI)=False )
Glob.Func.ClipCursor.Call(False)
If ( Max=255 )
Tooltip,,,, 20
If ( Glob.Esc )
Glob.Func.Settings.Call("Restore")
Else Glob.Func.Settings.Call("Clear")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_PickScr(Glob, hCtrl, GuiEvent, EventInfo) {
Local
Glob.Func.Settings.Call("Save")
TW := Glob.Hue.W
Glob.Func.GetWindowRect.Call(hCtrl, RECT, x1, y1, x2, y2)
x1 := x1 + ((x2-x1)/2)
y1 := y1 + ((y2-y1)/2)
Glob.Func.SetRect.Call(RECT, x1, y1, x1+1, y1+1)
Glob.Func.ClipCursor.Call(RECT)
Glob.Func.ClipCursor.Call(False)
Glob.Func.GuiControl.Call("Focus", Glob.Edit0.Hwnd)
Glob.Func.GetHexColor.Call(CurrentColor)
Glob.Func.GuiControlGet.Call("", Glob.ColorName.Hwnd, ColorName)
PickClr := ( hCtrl = Glob.PickClr.Hwnd )
SW := ( PickClr ? 1 : 40*(A_ScreenDPI/96) )
Off := ( PickClr ? 0 : SW//2 )
Hbm := Glob.Func.CreateBitmap.Call(SW, SW)
Glob.Func.MemDC.Call(mDC:=0, Hbm)
sWnd := DllCall("User32.dll\GetDesktopWindow", "Ptr")
sDC := DllCall("User32.dll\GetWindowDC", "Ptr",sWnd, "Ptr")
tDC := DllCall("User32.dll\GetWindowDC", "Ptr",Glob.Gradient.Hwnd, "Ptr")
Glob.Func.GetMonitorRect.Call(Glob.Gui.Hwnd, RECT, x1, y1, x2, y2)
Glob.Func.SetRect.Call(RECT, x1+Off, y1+Off, x2-Off, y2-Off)
DllCall("SetForegroundWindow","Ptr",A_ScriptHwnd)
Glob.Func.ClipCursor.Call(RECT)
If ( Glob.PickClr.Hwnd )
ChooseColors_BoxCur(SW, SW)
Else Glob.Func.SetSystemCursor.Call("IDC_ARROW", "IDC_HELP")
Glob.Paint := False
Color := ""
While ( GetKeyState("LButton", "P") && ! GetKeyState("Escape", "P") )
{
Sleep 0
Glob.Func.ClipCursor.Call(RECT)
MouseGetPos, X, Y
X -= Off, Y -= Off
DllCall("Gdi32.dll\GdiAlphaBlend"
, "Ptr",mDC, "Int",0, "Int",0, "Int",SW, "Int",SW
, "Ptr",sDC, "Int",X, "Int",Y, "Int",SW, "Int",SW, "Int",0x00FF0000)
DllCall("Gdi32.dll\GdiAlphaBlend"
, "Ptr",tDC, "Int",0, "Int",0, "Int",TW, "Int",TW
, "Ptr",mDC, "Int",0, "Int",0, "Int",SW, "Int",SW, "Int",0x00FF0000)
Color := DllCall("Gdi32.dll\GetPixel", "Ptr",mDC, "Int",Off, "Int",Off, "UInt")
Color := Format("{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Format("{:06X}", Color))*)
Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color)
If ( Glob.Func.Keypressed() )
ChooseColors_AddColorToQ(Glob, 0, Color)
}
Glob.Esc := ( GetKeyState("Escape", "P") || StrLen(Color)=0 )
Glob.Func.GuiControl.Call("-g", Glob.EditHex.Hwnd)
Glob.Func.SetSystemCursor.Call(False)
Glob.Func.ClipCursor.Call(False)
DllCall("User32.dll\ReleaseDC", "Ptr",sWnd, "Ptr",sDC)
DllCall("User32.dll\ReleaseDC", "Ptr",Glob.Gradient.Hwnd, "Ptr",tDC)
Glob.Func.MemDC.Call(mDC)
If ( Glob.Esc )
Glob.Func.DeleteBitmap.Call(Hbm)
, Glob.Func.Settings.Call("Restore")
Else Glob.Func.SetImage.Call(Glob.Gradient.Hwnd, Hbm, True)
, Glob.Func.Settings.Call("Clear")
Glob.Func.Gui.Call("Show")
Glob.Func.GuiControl.Call("+g", Glob.EditHex.Hwnd, Glob.Func.EditHex)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GenRandom(Glob) {
Local
Hbm := Glob.Func.CreateBitmap.Call(5, 5)
VarSetCapacity(BMBITS, 16*5, 0), pBits := &BMBITS
DllCall("Advapi32.dll\SystemFunction036", "Ptr",&BMBITS, "Int",16*5)
DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",16*5, "Ptr",&BMBITS)
Color := Format("{3:02x}{2:02X}{1:02X}", *(pBits+38), *(pBits+39), *(pBits+40))
Glob.Func.GuiControl.Call("-g", Glob.EditHex.Hwnd)
Glob.Func.GuiControl.Call("Focus", Glob.EditHex.Hwnd)
Glob.Func.UpdateRGBHSL.Call(Glob, Color)
Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color)
Glob.Func.GuiControl.Call("+Background" . Color, Glob.New.Hwnd)
Glob.Func.SetColorName.Call(Color)
Glob.Func.GuiControl.Call("+g", Glob.EditHex.Hwnd, Glob.Func.EditHex)
Glob.Func.SetImageAnimate.Call(Hbm)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_Settings(Glob, Mode) {
Local
If ( Mode="Save" )
{
Glob.Func.CoordMode.Call("Save")
Glob.Func.GetImage.Call(Glob.Gradient.Hwnd, Obm)
Glob.Func.GuiControlGet.Call("", Glob.ColorName.Hwnd, ColorName)
Glob.Func.GetHexColor.Call(CurrentColor)
Glob.Settings := { "Obm":Obm, "CurrentColor":CurrentColor, "ColorName":ColorName, "A_BatchLines":A_BatchLines }
SetBatchLines -1
Return
}
If ( Mode="Restore" )
{
Glob.Func.GuiControl.Call("-g", Glob.EditHex.Hwnd)
Glob.Func.GuiControl.Call("Focus", Glob.EditHex.Hwnd)
Glob.Func.UpdateRGBHSL.Call(Glob, Glob.Settings.CurrentColor)
Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Glob.Settings.CurrentColor)
Glob.Func.GuiControl.Call("", Glob.ColorName.Hwnd, Glob.Settings.ColorName)
Glob.Func.GuiControl.Call("+Background" . Glob.Settings.CurrentColor, Glob.New.Hwnd)
Glob.Func.SetImageAnimate.Call(Glob.Settings.Obm)
Glob.Settings.Obm := 0
Glob.Func.GuiControl.Call("+g", Glob.EditHex.Hwnd, Glob.Func.EditHex)
}
If ( Glob.Settings.Obm )
{
Glob.Func.DeleteBitmap.Call(Glob.Settings.Obm)
Glob.Func.GetHexColor.Call(Color)
Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color)
}
Glob.Esc := False
Glob.Paint := True
Glob.Settings := {}
Glob.Func.CoordMode.Call("Restore")
SetBatchLines, % Glob.Settings.A_BatchLines
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_CoordMode(Glob, Mode) {
Local
Loop, Parse, % "A_CoordModeToolTip|A_CoordModePixel|A_CoordModeMouse|A_CoordModeCaret|A_CoordModeMenu", |
If ( Mode="Save" )
CoordMode, % SubStr(A_LoopField,12) . SubStr(Glob.CoordMode[A_LoopField] := %A_LoopField%, 1,0), Screen
Else CoordMode, % SubStr(A_LoopField,12), % Glob.CoordMode[A_LoopField]
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_DelColorFmQ(Glob, hCtrl:=0, Color:="" ) {
Local
If ( hCtrl )
Glob.Func.GetHexColor.Call(Color:="")
If ( Color="" )
Glob.Que := ""
Else Glob.Que := ChooseColors_StrQ(Glob.Que, Color)
, Glob.Que := StrSplit(Glob.Que, "|",, 2).2
Glob.Func.HistorySetBitmap()
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_AddColorToQ(Glob, hCtrl, Color) {
Local
If ( hCtrl )
Glob.Func.GetHexColor.Call(Color:="")
Glob.Que := ChooseColors_StrQ(Glob.Que, Color)
Glob.Func.HistorySetBitmap()
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_HistorySetBitmap(Glob) {
Local
Hbm := Glob.Func.CreateBitmap.Call(25, 1, 0, 32)
VarSetCapacity(BMBITS, 100, 0), n := pBits := &BMBITS+100, i := Ok := 0
Loop, Parse, % Glob.Que, |
pBits := Numput("0x" . A_LoopField, pBits-4, "UInt") - 4, i := Ok := A_Index
Loop % ( 25-i )
pBits := Numput(0xFFFFFF, pBits-4, "UInt") - 4
DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "Int",100, "Ptr",&BMBITS)
Glob.Func.SetImage.Call(Glob.History.Hwnd, Hbm, True)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_StrQ(Q, I, Max:=16, D:="|") { ; StrQ v.0.91, By SKAN on D09F/D46R @ tiny.cc/strq
Return ( StrLen(Q)=0 ? I : InStr(I, D) ? Q : Q=I ? Q : SubStr(Q := StrLen(I) ? (I . D
. Trim(StrReplace((D . Q . D), (D . I . D), D), D) . D) : (Q . D), 1
, (I := InStr(Q, D, 0, 1, Max)) ? I-1 : Max<1 ? 0 : StrLen(Q)-1) )
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_MemDC(ByRef mDC, Hbm:=0) {
Local
If ( Hbm )
mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
, DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
, DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
Else DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
, mDC := DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC) * 0
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_ShowMenu(Hwnd, MenuName, BottomAlign:=0) {
Local
VarSetCapacity(RECT, 16)
DllCall("User32.dll\GetWindowRect", "Ptr",Hwnd, "Ptr",&RECT)
x1 := NumGet(RECT,0, "Int"), x2 := NumGet(RECT,8, "Int"), XCenter := X1 + ((X2-X1)//2)
DllCall("User32.dll\GetCursorPos", "Ptr",&RECT)
CX := NumGet(RECT, 0, "Int"), CY := NumGet(RECT, 4, "Int")
TPM_RIGHTALIGN := 0x08, TPM_BOTTOMALIGN := 0x20
Flags := ( CX>XCenter ? TPM_RIGHTALIGN : 0 ) | (BottomAlign ? TPM_BOTTOMALIGN : 0)
CX := ( CX>XCenter ? x2-4 : x1+4 )
DllCall("User32.dll\TrackPopupMenu", "Ptr",MenuGetHandle(MenuName), "Int",Flags
,"Int",CX, "Int",CY, "Int",0, "Ptr",Hwnd, "Ptr",0, "UInt")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_HistoryMenu(Glob) {
Local
Glob.Func.CoordMode.Call("Save")
MouseGetPos, X, Y
PixelGetColor, Color, %X%, %Y%, RGB
Color := SubStr(Color, 3)
Glob.Func.CoordMode.Call("Restore")
Glob.Func.GetHexColor.Call(Hex:="")
ClearHistory := Func("ChooseColors_DelColorFmQ").Bind(Glob, 0, "")
DelColorFmQ := Func("ChooseColors_DelColorFmQ").Bind(Glob, 0, Color)
AddColorToQ := Func("ChooseColors_AddColorToQ").Bind(Glob, 0, Color)
Menu, ChooseColors, UseErrorLevel
If ( InStr(Glob.Que, Color) )
{
Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Color), 32)
MenuName := "Delete`tShift+Click"
Menu, ChooseColors, Add, %MenuName%, %DelColorFmQ%
Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm%
If ( Color != Hex )
{
Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Color), 32)
MenuName := "Set as New`tClick"
SetNew := Func("ChooseColors_SetNew").Bind(Glob, Color)
Menu, ChooseColors, Add, %MenuName%, %SetNew%
Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm%
}
}
If ( InStr(Glob.Que, Hex) = False )
{
Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Hex), 32)
AddColorToQ := Func("ChooseColors_AddColorToQ").Bind(Glob, 0, Hex)
MenuName := "Add`tAlt+A"
Menu, ChooseColors, Add, %MenuName%, %AddColorToQ%
Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm%
}
Menu, ChooseColors, Add, Clear History, %ClearHistory%
If ( StrLen(Glob.Que) = 0 )
Menu, ChooseColors, Disable, Clear History
ChooseColors_ShowMenu(Glob.Gui.Hwnd, "ChooseColors", True)
Menu, ChooseColors, DeleteAll
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_PaletteMenu(Glob, hCtrl) {
Local
Glob.Func.CoordMode.Call("Save")
MouseGetPos, X, Y
PixelGetColor, Color, %X%, %Y%, RGB
Color := SubStr(Color, 3)
Glob.Func.CoordMode.Call("Restore")
CreatePalette := Func("ChooseColors_CreatePalette").Bind(Glob)
CreateRandom := Func("ChooseColors_GenRandom").Bind(Glob)
AddColorToQ := Func("ChooseColors_AddColorToQ").Bind(Glob, 0, Color)
DelColorFmQ := Func("ChooseColors_DelColorFmQ").Bind(Glob, 0, Color)
Preview := Func("ChooseColors_Preview").Bind(Glob)
Menu, ChooseColors, UseErrorLevel
Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Color), 32)
MenuName := "Add #" . Color . (hCtrl = Glob.Preview.Hwnd ? "`tAlt+A" : "")
Menu, ChooseColors, Add, %MenuName%, %AddColorToQ%
Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm%
Menu, ChooseColors, Add, Random colors `tAlt+N, %CreateRandom%
If ( hCtrl = Glob.Preview.Hwnd )
{
If InStr(Glob.Que, Color)
Menu, ChooseColors, Insert, 2&, Delete #%Color% `tAlt+D, %DelColorFmQ%
Menu, ChooseColors, Insert, 3&, Preview color`tClick, %Preview%
}
If ( hCtrl = Glob.Gradient.Hwnd )
{
Menu, ChooseColors, Add ; Add separator
N := 1, ErrorLevel := 0, I := 0
While ( Section := ChooseColors_xStr(Glob.Menu,, "|[", "]|", N,,,, 0, 0) )
If ( Section := Trim(Section, "[|]") )
{
I += 1
Menu, ChooseColors, Add, %Section%, %CreatePalette%
}
If ( I = 0 )
Menu, ChooseColors, Delete, 3& ; Remove separator
}
ChooseColors_ShowMenu(Glob.Gui.Hwnd, "ChooseColors", hCtrl = Glob.Preview.Hwnd)
Menu, ChooseColors, DeleteAll
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_CreatePalette(Glob, Section) {
Local
Colors := "", Count := 0
Section := ChooseColors_xStr(Glob.Menu,, "|[" . Section . "]|", "[")
Loop, Parse, Section, |
If ( StrLen(L := StrSplit(A_LoopField, "=", A_Space).1) = 6 )
If L is xdigit
Colors .= L . "|", Count += 1
If ( Count = 0 )
Return
Else Colors := RTrim(Colors, "|")
If ( Count <= 25 )
W := ( H := 5 )
Else W := ( H := Ceil(Sqrt(Count)) )
VarSetCapacity(BMBITS, W*H*4), pBits := &BMBITS
Loop, Parse, Colors, |
pBits := NumPut("0x" . A_LoopField, pBits+0, "Int"), I := A_Index
Loop % ((W*H)-I)
pBits := NumPut(Glob.SysColor, pBits+0, "Int")
Hbm := Glob.Func.CreateBitmap.Call(W, H, 0, 32)
DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",(W*4)*H, "Ptr",&BMBITS)
Glob.Func.SetImageAnimate.Call(Hbm)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_SetColorName(Glob, Color) {
Local
ColorName := ChooseColors_xStr(Glob.Menu,, "|" . Color . "=", "|")
Glob.Func.GuiControl.Call("", Glob.ColorName.Hwnd, ColorName)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_xStr(ByRef H, C:=0, B:="", E:="",ByRef BO:=1, EO:="", BI:=1, EI:=1, BT:="", ET:="") {
Local L, LB, LE, P1, P2, Q, N:="", F:=0 ; xStr v0.97 by SKAN on D1AL/D343 @ tiny.cc/xstr
Return SubStr(H,!(ErrorLevel:=!((P1:=(L:=StrLen(H))?(LB:=StrLen(B))?(F:=InStr(H,B,C&1,BO,BI))?F+(BT=N?LB
:BT):0:(Q:=(BO=1&&BT>0?BT+1:BO>0?BO:L+BO))>1?Q:1:0)&&(P2:=P1?(LE:=StrLen(E))?(F:=InStr(H,E,C>>1,EO=N?(F
?F+LB:P1):EO,EI))?F+LE-(ET=N?LE:ET):0:EO=N?(ET>0?L-ET+1:L+1):P1+EO:0)>=P1))?P1:L+1,(BO:=Min(P2,L+1))-P1)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GoSub(Glob, HwndName, FunctionName, Bind*) {
Local
Glob.Func.GuiControl.Call("+g", Glob[HwndName].Hwnd, Func(FunctionName).Bind(Bind*))
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_Keypress(Keyname) {
Local
If ! GetKeyState(Keyname, "P")
Return 0
KeyWait, %KeyName%
Return ! Errorlevel
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_Gui(Glob, SubCommand, Value1:="", Value2:="", Value3:="") {
Local
Subcommand := Glob.Gui.Hwnd . ":" . Subcommand
Repl := { "SS_REALSIZECONTROL":0x40, "SS_BITMAP":0xE, "SS_ICON":0x3, "SS_NOTIFY":0x100
, "CcStatic": "ClassCcStatic -Tabstop", "SS_CENTERIMAGE":0x200, "WS_EX_STATICEDGE":"E0x20000" }
For K,V in Repl
Value2 := StrReplace(Value2, K, V)
Gui, %SubCommand%, %Value1%, % Value2 . (InStr(Value2, "Hwnd") ? " HwndHwnd" : ""), %Value3%
If ( Var := StrSplit(StrSplit(Value2, "Hwnd").2, A_Space).1 )
{
Gui, % Glob.Gui.Hwnd . ":-DPIScale"
GuiControlGet, _, % Glob.Gui.Hwnd . ":Pos", %Hwnd%
Glob[Var] := {"Hwnd":Hwnd, "X":_X, "Y":_Y, "W":_W, "H":_H}
Gui, % Glob.Gui.Hwnd . ":+DPIScale"
}
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GuiControl(Glob, SubCommand:="", ControlID:="", Value:="") {
Local
Subcommand := Glob.Gui.Hwnd . ":" . Subcommand
GuiControl, %SubCommand%, %ControlID%, %Value%
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GuiControlGet(Glob, SubCommand:="", ControlID:=""
, ByRef _X:="", ByRef _Y:=0, ByRef _W:=0, ByRef _H:=0, ByRef _:="") {
Local
VarSetCapacity(_X, 3, 0)
Subcommand := Glob.Gui.Hwnd . ":" . Subcommand
GuiControlGet, _, %SubCommand%, %ControlID%
_X := StrLen(_) ? _ : _X
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_AddUpDown(Glob, EditControl, Options, ByRef Hwnd:=0) {
Local
Glob.Func.Gui.Call("Add", "UpDown", Options)
Glob.Func.Gui.Call("-Dpiscale")
Glob.Func.GuiControl.Call("Move", Glob.Updown.Hwnd, "w0")
Glob.Func.GuiControl.Call("Move", Glob[EditControl].Hwnd, "w" . Glob[EditControl].W)
Glob.Func.Gui.Call("+Dpiscale")
Func := Func("ChooseColors_UpDown").Bind(Glob, Glob.Updown.Hwnd, Glob[EditControl].Hwnd)
Glob.Func.GuiControl.Call("+g", Glob.Updown.Hwnd, Func)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_UpDown(Glob, hUpDown, hBuddy) {
Local
If ( hBuddy = DllCall("User32.dll\GetFocus", "Ptr") )
Return
DllCall("User32.dll\SetFocus", "Ptr",hBuddy)
Glob.Func.GuiControlGet.Call("", hUpDown, Val:=0)
Glob.Func.GuiControl.Call("", hBuddy, Val)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_CreateBitmap(W:=0, H:=0, Color:=0, BPP:=24) {
Local
Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",BPP, "Ptr",0, "Ptr")
Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",1, "Int",1, "Int",0x2008, "Ptr")
DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",4, "UIntP",Color)
Return DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",H, "Int",0x2008, "Ptr")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_DeleteBitmap(Hbm) {
Local
Return DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_SetImage(Hwnd, Hbm, Redraw:=0) {
Local STM_SETIMAGE = 0x172, STM_GETIMAGE := 0x173, WM_SETREDRAW := 0xB, Obm := 0
DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",WM_SETREDRAW, "Ptr",Redraw, "Ptr",0, "Ptr")
Obm := DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",STM_SETIMAGE, "Ptr",0, "Ptr",Hbm, "Ptr")
DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",WM_SETREDRAW, "Ptr",True, "Ptr",0, "Ptr")
If ( Obm )
Obm := DllCall("Gdi32.dll\DeleteObject", "Ptr",Obm) * 0
Obm := DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",STM_GETIMAGE, "Ptr",0, "Ptr",0, "Ptr")
If ( Obm != Hbm )
Hbm := DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm) * 0
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GetImage(Hwnd, ByRef Hbm:=0, Copy:=1) { ; this function returns copy of image
Local STM_GETIMAGE := 0x173
Hbm := DllCall("user32.dll\SendMessage", "Ptr",Hwnd, "Int",STM_GETIMAGE, "Ptr",0, "Ptr",0, "Ptr")
If ( Copy ) ; LR_CREATEDIBSECTION = 0x2000
Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0, "Int",0, "Int",0, "Int",0x2000, "Ptr")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_CreateGradient(W, H, V:=0, Colors*) { ; by SKAN on D46L/D46L @ tiny.cc/creategradient
Local
N := ( Colors := Colors.Count()>1 ? Colors : [ 0, 16777215, 0 ] ).Count()
xOFF := (X := V ? W : 0) ? 0 : Ceil(W/(N-1))
yOFF := (Y := V ? 0 : H) ? 0 : Ceil(H/(N-1))
VarSetCapacity(VERT, N*16, 0)
VarSetCapacity(MESH, N*8, 0)
Loop % ( N, pVert:=&VERT, pMesh:=&MESH )
X := V ? (X=0 ? W : X:=0) : X
, Y := !V ? (Y=0 ? H : Y:=0) : Y
, Color := Format("{:06X}", Colors[A_Index] & 0xFFFFFF)
, Color := Format("0x{5:}{6:}00{3:}{4:}00{1:}{2:}00", StrSplit(Color)*)
, pVert := NumPut(Color, NumPut(Y, NumPut(X, pVert+0, "Int"), "Int"), "Int64")
, pMesh := NumPut(A_Index, NumPut(A_Index-1, pMesh+0, "Int"), "Int")
, Z := V ? (Y += yOFF) : (X += xOFF)
Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",32, "PtrP",0, "Ptr")
Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",H, "Int",0x2008, "Ptr")
mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
DllCall("Msimg32.dll\GradientFill", "Ptr",mDC, "Ptr",&VERT, "Int",N, "Ptr",&MESH, "Int",N-1, "Int",!!V)
DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC)
Return Hbm
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_GetIcon(Filename, W:=0, H:=0) {
Local
Switch ( FileName )
{
Case "caption.png" : Base64PNG := "
( LTrim Join
iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAApUlEQVRIie1VAQqDMAy8yD7jK3XPlrRkWKyELFanLQO3gxAx5S5J05ZEZIQBEaUfIm
JDLkrru0MMF/AX2MUjb5CHUuzo+vYVeKO1jt2EARFAAJKfjRcfFmOAejxxakwteTDk2UoVFKOa0Gavv08L5My91lSpQBNuifAVAS9b3R6uKdCkRVsZ
B+VjywpijRaxIfuwRfORfXtwauLLd9HPP5k3EADwAsmVfeJ0bmDRAAAAAElFTkSuQmCC
)"
Case "pickscr.png" : Base64PNG := "
( LTrim Join
iVBORw0KGgoAAAANSUhEUgAAABcAAAAXAgMAAACdRDwzAAAACVBMVEUAAAD///8AAABzxoNxAAAAA3RSTlMAv7/C9di0AAAAQUlEQVQI12NYtZKBcd
UKhqmhDIyhEQwTGIBAAp3SWrVqAZBSDQ1NkGAIAFEiDAwgioF4CqoPYgrMTKz2Qd0CdRkAcTwhFlkgH1gAAAAASUVORK5CYII=
)"
Case "pickclr.png" : Base64PNG := "
( LTrim Join
iVBORw0KGgoAAAANSUhEUgAAABcAAAAXAgMAAACdRDwzAAAACVBMVEUAAAD///8AAABzxoNxAAAAA3RSTlMAv7/C9di0AAAATUlEQVQI12NYtZKBcd
UKhqmhDIyhEQwTGIBAAkixOoApNkwqAESJMDCAKBBgBVJAvQGioUBq1QSplVAeTA6qEqYP00y4fVDboW6BugwAhowXw6cdQ8QAAAAASUVORK5CYII=
)"
Default : Base64PNG := ""
}
Return ChooseColors_PNG2HICON(Base64PNG, W, H)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_PNG2HICON(Base64PNG, W:=0, H:=0) { ; By SKAN on D094/D46Q @ tiny.cc/t-36636
Local
VarSetCapacity(Bin, nBytes := Floor((B64Len := StrLen(Base64PNG := RTrim(Base64PNG,"=")))*3/4))
Return DllCall("Crypt32.dll\CryptStringToBinary", "Str",Base64PNG, "Int",B64Len, "Int",1, "Ptr",&Bin
,"UIntP",nBytes, "Int",0, "Int",0)
? DllCall("User32.dll\CreateIconFromResourceEx", "Ptr",&Bin, "Int",nBytes, "Int",True
,"Int",0x30000, "Int",W, "Int",H, "Int",0, "Ptr") : 0
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_CreateBitmapText(Glob, hTxt) { ; modified ver of TextToPic() v0.50
Local ; by SKAN on D475/D475 @ tiny.cc/t92338
ControlGetText, Text,, ahk_id %hTxt%
hFnt := DllCall("User32.dll\SendMessage", "Ptr",hTxt, "Int",0x31, "Ptr",0, "Ptr",0, "Ptr") ; WM_GETFONT
VarSetCapacity(RECT, 16)
DllCall("User32.dll\GetClientRect", "Ptr",hTxt, "Ptr",&RECT)
x1 := NumGet(RECT,0, "Int"), y1 := NumGet(RECT,4, "Int")
x2 := NumGet(RECT,8, "Int"), y2 := NumGet(RECT,12,"Int")
W := x2-x1, H := y2-y1
FileGetVersion, OSV, user32.dll
LRFlag := Format("{1:}.{2:}", StrSplit(OSV,".")*) > 6.3 ? 0x8 : 0x2008
WindowColor := Format("0x{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Format("{:06X}"
, DllCall("User32.dll\GetSysColor", "Int",15)))*)
Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",24, "Ptr",0, "Ptr")
Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",1, "Int",1, "Int",0x2008, "Ptr")
DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",4, "UIntP",WindowColor)
Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",H, "Int",LRFlag, "Ptr")
hBrush := DllCall("CreateSolidBrush", "Int",0x998877, "Ptr")
hPen := DllCall("CreatePen", "Int",0, "Int",1, "Int",0xFAFAFA, "Ptr" )
mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBrush)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hPen)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
DllCall("Gdi32.dll\RoundRect", "Ptr",mDC, "Int",0, "Int",0, "Int",W, "Int",H, "Int",H*.45, "Int",H*.45)
DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
DllCall("Gdi32.dll\DeleteObject", "Ptr",hBrush)
DllCall("Gdi32.dll\DeleteObject", "Ptr",hPen)
Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0, "Int",W*5, "Int",H*5, "Int",LRFlag, "Ptr")
Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0, "Int",W, "Int",H, "Int",0x2008, "Ptr")
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hFnt)
DllCall("Gdi32.dll\SetTextColor", "Ptr",mDC, "Int",0xE3E3E3)
DllCall("Gdi32.dll\SetBkMode", "Ptr",mDC, "Int",1) ; TRANSPARENT=1
DllCall("User32.dll\DrawText", "Ptr",mDC, "Str",Text, "Int",StrLen(Text), "Ptr",&RECT, "Int",0x25)
DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC)
Return Hbm
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_SetImageAnimate(Glob, Hbm) {
Local
VarSetCapacity(BITMAP, Sz := A_PtrSize=8 ? 32 : 24 )
DllCall("Gdi32.dll\GetObject", "Ptr",Hbm, "Int",Sz, "Ptr",&BITMAP)
SW := Numget(BITMAP, 4, "UInt")
SH := Numget(BITMAP, 8, "UInt")
TH := TW := Glob.Gradient.W
tDC := DllCall("User32.dll\GetWindowDC", "Ptr",Glob.Gradient.Hwnd, "Ptr")
mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
Loop , Parse, % "2,4,8,12,16,20,24,28,32,36,40,48,96,128,192,255", `,
{
DllCall("Gdi32.dll\GdiAlphaBlend"
, "Ptr",tDC, "Int",0, "Int",0, "Int",TW, "Int",TH
, "Ptr",mDC, "Int",0, "Int",0, "Int",SW, "Int",SH, "Int",A_LoopField<<16)
Sleep 1
}
DllCall("User32.dll\ReleaseDC", "Ptr",Glob.Gradient.Hwnd, "Ptr",tDC)
DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC)
Glob.Func.SetImage.Call(Glob.Gradient.Hwnd, Hbm, False)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ChooseColors_BoxCur(P*) { ; v0.3 by SKAN on D47J/D47K @ tiny.cc/boxcur
Local
If ! ( P.Count() )
Return DllCall("User32.dll\SystemParametersInfo", "Int",SPI_SETCURSORS := 0x57, "Int",0, "Int",0, "Int",0)
CW := Max( 32, Format("{:d}", P[1]) )
CH := Max( 32, Format("{:d}", P[2]) )
RegRead, m, HKEY_CURRENT_USER\Control Panel\Cursors, CursorBaseSize
m := ( (m := Format("{:d}", m)) > 32 ? m/32 : 1 )
CW := Round(CW/m)
CH := Round(CH/m)
VarSetCapacity(BITMAPINFO, 40, 0)
pBMI := &BITMAPINFO, pBits := 0
NumPut(1, NumPut(1,NumPut(CH,NumPut(CW,NumPut(40,pBMI+0,"Int"),"Int"),"Int"),"Short"),"Short")
hBM := DllCall("gdi32.dll\CreateDIBSection", "Ptr",0, "Ptr",pBMI, "Int",0, "PtrP",pBits, "Ptr",0, "Int", 0, "Ptr")
hPen := DllCall("Gdi32.dll\CreatePen", "Int",0, "Int",1, "Int",0xFFFFFF, "Ptr")
hBrush := DllCall("Gdi32.dll\CreateSolidBrush", "Int",m!=1 || P[3]!="" ? 0xFFFFFF : 0x000000, "Ptr")
mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBrush)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hPen)
DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBM)
DllCall("Gdi32.dll\RoundRect", "Ptr",mDC, "Int",0, "Int",0, "Int",CW, "Int",CH, "Int",0, "Int",0)
DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC)
DllCall("Gdi32.dll\DeleteObject", "Ptr",hBrush)
DllCall("Gdi32.dll\DeleteObject", "Ptr",hPen)
VarSetCapacity( BITMAP, SzBITMAP := ( A_PtrSize = 8 ? 32 : 24 ) )
DllCall("Gdi32.dll\GetObject", "Ptr",hBM, "Int",SzBITMAP, "Ptr",&BITMAP)
WB := Numget(BITMAP, 12, "Int")
biSize := (WB*CH) * 2
ttlSize := 22 + 40 + 8 + biSize
pCURSOR := DllCall("Kernel32.dll\GlobalAlloc", "Int",0x40, "Ptr",ttlSize, "Ptr")
NumPut(0x0100020000, pCURSOR + 0, "Int64")
NumPut(CW, pCURSOR + 6, "UChar")
NumPut(CH, pCURSOR + 7, "UChar")
NumPut(40 + 8 + biSize, pCURSOR + 14, "UInt")
NumPut(22, pCURSOR + 18, "UInt")
NumPut(0xFFFFFF, pCURSOR + 66, "UInt")
NumPut(CW, pBMI + 4, "UInt")
NumPut(CH*2, pBMI + 8, "UInt")
NumPut(bisize, pBMI + 20, "UInt")
NumPut(2, pBMI + 32, "UInt")
NumPut(2, pBMI + 36, "UInt")
DllCall("Kernel32.dll\RtlMoveMemory", "Ptr",pCURSOR + 22, "Ptr",pBMI, "Ptr",40)
DllCall("Kernel32.dll\RtlMoveMemory", "Ptr",pCURSOR + 70, "Ptr",pBits, "Ptr",WB*CH)
DllCall("Kernel32.dll\RtlFillMemory", "Ptr",pCURSOR + 70+(WB*CH), "Ptr",(WB*CH), "Int",255)
DllCall("Gdi32.dll\DeleteObject", "Ptr",hBM)
Loop, Parse, % "32512,32513,32514,32515,32516,32640,32641,32642,32643,32644,32645,32646,32648,32649,32650,32651", `,
DllCall("User32.dll\SetSystemCursor", "Ptr",DllCall("User32.dll\CreateIconFromResourceEx", "Ptr",pCURSOR+22
, "UInt",ttlSize-22, "Int",True, "Int",0x30000, "Int",CW, "Int",CH, "Int",0, "Ptr"), "Int",A_Loopfield)
DllCall("Kernel32.dll\GlobalFree", "Ptr",pCURSOR)
Return ttlSize
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#NoEnv #Warn #SingleInstance, Force INI := "" FileRead, INI, Menu.ini GuiOptions := { "Title" : "Choose colors" , "New" : "-MinimizeBox" , "Show" : "x50 yCenter" , "Menu" : INI } History := ["663399", "D2B48C", "BF00FF", "FF9F00", "00BFFF" , "FF0000", "FF69B4", "3399FF", "FAEBD7", "D2691E"] ; up to 25 colors Colors := ChooseColors(GuiOptions, History*) If Colors.Count() MsgBox % Colors[1] ; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=92145 ChooseColors(GuiOptions:="", Colors*) { ; ChooseColors() v0.97 by SKAN, on D46L/D47K @ tiny.cc/choosecolors Local _Batchlines:= A_BatchLines SetBatchLines -1 TextFont := ["s11", "Calibri"] MonoFont := ["S12", "Consolas"] CancelW := 70 ; min 60 px max 80 px CancelH := 24 ; min 23 px max 32 px SliderH := 3 ; min 1 px max 14 px KeyUp := "F1" ; Key for adding colors to History Glob := { "Gui":{}, "Func":{}, "CoordMode":{}, "Settings":{}, "Paint":1, "Esc":0 } Loop % ( Min(Colors.Count(), 25), Var := "") Var .= Format("{:06X}", "0x" . Colors[A_Index]) . "|" Glob.Que := RTrim(Var, "|") Color := OldColor := ( StrLen(Glob.Que) ? StrSplit(Glob.Que, "|",, 2).1 : "FF0000" ) Glob.SysColor := Format("0x{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit( Format("{:06X}" , DllCall("User32.dll\GetSysColor", "Int",15)))* ) Title := StrLen(GuiOptions.Title) ? GuiOptions.Title : "ChooseColors()" NewOptions := GuiOptions.New ShowOptions := GuiOptions.Show DefaultOpts := "-Resize +Sysmenu +LabelChooseColors_Gui +HwndhGui" Glob.Menu := "|" . StrReplace(StrReplace(GuiOptions.Menu, "`r`n", "`n"), "`n", "|") . "|[]" _DefaultGui := A_DefaultGUI Gui, ChooseColors: New, +AlwaysOnTop %NewOptions% %DefaultOpts%, %Title% Gui, %_DefaultGui%: Default ChooseColors_RegisterClass(Glob, True) ; Register "CcStatic" Glob.CCUI := "ahk_id" . (Glob.Gui.Hwnd := hGui) Glob.Gui.Hicon := ChooseColors_GetIcon("caption.png") DllCall("SendMessage", "Ptr",Glob.Gui.Hwnd, "Int",WM_SETICON:=0x80, "Ptr",0, "Ptr",Glob.Gui.Hicon) Glob.Func.Keypressed := Func("ChooseColors_Keypress").Bind(KeyUp) Glob.Func.Gui := Func("ChooseColors_Gui").Bind(Glob) Glob.Func.GuiControl := Func("ChooseColors_GuiControl").Bind(Glob) Glob.Func.GuiControlGet := Func("ChooseColors_GuiControlGet").Bind(Glob) Glob.Func.SetImage := Func("ChooseColors_SetImage") Glob.Func.CreateGradient := Func("ChooseColors_CreateGradient") Glob.Func.CreateBitmap := Func("ChooseColors_CreateBitmap") Glob.Func.CreateBitmapText := Func("ChooseColors_CreateBitmapText").Bind(Glob) Glob.Func.Settings := Func("ChooseColors_Settings").Bind(Glob) Glob.Func.CoordMode := Func("ChooseColors_CoordMode").Bind(Glob) Glob.Func.GetHexColor := Func("ChooseColors_GetHexColor").Bind(Glob) Glob.Func.SetColorName := Func("ChooseColors_SetColorName").Bind(Glob) Glob.Func.HistorySetBitmap := Func("ChooseColors_HistorySetBitmap").Bind(Glob) Glob.Func.SetImageAnimate := Func("ChooseColors_SetImageAnimate").Bind(Glob) Glob.Func.EditHex := Func("ChooseColors_Hex").Bind(Glob) Glob.Func.ClipCursor := Func("ChooseColors_ClipCursor") Glob.Func.GetWindowRect := Func("ChooseColors_GetWindowRect") Glob.Func.GetMonitorRect := Func("ChooseColors_GetMonitorRect") Glob.Func.SetRect := Func("ChooseColors_SetRect") Glob.Func.GetImage := Func("ChooseColors_GetImage") Glob.Func.DeleteBitmap := Func("ChooseColors_DeleteBitmap") Glob.Func.UpdateRGBHSL := Func("ChooseColors_UpdateRGBHSL") Glob.Func.SetSystemCursor := Func("ChooseColors_SetSystemCursor") Glob.Func.MemDC := Func("ChooseColors_MemDC") Gui := Glob.Func.Gui GuiControl := Glob.Func.GuiControl GuiControlGet := Glob.Func.GuiControlGet SetImage := Glob.Func.SetImage CreateBitmap := Glob.Func.CreateBitmap CreateGradient := Glob.Func.CreateGradient AddUpDown := Func("ChooseColors_AddUpDown").Bind(Glob) AddGoSub := Func("ChooseColors_GoSub").Bind(Glob) Gui.Call("+DpiScale") Gui.Call("Font", TextFont*) Gui.Call("Margin", 0, 0) Gui.Call("Add", "Button", "HwndCancelB x0 y0 w0 h0 -Tabstop", "&Cancel") AddGoSub.Call("CancelB", "ChooseColors_GuiCancel", Glob) Gui.Call("Add", "Button", "HwndOkayB Default x+0 yp w0 h0 -Tabstop", "&Ok") AddGoSub.Call("OkayB", "ChooseColors_GuiOkay", Glob) Gui.Call("Add", "Custom", "HwndGradient CcStatic w288 h288 SS_NOTIFY SS_REALSIZECONTROL SS_BITMAP") AddGoSub.Call("Gradient", "ChooseColors_HueSelect", Glob) Gui.Call("Add", "Custom", "HwndHue CcStatic x0 y+0 w288 h16 SS_NOTIFY SS_REALSIZECONTROL SS_BITMAP") AddGoSub.Call("Hue", "ChooseColors_HueSelect", Glob) HueColors := [0xFF0000, 0xFFFF00, 0x00FF00, 0x00FFFF, 0x0000FF, 0xFF00FF, 0xFF0000] Hbm := CreateGradient.Call(Glob.Hue.W, 1, False, HueColors*) SetImage.Call(Glob.Hue.Hwnd, Hbm, 1) SH := Max(2, Min(14, SliderH)) Gui.Call("Margin", 16, 12) Gui.Call("Add", "Text", "x16 w16 Section", "R") Gui.Call("Add", "Text", "x+0 w0", "&R") Gui.Call("Add", "Edit", "HwndEditR x+0 w40 h26 Number Limit3 Right") AddGoSub.Call("EditR", "ChooseColors_RGB", Glob) AddUpDown.Call("EditR", "HwndUpdown Range0-255") Gui.Call("Add", "Custom", "HwndSlider1 CcStatic x16 y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd) AddGoSub.Call("Slider1", "ChooseColors_Slider", Glob) Tbm := CreateBitmap.Call(Glob.Slider1.W, SH, 0xDD0000), SetImage.Call(Glob.Slider1.Hwnd, Tbm) Gui.Call("Margin", 16, 6) Gui.Call("Add", "Text", "x16 w16", "G") Gui.Call("Add", "Text", "x+0 w0", "&G") Gui.Call("Add", "Edit", "HwndEditG x+0 w40 h26 Number Limit3 Right") AddGoSub.Call("EditG", "ChooseColors_RGB", Glob) AddUpDown.Call("EditG", "HwndUpdown Range0-255") Gui.Call("Add", "Custom", "HwndSlider2 CcStatic x16 y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd) AddGoSub.Call("Slider2", "ChooseColors_Slider", Glob) Tbm := CreateBitmap.Call(Glob.Slider2.W, SH, 0x00DD00), SetImage.Call(Glob.Slider2.Hwnd, Tbm) Gui.Call("Add", "Text", "x16 w16", "B") Gui.Call("Add", "Text", "x+0 w0", "&B") Gui.Call("Add", "Edit", "HwndEditB x+0 w40 h26 Number Limit3 Right") AddGoSub.Call("EditB", "ChooseColors_RGB", Glob) AddUpDown.Call("EditB", "HwndUpdown Range0-255") Gui.Call("Add", "Custom", "HwndSlider3 CcStatic x16 y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd) AddGoSub.Call("Slider3", "ChooseColors_Slider", Glob) Tbm := CreateBitmap.Call(Glob.Slider3.W, SH, 0x0000DD), SetImage.Call(Glob.Slider3.Hwnd, Tbm) Gui.Call("Add", "Text", "x+m ys w16 Section", "H") Gui.Call("Add", "Text", "x+0 w0", "&H") Gui.Call("Add", "Edit", "HwndEditH x+0 w40 h26 Number Limit3 Right") AddGoSub.Call("EditH", "ChooseColors_HLS", Glob) AddUpDown.Call("EditH", "HwndUpdown Range0-360 Wrap") Gui.Call("Add", "Text", "x+4 w12 hp 0x200 Disabled", Chr(176)) Gui.Call("Add", "Custom", "HwndSlider4 CcStatic xs y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd) AddGoSub.Call("Slider4", "ChooseColors_Slider", Glob) Tbm := CreateGradient.Call(Glob.Slider4.W, SH, False, HueColors*), SetImage.Call(Glob.Slider4.Hwnd, Tbm) Gui.Call("Add", "Text", "xs w16 hp", "S") Gui.Call("Add", "Text", "x+0 w0", "&S") Gui.Call("Add", "Edit", "HwndEditS x+0 w40 h26 Number Limit3 Right") AddGoSub.Call("EditS", "ChooseColors_HLS", Glob) AddUpDown.Call("EditS", "HwndUpdown Range0-100") Gui.Call("Add", "Text", "x+4 w12 hp 0x200 Disabled", "%") Gui.Call("Add", "Custom", "HwndSlider5 CcStatic xs y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd) AddGoSub.Call("Slider5", "ChooseColors_Slider", Glob) Tbm := CreateGradient.Call(Glob.Slider5.W, SH, False, 0x7F7F7F, 0x7F7F7F, 0x7F7F7F) SetImage.Call(Glob.Slider5.Hwnd, Tbm) Gui.Call("Add", "Text", "xs w16 hp", "L") Gui.Call("Add", "Text", "x+0 w0", "&L") Gui.Call("Add", "Edit", "HwndEditL x+0 w40 h26 Number Limit3 Right") AddGoSub.Call("EditL", "ChooseColors_HLS", Glob) AddUpDown.Call("EditL", "HwndUpdown Range0-100") Gui.Call("Add", "Text", "x+2 w12 hp 0x200 Disabled", "%") Gui.Call("Add", "Custom", "HwndSlider6 CcStatic xs y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd) AddGoSub.Call("Slider6", "ChooseColors_Slider", Glob) Tbm := CreateGradient.Call(Glob.Slider6.W, SH, False, 0x444444, 0xAAAAAA, 0xFFFFFF) SetImage.Call(Glob.Slider6.Hwnd, Tbm) Gui.Call("Add", "Text", "HwndColorName x16 y+0 w250 h16 SS_CENTERIMAGE Right") Gui.Call("Add", "Custom", "HwndHistory CcStatic y+2 w250 h12 SS_NOTIFY SS_REALSIZECONTROL SS_BITMAP +E0x20000") AddGoSub.Call("History", "ChooseColors_HueSelect2", Glob) Gui.Call("Add", "Button", "HwndDelQB xp yp w0 hp -Tabstop", "&D", hDelQB:=0) AddGoSub.Call("DelQB", "ChooseColors_DelColorFmQ", Glob) Gui.Call("Margin", 16, 12) IH := Max(23, Min(32, CancelH)) Gui.Call("Add", "Picture", "HwndPickScr x16 y+m w24 Left SS_CENTERIMAGE SS_ICON h" . IH) GuiControl.Call("", Glob.PickScr.Hwnd, "*w0 *h0 hicon:" . ChooseColors_GetIcon("pickscr.png")) AddGoSub.Call("PickScr", "ChooseColors_PickScr", Glob) Gui.Call("Add", "Picture", "HwndPickClr x+8 yp wp hp SS_CENTERIMAGE SS_ICON") GuiControl.Call("", Glob.PickClr.Hwnd, "*w0 *h0 hicon:" . ChooseColors_GetIcon("pickclr.png")) AddGoSub.Call("PickClr", "ChooseColors_PickScr", Glob) CW := Max(60, Min(80, CancelW)) Gui.Call("Add", "Custom", "HwndCancel CcStatic x+m hp -Tabstop Center SS_NOTIFY SS_BITMAP w" . CW, "&Cancel") AddGoSub.Call("Cancel", "ChooseColors_GuiCancel", Glob) Tbm := Glob.Func.CreateBitmapText.Call(Glob.Cancel.Hwnd) SetImage.Call(Glob.Cancel.Hwnd, Tbm) Gui.Call("Add", "Custom", "HwndOkay CcStatic x+m hp -Tabstop Center SS_NOTIFY SS_BITMAP w" . (CW//3)*2, "&OK") AddGoSub.Call("Okay", "ChooseColors_GuiOkay", Glob) Tbm := Glob.Func.CreateBitmapText.Call(Glob.Okay.Hwnd) SetImage.Call(Glob.Okay.Hwnd, Tbm) Gui.Call("Margin", 16, 6) Gui.Call("Add", "Text", "x157 ys w40 Right Section h40 BackgroundTrans", "Old") Gui.Call("Add", "Progress", "x+6 w68 hp Disabled Border Background" . OldColor) Gui.Call("Add", "Custom", "HwndOld CcStatic xp yp wp hp BackgroundTrans SS_NOTIFY WS_EX_STATICEDGE") AddGoSub.Call("Old", "ChooseColors_SetNew", Glob, OldColor) Gui.Call("Add", "Text", "HwndRandom xs w40 y+m hp Right", "New") Gui.Call("Add", "Button", "HwndRandomB x+0 yp w0 hp -Tabstop", "&N") AddGoSub.Call("Random", "ChooseColors_GenRandom", Glob) AddGoSub.Call("RandomB", "ChooseColors_GenRandom", Glob) Gui.Call("Add", "Progress", "HwndNew x+6 w68 hp Disabled Border Background" . OldColor) Gui.Call("Add", "Custom", "HwndPreview CcStatic xp yp wp hp BackgroundTrans SS_NOTIFY WS_EX_STATICEDGE") AddGoSub.Call("Preview", "ChooseColors_Preview", Glob, Glob.Preview.Hwnd) Gui.Call("Add", "Text", "HwndAddQ xs y+m w40 h26 Right", "#") Gui.Call("Add", "Button", "HwndAddQB x+0 yp w0 h0 -Tabstop", "&A") AddGoSub.Call("AddQ", "ChooseColors_AddColorToQ", Glob) AddGoSub.Call("AddQB", "ChooseColors_AddColorToQ", Glob) Gui.Call("Add", "Text", "x+0 w0", "&X") Gui.Call("Font", MonoFont*) Gui.Call("Add", "Edit", "HwndEdit0 x+6 w0 h0 ReadOnly -Tabstop", &Glob) Gui.Call("Add", "Edit", "HwndEditHex xp yp w68 h26 Uppercase Limit6 Right", Color) AddGoSub.Call("EditHex", "ChooseColors_Hex", Glob) Gui.Call("Font", TextFont*) Gui.Call("-DpiScale") RM := Glob.Old.W + Glob.Old.X GuiControl.Call("Move", Glob.Okay.Hwnd, "x" . RM - Glob.Okay.W ) GuiControl.Call("Move", Glob.Cancel.Hwnd, "x" . RM - Glob.Okay.W - Glob.PickScr.X - Glob.Cancel.W) NW := (Glob.History.W // 25) * 25 GuiControl.Call("Move", Glob.ColorName.Hwnd, "x" . (RM-NW) . " w" . (NW)) GuiControl.Call("Move", Glob.History.Hwnd, "x" . (RM-NW) . " w" . (NW)) GuiControl.Call("Move", Glob.PickScr.Hwnd, "x" . (RM-NW)) GuiControlGet.Call("Pos", Glob.PickScr.Hwnd, X, Y, W, H) GuiControl.Call("Move", Glob.PickClr.Hwnd, "x" . (X + W + (8*(A_ScreenDPI/96)))) Gui.Call("+DpiScale") Dim := Glob.Hue.W ChooseColors_GradientStruct(Dim, VERT, MESH) hMainBM := CreateBitmap.Call(Dim, Dim) Glob.Func.MemDC.Call(hMainDC, hMainBM) Glob.Func.GradientPaint := Func("ChooseColors_GradientPaint").Bind(hMainDC, &VERT, &MESH, Dim, Glob.Gradient.Hwnd) Glob.Func.GradientSet := Func("ChooseColors_GradientSet").Bind(Glob.Gradient.Hwnd, hMainBM) hMsimg32 := DllCall("Kernel32.dll\LoadLibrary", "Str","Msimg32.dll", "Ptr") hShlwapi := DllCall("Kernel32.dll\LoadLibrary", "Str","Shlwapi.dll", "Ptr") Glob.Func.HistorySetBitmap() Gui.Call("Margin", 0, 12) Gui.Call("Show", "Hide AutoSize xCenter yCenter") Glob.Func.GradientPaint.Call("0x" . Color) Glob.Func.GradientSet.Call() Gui.Call("Show", ShowOptions . " AutoSize") GuiControl.Call("", Glob.EditHex.Hwnd, Color) If ( WinActive("ahk_id" . Glob.Gui.Hwnd) ) GuiControl.Call("Focus", Glob.EditHex.Hwnd) SetBatchLines, %_Batchlines% Glob.Okay := False WinWaitClose, % "ahk_id" . Glob.Gui.Hwnd Glob.Func.MemDC.Call(hMainDC, False) Glob.Func.DeleteBitmap.Call(hMainBM) DllCall("User32.dll\DestroyIcon", "Ptr",Glob.Gui.Hicon) DllCall("Kernel32.dll\FreeLibrary", "Ptr",hMsimg32) DllCall("Kernel32.dll\FreeLibrary", "Ptr",hShlwapi) ChooseColors_RegisterClass(Glob, False) ; Unregister "CcStatic" Return ( Glob.Okay ? StrSplit(Glob.Que, "|") : "" ) } ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ChooseColors_GuiOkay(Glob) { If ! ( StrLen(Glob.Que) ) SoundPlay *-1 Else DllCall("SendMessage", "Ptr",Glob.Gui.Hwnd, "Int",0x10 * (Glob.Okay := True), "Ptr",0, "Ptr",0) ; WM_CLOSE } ChooseColors_GuiCancel(Glob) { DllCall("SendMessage", "Ptr",Glob.Gui.Hwnd, "Int",0x10, "Ptr",0, "Ptr",0) ; WM_CLOSE } ChooseColors_GuiEscape(hGui) { If ( GetKeyState("LButton", "P") = False ) DllCall("SendMessage", "Ptr",hGui, "Int",0x10, "Ptr",0, "Ptr",0) ; WM_CLOSE Return } ChooseColors_GuiClose(hGui) { Gui, %hGui%:Destroy } ChooseColors_GuiContextMenu(GuiHwnd, CtrlHwnd, EventInfo, IsRightClick, X, Y) { Local GuiControlGet, ObjPtr, %GuiHwnd%:, Edit7 Glob := Object(ObjPtr) MouseGetPos,,,, hCtrl, 2 Switch ( hCtrl ) { Case Glob.History.Hwnd : ChooseColors_HistoryMenu(Glob) Case Glob.Gradient.Hwnd : ChooseColors_PaletteMenu(Glob, Glob.Gradient.Hwnd) Case Glob.Preview.Hwnd : ChooseColors_PaletteMenu(Glob, Glob.Preview.Hwnd) } } ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ChooseColors_RegisterClass(Glob, Register:=1) { Local If ( Register=False ) { DllCall("Kernel32.dll\GlobalFree", "Ptr",Glob.StaticProc, "Ptr") Return DllCall("User32.dll\UnregisterClass", "Str","CcStatic", "Ptr",0) } P8 := (A_PtrSize=8), Classname := "CcStatic" VarSetCapacity(WNDCLASS, P8 ? 72 : 40, 0) DllCall("User32.dll\GetClassInfo", "Ptr",0, "Str","Static", "Ptr",&WNDCLASS) OldProc := NumGet(WNDCLASS, A_PtrSize, "Ptr") StaticProc := Glob.StaticProc := RegisterCallback("ChooseColors_CcStaticProc",, 4, OldProc) hCursor := DllCall("User32.dll\LoadCursor", "Ptr",0, "Int",32649, "Ptr") ; IDC_HAND NumPut(hCursor, WNDCLASS, P8 ? 40 : 24, "Ptr") NumPut(StaticProc, WNDCLASS, A_PtrSize, "Ptr") NumPut(&Classname, WNDCLASS, P8 ? 64 : 36, "Ptr") Return DllCall("User32.dll\RegisterClass", "Ptr",&WNDCLASS) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_CcStaticProc(Hwnd, Msg, WP, LP) { Local If ( Msg = 2 ) ; WM_DESTROY If ( Hbm := DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",0x173, "Ptr",0, "Ptr",0, "Ptr") ) ; STM_GETIMAGE DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm) Return DllCall("User32.dll\CallWindowProc", "Ptr",A_EventInfo, "Int",Hwnd, "Int",Msg, "Ptr",WP, "Ptr",LP) } ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ChooseColors_Preview(Glob, hCtrl:=0) { Local If GetKeyState("Shift", "P") Return ChooseColors_AddColorToQ(Glob, hCtrl, "") Glob.Func.GetHexColor.Call(Color) Hbm := Glob.Func.CreateBitmap.Call(1, 1) DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",4*1, "UIntP","0x" . Color) Glob.Func.SetImage.Call(Glob.Gradient.Hwnd, Hbm, True) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_HLS(Glob, hCtrl, GuiEvent, EventInfo) { Local If ( DllCall("User32.dll\GetFocus", "Ptr") != hCtrl ) Return GuiControl := Glob.Func.GuiControl GuiControlGet := Glob.Func.GuiControlGet GuiControlGet.Call("", Glob.EditH.Hwnd, H:=0) GuiControlGet.Call("", Glob.EditL.Hwnd, L:=0) GuiControlGet.Call("", Glob.EditS.Hwnd, S:=0) Color := DllCall("Shlwapi.dll\ColorHLSToRGB", "Short",H/1.5, "Short",L*2.4, "Short",S*2.4, "UInt") Color := Format( "{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Format("{:06X}", Color))*) GuiControl.Call("", Glob.EditHex.Hwnd, Color) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_RGB(Glob, hCtrl, GuiEvent, EventInfo) { Local If ( DllCall("User32.dll\GetFocus", "Ptr") != hCtrl ) Return GuiControl := Glob.Func.GuiControl GuiControlGet := Glob.Func.GuiControlGet GuiControlGet.Call("", Glob.EditR.Hwnd, R) GuiControlGet.Call("", Glob.EditG.Hwnd, G) GuiControlGet.Call("", Glob.EditB.Hwnd, B) Color := Format("{:02X}{:02X}{:02X}", Min(R, 255), Min(G, 255), Min(B, 255)) GuiControl.Call("", Glob.EditHex.Hwnd, Color) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GetHexColor(Glob, ByRef Color:="") { Local Glob.Func.GuiControlGet.Call("", Glob.EditHex.Hwnd, Color:="") Return ( Color := Format("{:06X}", "0x" . Color) ) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_Hex(Glob, hEditHex, GuiEvent, EventInfo) { Local Critical On Glob.Func.GetHexColor.Call(Hex) Glob.Func.GuiControl.Call("+Background" . Hex, Glob.New.Hwnd) Glob.Func.SetColorName.Call(Hex) Glob.Func.UpdateRGBHSL.Call(Glob, Hex) If ( Glob.Paint=True ) Glob.Func.GradientPaint.Call("0x" . Hex) If ( GetKeyState("LButton", "P")=False ) { GradientSet := Glob.Func.GradientSet SetTimer, %GradientSet%, -100 } Critical Off } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_UpdateRGBHSL(Glob, Hex) { Local hFocus := DllCall("User32.dll\GetFocus", "Ptr") GuiControl := Glob.Func.GuiControl Color := Format( "0x{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Hex)*) DllCall("Shlwapi.dll\ColorRGBToHLS", "Int",Color, "ShortP",H:=0, "ShortP",L:=0, "ShortP",S:=0) _ := ( Glob.EditH.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditH.Hwnd, Round(H*1.5)) , _ := ( Glob.EditL.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditL.Hwnd, Round(L/2.4)) , _ := ( Glob.EditS.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditS.Hwnd, Round(S/2.4)) , RGB := Format("0x{:x}", "0x" . Hex) + 0 , _ := ( Glob.EditR.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditR.Hwnd, RGB>>16 & 255) , _ := ( Glob.EditG.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditG.Hwnd, RGB>>8 & 255) , _ := ( Glob.EditB.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditB.Hwnd, RGB & 255) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GetMonitorRect(Hwnd, ByRef RECT:="", ByRef x1:=0, ByRef y1:=0, ByRef x2:=0, ByRef y2:=0) { Local hMon := DllCall("User32.dll\MonitorFromWindow", "Ptr",HWnd, "Int",0x2, "Ptr") ; _DEFAULTTONEAREST = 0x2 , VarSetCapacity(MONITORINFO, 40, 0), NumPut(40, MONITORINFO, "Int") , DllCall("User32.dll\GetMonitorInfo", "Ptr",hMon, "Ptr",&MONITORINFO) , VarSetCapacity(RECT, 16) , x1 := NumGet(MONITORINFO, 4, "Int"), y1 := NumGet(MONITORINFO, 8, "Int") , x2 := NumGet(MONITORINFO, 12, "Int"), y2 := NumGet(MONITORINFO, 16, "Int") } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GetWindowRect(Hwnd, ByRef RECT:="", ByRef x1:=0, ByRef y1:=0, ByRef x2:=0, ByRef y2:=0) { Local VarSetCapacity(RECT, 16) , DllCall("User32.dll\GetWindowRect", "Ptr",Hwnd, "Ptr",&RECT) , x1 := NumGet(RECT,0, "Int"), y1 := NumGet(RECT,4, "Int") , x2 := NumGet(RECT,8, "Int"), y2 := NumGet(RECT,12,"Int") } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_SetRect(ByRef RECT, x1, y1, x2, y2) { Local VarSetCapacity(RECT, 16) DllCall("User32.dll\SetRect", "Ptr",&RECT, "Int",x1, "Int",y1, "Int",x2, "Int",y2) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_SetSystemCursor(Which:=0, With:=0) { Local If ! ( Which ) ; SPI_SETCURSORS := 0x57 Return DllCall("User32.dll\SystemParametersInfo", "Int",0x57, "Int",0, "Int",0, "Int",0) IDC := { "IDC_APPSTARTING":32650, "IDC_ARROW":32512, "IDC_CROSS":32515, "IDC_HAND":32649 , "IDC_HELP":32651, "IDC_IBEAM":32513, "IDC_NO":32648, "IDC_SIZEALL":32646, "IDC_SIZENESW":32643 , "IDC_SIZENS":32645, "IDC_SIZENWSE":32642, "IDC_SIZEWE":32644, "IDC_UPARROW":32516, "IDC_WAIT":32514 } hCursor := DllCall("User32.dll\LoadCursor", "Ptr",0, "Int",IDC[With], "Ptr") DllCall("User32.dll\SetSystemCursor", "Ptr",hCursor, "Int",IDC[Which]) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_ClipCursor(ByRef RECT:=0) { Local DllCall("User32.dll\ClipCursor", "Ptr",IsByRef(RECT) ? &RECT : 0) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GradientSet(hGradient, hMainBM) { Local ; ; STM_GETIMAGE = 0x173 Hbm := DllCall("User32.dll\CopyImage", "Ptr",hMainBM, "Int",0x0, "Int",0, "Int",0, "Int",0x2000, "Ptr") ChooseColors_SetImage(hGradient, Hbm) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GradientPaint(mDC, pVERT, pMESH, W, hGradient, Color) { Local Color := Format("{:06X}", Color & 0xFFFFFF) , Color := Format("0x{5:}{6:}00{3:}{4:}00{1:}{2:}00", StrSplit(Color)*) , NumPut(Color, pVERT+24, "Int64") , DllCall("Msimg32.dll\GradientFill", "Ptr",mDC, "Ptr",pVERT, "Int",4, "Ptr",pMESH, "Int",2, "Int",2) , hDC := DllCall("User32.dll\GetDC", "Ptr",hGradient, "Ptr") , DllCall("Gdi32.dll\GdiAlphaBlend" , "Ptr",hDC, "Int",0, "Int",0, "Int",W, "Int",W , "Ptr",mDC, "Int",0, "Int",0, "Int",W, "Int",W, "Int",16711680) ; 0x00FF0000 = 16711680 , DllCall("User32.dll\ReleaseDC", "Ptr",hGradient, "Ptr",hDC) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GradientMemDC(ByRef mDC, W:=0) { Local If ( W ) Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",24, "PtrP",0, "Ptr") , Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",W, "Int",0x200C, "Ptr") , mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr") , DllCall("Gdi32.dll\SaveDC", "Ptr",mDC) , DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm) Else DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1) , mDC := DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC) * 0 , Hbm := DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm) * 0 } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GradientStruct(W, ByRef VERT, ByRef MESH) { Local VarSetCapacity(VERT, 4*16, 0), VarSetCapacity(MESH, 2*12, 0) , NumPut(0xFE00CA00DE00, NumPut(0xFF00FF00FF00, VERT, 8, "Int64")+8, "Int64") , NumPut(W, NumPut(W, NumPut(W, NumPut(W, VERT, 16, "Int")+16, "Int")+8, "Int"), "Int") , NumPut(1, NumPut(3, NumPut(2, NumPut(2, NumPut(1, MESH, 4, "Int"), "Int"), "Int"), "Int"), "Int") } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_SetNew(Glob, Color, Esc:=0) { Local Glob.Esc := Esc Glob.Func.GuiControl.Call("Focus", Glob.EditHex.Hwnd) Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_HueSelect2(Glob, hCtrl, GuiEvent, EventInfo) { Local Glob.Func.CoordMode.Call("Save") MouseGetPos, X, Y PixelGetColor, Color, %X%, %Y%, RGB Color := SubStr(Color, 3) Glob.Func.CoordMode.Call("Restore") If ( InStr(Glob.Que, Color) = False ) Return If ( GetKeyState("Shift", "P")=False ) Return ChooseColors_HueSelect(Glob, hCtrl, GuiEvent, EventInfo) ChooseColors_DelColorFmQ(Glob, 0, Color) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_HueSelect(Glob, hCtrl, GuiEvent, EventInfo) { Local Glob.Func.Settings.Call("Save") Glob.Func.GuiControl.Call("Focus", Glob.Edit0.Hwnd) Glob.Func.GetWindowRect.Call(hCtrl, RECT, x1, y1, x2, y2) If ( hCtrl = Glob.History.Hwnd ) StrReplace(Glob.Que, "|", "|", nColors:=0) , W := x2 - x1 , x1 := x1 + (W // 25) * (24-nColors) + 1 , x2 -= 1 If ( hCtrl != Glob.Gradient.Hwnd ) y3 := y1 + ((y2-y1)//2) , _ := Glob.Func.SetRect.Call(RECT, x1, y3, x2, y3+1) Else ( Glob.Paint := False ) Glob.Func.ClipCursor.Call(RECT) PColor := 0, Color := "" While ( WinActive(Glob.CCUI) && GetKeyState("LButton", "P") && !GetKeyState("Escape", "P") ) { Sleep 1 MouseGetPos, X, Y PixelGetColor, Color, %X%, %Y%, RGB Color := SubStr(Color,3) If ( Glob.Func.Keypressed() ) ChooseColors_AddColorToQ(Glob, 0, Color) If ( PColor != Color ) Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, PColor:=Color) } Glob.Esc := ( GetKeyState("Escape", "P")=True || WinActive(Glob.CCUI)=False ) Glob.Func.ClipCursor.Call(False) If ( Glob.Esc ) Glob.Func.Settings.Call("Restore") Else { If ( hCtrl=Glob.History.Hwnd ) ChooseColors_AddColorToQ(Glob, 0, Color) Glob.Func.Settings.Call("Clear") } } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_Slider(Glob, hCtrl, GuiEvent, EventInfo) { Local Glob.Func.Settings.Call("Save") Glob.Func.GuiControlGet.Call("", hCtrl, hUpDown:=0) DllCall("SendMessage", "Ptr",hUpDown, "Int",UDM_GETRANGE32 := 0x470, "PtrP",Min:=0, "PtrP",Max:=0) Glob.Func.GuiControlGet.Call("", hUpdown, Pos:=0) Glob.Func.GuiControl.Call("", hUpDown, Pos) hBuddy := DllCall("User32.dll\SendMessage", "Ptr",hUpDown, "Int",UDM_GETBUDDY := 0x46A, "Ptr",0, "Ptr",0, "Ptr") Glob.Func.GuiControl.Call("Focus", hBuddy) Glob.Func.GetWindowRect.Call(hCtrl, RECT, x1, y1, x2, y2) y3 := y1 + ((y2-y1)//2) ; Vertical center W := x2 - x1 - 1 ; Width of control X := X1 + Round(W * (Pos/Max)) ; Find X pos for MouseMove Glob.Func.SetRect.Call(RECT, x1, y3, x2, y3+1) SavedX := X MouseMove, %X%, %y3%, 0 Glob.Func.ClipCursor.Call(RECT) PX := 0 While ( WinActive(Glob.CCUI) && GetKeyState("LButton", "P") && !GetKeyState("Escape", "P") ) { Sleep 1 If ( Glob.Func.Keypressed() ) Color := Glob.Func.GetHexColor.Call() , ChooseColors_AddColorToQ(Glob, 0, Color) MouseGetPos, X If ( PX = X ) Continue Else PX := X Val := ( (X-X1) / W ) Glob.Func.GuiControl.Call("", hUpDown, Max*Val) If ( Max=255 ) Tooltip % Round(Val*100) . "%",,, 20 } Glob.Esc := ( GetKeyState("Escape", "P")=True || WinActive(Glob.CCUI)=False ) Glob.Func.ClipCursor.Call(False) If ( Max=255 ) Tooltip,,,, 20 If ( Glob.Esc ) Glob.Func.Settings.Call("Restore") Else Glob.Func.Settings.Call("Clear") } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_PickScr(Glob, hCtrl, GuiEvent, EventInfo) { Local Glob.Func.Settings.Call("Save") TW := Glob.Hue.W Glob.Func.GetWindowRect.Call(hCtrl, RECT, x1, y1, x2, y2) x1 := x1 + ((x2-x1)/2) y1 := y1 + ((y2-y1)/2) Glob.Func.SetRect.Call(RECT, x1, y1, x1+1, y1+1) Glob.Func.ClipCursor.Call(RECT) Glob.Func.ClipCursor.Call(False) Glob.Func.GuiControl.Call("Focus", Glob.Edit0.Hwnd) Glob.Func.GetHexColor.Call(CurrentColor) Glob.Func.GuiControlGet.Call("", Glob.ColorName.Hwnd, ColorName) PickClr := ( hCtrl = Glob.PickClr.Hwnd ) SW := ( PickClr ? 1 : 40*(A_ScreenDPI/96) ) Off := ( PickClr ? 0 : SW//2 ) Hbm := Glob.Func.CreateBitmap.Call(SW, SW) Glob.Func.MemDC.Call(mDC:=0, Hbm) sWnd := DllCall("User32.dll\GetDesktopWindow", "Ptr") sDC := DllCall("User32.dll\GetWindowDC", "Ptr",sWnd, "Ptr") tDC := DllCall("User32.dll\GetWindowDC", "Ptr",Glob.Gradient.Hwnd, "Ptr") Glob.Func.GetMonitorRect.Call(Glob.Gui.Hwnd, RECT, x1, y1, x2, y2) Glob.Func.SetRect.Call(RECT, x1+Off, y1+Off, x2-Off, y2-Off) DllCall("SetForegroundWindow","Ptr",A_ScriptHwnd) Glob.Func.ClipCursor.Call(RECT) If ( Glob.PickClr.Hwnd ) ChooseColors_BoxCur(SW, SW) Else Glob.Func.SetSystemCursor.Call("IDC_ARROW", "IDC_HELP") Glob.Paint := False Color := "" While ( GetKeyState("LButton", "P") && ! GetKeyState("Escape", "P") ) { Sleep 0 Glob.Func.ClipCursor.Call(RECT) MouseGetPos, X, Y X -= Off, Y -= Off DllCall("Gdi32.dll\GdiAlphaBlend" , "Ptr",mDC, "Int",0, "Int",0, "Int",SW, "Int",SW , "Ptr",sDC, "Int",X, "Int",Y, "Int",SW, "Int",SW, "Int",0x00FF0000) DllCall("Gdi32.dll\GdiAlphaBlend" , "Ptr",tDC, "Int",0, "Int",0, "Int",TW, "Int",TW , "Ptr",mDC, "Int",0, "Int",0, "Int",SW, "Int",SW, "Int",0x00FF0000) Color := DllCall("Gdi32.dll\GetPixel", "Ptr",mDC, "Int",Off, "Int",Off, "UInt") Color := Format("{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Format("{:06X}", Color))*) Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color) If ( Glob.Func.Keypressed() ) ChooseColors_AddColorToQ(Glob, 0, Color) } Glob.Esc := ( GetKeyState("Escape", "P") || StrLen(Color)=0 ) Glob.Func.GuiControl.Call("-g", Glob.EditHex.Hwnd) Glob.Func.SetSystemCursor.Call(False) Glob.Func.ClipCursor.Call(False) DllCall("User32.dll\ReleaseDC", "Ptr",sWnd, "Ptr",sDC) DllCall("User32.dll\ReleaseDC", "Ptr",Glob.Gradient.Hwnd, "Ptr",tDC) Glob.Func.MemDC.Call(mDC) If ( Glob.Esc ) Glob.Func.DeleteBitmap.Call(Hbm) , Glob.Func.Settings.Call("Restore") Else Glob.Func.SetImage.Call(Glob.Gradient.Hwnd, Hbm, True) , Glob.Func.Settings.Call("Clear") Glob.Func.Gui.Call("Show") Glob.Func.GuiControl.Call("+g", Glob.EditHex.Hwnd, Glob.Func.EditHex) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GenRandom(Glob) { Local Hbm := Glob.Func.CreateBitmap.Call(5, 5) VarSetCapacity(BMBITS, 16*5, 0), pBits := &BMBITS DllCall("Advapi32.dll\SystemFunction036", "Ptr",&BMBITS, "Int",16*5) DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",16*5, "Ptr",&BMBITS) Color := Format("{3:02x}{2:02X}{1:02X}", *(pBits+38), *(pBits+39), *(pBits+40)) Glob.Func.GuiControl.Call("-g", Glob.EditHex.Hwnd) Glob.Func.GuiControl.Call("Focus", Glob.EditHex.Hwnd) Glob.Func.UpdateRGBHSL.Call(Glob, Color) Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color) Glob.Func.GuiControl.Call("+Background" . Color, Glob.New.Hwnd) Glob.Func.SetColorName.Call(Color) Glob.Func.GuiControl.Call("+g", Glob.EditHex.Hwnd, Glob.Func.EditHex) Glob.Func.SetImageAnimate.Call(Hbm) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_Settings(Glob, Mode) { Local If ( Mode="Save" ) { Glob.Func.CoordMode.Call("Save") Glob.Func.GetImage.Call(Glob.Gradient.Hwnd, Obm) Glob.Func.GuiControlGet.Call("", Glob.ColorName.Hwnd, ColorName) Glob.Func.GetHexColor.Call(CurrentColor) Glob.Settings := { "Obm":Obm, "CurrentColor":CurrentColor, "ColorName":ColorName, "A_BatchLines":A_BatchLines } SetBatchLines -1 Return } If ( Mode="Restore" ) { Glob.Func.GuiControl.Call("-g", Glob.EditHex.Hwnd) Glob.Func.GuiControl.Call("Focus", Glob.EditHex.Hwnd) Glob.Func.UpdateRGBHSL.Call(Glob, Glob.Settings.CurrentColor) Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Glob.Settings.CurrentColor) Glob.Func.GuiControl.Call("", Glob.ColorName.Hwnd, Glob.Settings.ColorName) Glob.Func.GuiControl.Call("+Background" . Glob.Settings.CurrentColor, Glob.New.Hwnd) Glob.Func.SetImageAnimate.Call(Glob.Settings.Obm) Glob.Settings.Obm := 0 Glob.Func.GuiControl.Call("+g", Glob.EditHex.Hwnd, Glob.Func.EditHex) } If ( Glob.Settings.Obm ) { Glob.Func.DeleteBitmap.Call(Glob.Settings.Obm) Glob.Func.GetHexColor.Call(Color) Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color) } Glob.Esc := False Glob.Paint := True Glob.Settings := {} Glob.Func.CoordMode.Call("Restore") SetBatchLines, % Glob.Settings.A_BatchLines } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_CoordMode(Glob, Mode) { Local Loop, Parse, % "A_CoordModeToolTip|A_CoordModePixel|A_CoordModeMouse|A_CoordModeCaret|A_CoordModeMenu", | If ( Mode="Save" ) CoordMode, % SubStr(A_LoopField,12) . SubStr(Glob.CoordMode[A_LoopField] := %A_LoopField%, 1,0), Screen Else CoordMode, % SubStr(A_LoopField,12), % Glob.CoordMode[A_LoopField] } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_DelColorFmQ(Glob, hCtrl:=0, Color:="" ) { Local If ( hCtrl ) Glob.Func.GetHexColor.Call(Color:="") If ( Color="" ) Glob.Que := "" Else Glob.Que := ChooseColors_StrQ(Glob.Que, Color) , Glob.Que := StrSplit(Glob.Que, "|",, 2).2 Glob.Func.HistorySetBitmap() } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_AddColorToQ(Glob, hCtrl, Color) { Local If ( hCtrl ) Glob.Func.GetHexColor.Call(Color:="") Glob.Que := ChooseColors_StrQ(Glob.Que, Color) Glob.Func.HistorySetBitmap() } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_HistorySetBitmap(Glob) { Local Hbm := Glob.Func.CreateBitmap.Call(25, 1, 0, 32) VarSetCapacity(BMBITS, 100, 0), n := pBits := &BMBITS+100, i := Ok := 0 Loop, Parse, % Glob.Que, | pBits := Numput("0x" . A_LoopField, pBits-4, "UInt") - 4, i := Ok := A_Index Loop % ( 25-i ) pBits := Numput(0xFFFFFF, pBits-4, "UInt") - 4 DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "Int",100, "Ptr",&BMBITS) Glob.Func.SetImage.Call(Glob.History.Hwnd, Hbm, True) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_StrQ(Q, I, Max:=16, D:="|") { ; StrQ v.0.91, By SKAN on D09F/D46R @ tiny.cc/strq Return ( StrLen(Q)=0 ? I : InStr(I, D) ? Q : Q=I ? Q : SubStr(Q := StrLen(I) ? (I . D . Trim(StrReplace((D . Q . D), (D . I . D), D), D) . D) : (Q . D), 1 , (I := InStr(Q, D, 0, 1, Max)) ? I-1 : Max<1 ? 0 : StrLen(Q)-1) ) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_MemDC(ByRef mDC, Hbm:=0) { Local If ( Hbm ) mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr") , DllCall("Gdi32.dll\SaveDC", "Ptr",mDC) , DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm) Else DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1) , mDC := DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC) * 0 } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_ShowMenu(Hwnd, MenuName, BottomAlign:=0) { Local VarSetCapacity(RECT, 16) DllCall("User32.dll\GetWindowRect", "Ptr",Hwnd, "Ptr",&RECT) x1 := NumGet(RECT,0, "Int"), x2 := NumGet(RECT,8, "Int"), XCenter := X1 + ((X2-X1)//2) DllCall("User32.dll\GetCursorPos", "Ptr",&RECT) CX := NumGet(RECT, 0, "Int"), CY := NumGet(RECT, 4, "Int") TPM_RIGHTALIGN := 0x08, TPM_BOTTOMALIGN := 0x20 Flags := ( CX>XCenter ? TPM_RIGHTALIGN : 0 ) | (BottomAlign ? TPM_BOTTOMALIGN : 0) CX := ( CX>XCenter ? x2-4 : x1+4 ) DllCall("User32.dll\TrackPopupMenu", "Ptr",MenuGetHandle(MenuName), "Int",Flags ,"Int",CX, "Int",CY, "Int",0, "Ptr",Hwnd, "Ptr",0, "UInt") } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_HistoryMenu(Glob) { Local Glob.Func.CoordMode.Call("Save") MouseGetPos, X, Y PixelGetColor, Color, %X%, %Y%, RGB Color := SubStr(Color, 3) Glob.Func.CoordMode.Call("Restore") Glob.Func.GetHexColor.Call(Hex:="") ClearHistory := Func("ChooseColors_DelColorFmQ").Bind(Glob, 0, "") DelColorFmQ := Func("ChooseColors_DelColorFmQ").Bind(Glob, 0, Color) AddColorToQ := Func("ChooseColors_AddColorToQ").Bind(Glob, 0, Color) Menu, ChooseColors, UseErrorLevel If ( InStr(Glob.Que, Color) ) { Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Color), 32) MenuName := "Delete`tShift+Click" Menu, ChooseColors, Add, %MenuName%, %DelColorFmQ% Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm% If ( Color != Hex ) { Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Color), 32) MenuName := "Set as New`tClick" SetNew := Func("ChooseColors_SetNew").Bind(Glob, Color) Menu, ChooseColors, Add, %MenuName%, %SetNew% Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm% } } If ( InStr(Glob.Que, Hex) = False ) { Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Hex), 32) AddColorToQ := Func("ChooseColors_AddColorToQ").Bind(Glob, 0, Hex) MenuName := "Add`tAlt+A" Menu, ChooseColors, Add, %MenuName%, %AddColorToQ% Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm% } Menu, ChooseColors, Add, Clear History, %ClearHistory% If ( StrLen(Glob.Que) = 0 ) Menu, ChooseColors, Disable, Clear History ChooseColors_ShowMenu(Glob.Gui.Hwnd, "ChooseColors", True) Menu, ChooseColors, DeleteAll } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_PaletteMenu(Glob, hCtrl) { Local Glob.Func.CoordMode.Call("Save") MouseGetPos, X, Y PixelGetColor, Color, %X%, %Y%, RGB Color := SubStr(Color, 3) Glob.Func.CoordMode.Call("Restore") CreatePalette := Func("ChooseColors_CreatePalette").Bind(Glob) CreateRandom := Func("ChooseColors_GenRandom").Bind(Glob) AddColorToQ := Func("ChooseColors_AddColorToQ").Bind(Glob, 0, Color) DelColorFmQ := Func("ChooseColors_DelColorFmQ").Bind(Glob, 0, Color) Preview := Func("ChooseColors_Preview").Bind(Glob) Menu, ChooseColors, UseErrorLevel Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Color), 32) MenuName := "Add #" . Color . (hCtrl = Glob.Preview.Hwnd ? "`tAlt+A" : "") Menu, ChooseColors, Add, %MenuName%, %AddColorToQ% Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm% Menu, ChooseColors, Add, Random colors `tAlt+N, %CreateRandom% If ( hCtrl = Glob.Preview.Hwnd ) { If InStr(Glob.Que, Color) Menu, ChooseColors, Insert, 2&, Delete #%Color% `tAlt+D, %DelColorFmQ% Menu, ChooseColors, Insert, 3&, Preview color`tClick, %Preview% } If ( hCtrl = Glob.Gradient.Hwnd ) { Menu, ChooseColors, Add ; Add separator N := 1, ErrorLevel := 0, I := 0 While ( Section := ChooseColors_xStr(Glob.Menu,, "|[", "]|", N,,,, 0, 0) ) If ( Section := Trim(Section, "[|]") ) { I += 1 Menu, ChooseColors, Add, %Section%, %CreatePalette% } If ( I = 0 ) Menu, ChooseColors, Delete, 3& ; Remove separator } ChooseColors_ShowMenu(Glob.Gui.Hwnd, "ChooseColors", hCtrl = Glob.Preview.Hwnd) Menu, ChooseColors, DeleteAll } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_CreatePalette(Glob, Section) { Local Colors := "", Count := 0 Section := ChooseColors_xStr(Glob.Menu,, "|[" . Section . "]|", "[") Loop, Parse, Section, | If ( StrLen(L := StrSplit(A_LoopField, "=", A_Space).1) = 6 ) If L is xdigit Colors .= L . "|", Count += 1 If ( Count = 0 ) Return Else Colors := RTrim(Colors, "|") If ( Count <= 25 ) W := ( H := 5 ) Else W := ( H := Ceil(Sqrt(Count)) ) VarSetCapacity(BMBITS, W*H*4), pBits := &BMBITS Loop, Parse, Colors, | pBits := NumPut("0x" . A_LoopField, pBits+0, "Int"), I := A_Index Loop % ((W*H)-I) pBits := NumPut(Glob.SysColor, pBits+0, "Int") Hbm := Glob.Func.CreateBitmap.Call(W, H, 0, 32) DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",(W*4)*H, "Ptr",&BMBITS) Glob.Func.SetImageAnimate.Call(Hbm) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_SetColorName(Glob, Color) { Local ColorName := ChooseColors_xStr(Glob.Menu,, "|" . Color . "=", "|") Glob.Func.GuiControl.Call("", Glob.ColorName.Hwnd, ColorName) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_xStr(ByRef H, C:=0, B:="", E:="",ByRef BO:=1, EO:="", BI:=1, EI:=1, BT:="", ET:="") { Local L, LB, LE, P1, P2, Q, N:="", F:=0 ; xStr v0.97 by SKAN on D1AL/D343 @ tiny.cc/xstr Return SubStr(H,!(ErrorLevel:=!((P1:=(L:=StrLen(H))?(LB:=StrLen(B))?(F:=InStr(H,B,C&1,BO,BI))?F+(BT=N?LB :BT):0:(Q:=(BO=1&&BT>0?BT+1:BO>0?BO:L+BO))>1?Q:1:0)&&(P2:=P1?(LE:=StrLen(E))?(F:=InStr(H,E,C>>1,EO=N?(F ?F+LB:P1):EO,EI))?F+LE-(ET=N?LE:ET):0:EO=N?(ET>0?L-ET+1:L+1):P1+EO:0)>=P1))?P1:L+1,(BO:=Min(P2,L+1))-P1) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GoSub(Glob, HwndName, FunctionName, Bind*) { Local Glob.Func.GuiControl.Call("+g", Glob[HwndName].Hwnd, Func(FunctionName).Bind(Bind*)) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_Keypress(Keyname) { Local If ! GetKeyState(Keyname, "P") Return 0 KeyWait, %KeyName% Return ! Errorlevel } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_Gui(Glob, SubCommand, Value1:="", Value2:="", Value3:="") { Local Subcommand := Glob.Gui.Hwnd . ":" . Subcommand Repl := { "SS_REALSIZECONTROL":0x40, "SS_BITMAP":0xE, "SS_ICON":0x3, "SS_NOTIFY":0x100 , "CcStatic": "ClassCcStatic -Tabstop", "SS_CENTERIMAGE":0x200, "WS_EX_STATICEDGE":"E0x20000" } For K,V in Repl Value2 := StrReplace(Value2, K, V) Gui, %SubCommand%, %Value1%, % Value2 . (InStr(Value2, "Hwnd") ? " HwndHwnd" : ""), %Value3% If ( Var := StrSplit(StrSplit(Value2, "Hwnd").2, A_Space).1 ) { Gui, % Glob.Gui.Hwnd . ":-DPIScale" GuiControlGet, _, % Glob.Gui.Hwnd . ":Pos", %Hwnd% Glob[Var] := {"Hwnd":Hwnd, "X":_X, "Y":_Y, "W":_W, "H":_H} Gui, % Glob.Gui.Hwnd . ":+DPIScale" } } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GuiControl(Glob, SubCommand:="", ControlID:="", Value:="") { Local Subcommand := Glob.Gui.Hwnd . ":" . Subcommand GuiControl, %SubCommand%, %ControlID%, %Value% } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GuiControlGet(Glob, SubCommand:="", ControlID:="" , ByRef _X:="", ByRef _Y:=0, ByRef _W:=0, ByRef _H:=0, ByRef _:="") { Local VarSetCapacity(_X, 3, 0) Subcommand := Glob.Gui.Hwnd . ":" . Subcommand GuiControlGet, _, %SubCommand%, %ControlID% _X := StrLen(_) ? _ : _X } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_AddUpDown(Glob, EditControl, Options, ByRef Hwnd:=0) { Local Glob.Func.Gui.Call("Add", "UpDown", Options) Glob.Func.Gui.Call("-Dpiscale") Glob.Func.GuiControl.Call("Move", Glob.Updown.Hwnd, "w0") Glob.Func.GuiControl.Call("Move", Glob[EditControl].Hwnd, "w" . Glob[EditControl].W) Glob.Func.Gui.Call("+Dpiscale") Func := Func("ChooseColors_UpDown").Bind(Glob, Glob.Updown.Hwnd, Glob[EditControl].Hwnd) Glob.Func.GuiControl.Call("+g", Glob.Updown.Hwnd, Func) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_UpDown(Glob, hUpDown, hBuddy) { Local If ( hBuddy = DllCall("User32.dll\GetFocus", "Ptr") ) Return DllCall("User32.dll\SetFocus", "Ptr",hBuddy) Glob.Func.GuiControlGet.Call("", hUpDown, Val:=0) Glob.Func.GuiControl.Call("", hBuddy, Val) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_CreateBitmap(W:=0, H:=0, Color:=0, BPP:=24) { Local Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",BPP, "Ptr",0, "Ptr") Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",1, "Int",1, "Int",0x2008, "Ptr") DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",4, "UIntP",Color) Return DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",H, "Int",0x2008, "Ptr") } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_DeleteBitmap(Hbm) { Local Return DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_SetImage(Hwnd, Hbm, Redraw:=0) { Local STM_SETIMAGE = 0x172, STM_GETIMAGE := 0x173, WM_SETREDRAW := 0xB, Obm := 0 DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",WM_SETREDRAW, "Ptr",Redraw, "Ptr",0, "Ptr") Obm := DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",STM_SETIMAGE, "Ptr",0, "Ptr",Hbm, "Ptr") DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",WM_SETREDRAW, "Ptr",True, "Ptr",0, "Ptr") If ( Obm ) Obm := DllCall("Gdi32.dll\DeleteObject", "Ptr",Obm) * 0 Obm := DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",STM_GETIMAGE, "Ptr",0, "Ptr",0, "Ptr") If ( Obm != Hbm ) Hbm := DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm) * 0 } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GetImage(Hwnd, ByRef Hbm:=0, Copy:=1) { ; this function returns copy of image Local STM_GETIMAGE := 0x173 Hbm := DllCall("user32.dll\SendMessage", "Ptr",Hwnd, "Int",STM_GETIMAGE, "Ptr",0, "Ptr",0, "Ptr") If ( Copy ) ; LR_CREATEDIBSECTION = 0x2000 Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0, "Int",0, "Int",0, "Int",0x2000, "Ptr") } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_CreateGradient(W, H, V:=0, Colors*) { ; by SKAN on D46L/D46L @ tiny.cc/creategradient Local N := ( Colors := Colors.Count()>1 ? Colors : [ 0, 16777215, 0 ] ).Count() xOFF := (X := V ? W : 0) ? 0 : Ceil(W/(N-1)) yOFF := (Y := V ? 0 : H) ? 0 : Ceil(H/(N-1)) VarSetCapacity(VERT, N*16, 0) VarSetCapacity(MESH, N*8, 0) Loop % ( N, pVert:=&VERT, pMesh:=&MESH ) X := V ? (X=0 ? W : X:=0) : X , Y := !V ? (Y=0 ? H : Y:=0) : Y , Color := Format("{:06X}", Colors[A_Index] & 0xFFFFFF) , Color := Format("0x{5:}{6:}00{3:}{4:}00{1:}{2:}00", StrSplit(Color)*) , pVert := NumPut(Color, NumPut(Y, NumPut(X, pVert+0, "Int"), "Int"), "Int64") , pMesh := NumPut(A_Index, NumPut(A_Index-1, pMesh+0, "Int"), "Int") , Z := V ? (Y += yOFF) : (X += xOFF) Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",32, "PtrP",0, "Ptr") Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",H, "Int",0x2008, "Ptr") mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr") DllCall("Gdi32.dll\SaveDC", "Ptr",mDC) DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm) DllCall("Msimg32.dll\GradientFill", "Ptr",mDC, "Ptr",&VERT, "Int",N, "Ptr",&MESH, "Int",N-1, "Int",!!V) DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1) DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC) Return Hbm } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_GetIcon(Filename, W:=0, H:=0) { Local Switch ( FileName ) { Case "caption.png" : Base64PNG := " ( LTrim Join iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAApUlEQVRIie1VAQqDMAy8yD7jK3XPlrRkWKyELFanLQO3gxAx5S5J05ZEZIQBEaUfIm JDLkrru0MMF/AX2MUjb5CHUuzo+vYVeKO1jt2EARFAAJKfjRcfFmOAejxxakwteTDk2UoVFKOa0Gavv08L5My91lSpQBNuifAVAS9b3R6uKdCkRVsZ B+VjywpijRaxIfuwRfORfXtwauLLd9HPP5k3EADwAsmVfeJ0bmDRAAAAAElFTkSuQmCC )" Case "pickscr.png" : Base64PNG := " ( LTrim Join iVBORw0KGgoAAAANSUhEUgAAABcAAAAXAgMAAACdRDwzAAAACVBMVEUAAAD///8AAABzxoNxAAAAA3RSTlMAv7/C9di0AAAAQUlEQVQI12NYtZKBcd UKhqmhDIyhEQwTGIBAAp3SWrVqAZBSDQ1NkGAIAFEiDAwgioF4CqoPYgrMTKz2Qd0CdRkAcTwhFlkgH1gAAAAASUVORK5CYII= )" Case "pickclr.png" : Base64PNG := " ( LTrim Join iVBORw0KGgoAAAANSUhEUgAAABcAAAAXAgMAAACdRDwzAAAACVBMVEUAAAD///8AAABzxoNxAAAAA3RSTlMAv7/C9di0AAAATUlEQVQI12NYtZKBcd UKhqmhDIyhEQwTGIBAAkixOoApNkwqAESJMDCAKBBgBVJAvQGioUBq1QSplVAeTA6qEqYP00y4fVDboW6BugwAhowXw6cdQ8QAAAAASUVORK5CYII= )" Default : Base64PNG := "" } Return ChooseColors_PNG2HICON(Base64PNG, W, H) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_PNG2HICON(Base64PNG, W:=0, H:=0) { ; By SKAN on D094/D46Q @ tiny.cc/t-36636 Local VarSetCapacity(Bin, nBytes := Floor((B64Len := StrLen(Base64PNG := RTrim(Base64PNG,"=")))*3/4)) Return DllCall("Crypt32.dll\CryptStringToBinary", "Str",Base64PNG, "Int",B64Len, "Int",1, "Ptr",&Bin ,"UIntP",nBytes, "Int",0, "Int",0) ? DllCall("User32.dll\CreateIconFromResourceEx", "Ptr",&Bin, "Int",nBytes, "Int",True ,"Int",0x30000, "Int",W, "Int",H, "Int",0, "Ptr") : 0 } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_CreateBitmapText(Glob, hTxt) { ; modified ver of TextToPic() v0.50 Local ; by SKAN on D475/D475 @ tiny.cc/t92338 ControlGetText, Text,, ahk_id %hTxt% hFnt := DllCall("User32.dll\SendMessage", "Ptr",hTxt, "Int",0x31, "Ptr",0, "Ptr",0, "Ptr") ; WM_GETFONT VarSetCapacity(RECT, 16) DllCall("User32.dll\GetClientRect", "Ptr",hTxt, "Ptr",&RECT) x1 := NumGet(RECT,0, "Int"), y1 := NumGet(RECT,4, "Int") x2 := NumGet(RECT,8, "Int"), y2 := NumGet(RECT,12,"Int") W := x2-x1, H := y2-y1 FileGetVersion, OSV, user32.dll LRFlag := Format("{1:}.{2:}", StrSplit(OSV,".")*) > 6.3 ? 0x8 : 0x2008 WindowColor := Format("0x{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Format("{:06X}" , DllCall("User32.dll\GetSysColor", "Int",15)))*) Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",24, "Ptr",0, "Ptr") Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",1, "Int",1, "Int",0x2008, "Ptr") DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",4, "UIntP",WindowColor) Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",H, "Int",LRFlag, "Ptr") hBrush := DllCall("CreateSolidBrush", "Int",0x998877, "Ptr") hPen := DllCall("CreatePen", "Int",0, "Int",1, "Int",0xFAFAFA, "Ptr" ) mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr") DllCall("Gdi32.dll\SaveDC", "Ptr",mDC) DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBrush) DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hPen) DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm) DllCall("Gdi32.dll\RoundRect", "Ptr",mDC, "Int",0, "Int",0, "Int",W, "Int",H, "Int",H*.45, "Int",H*.45) DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1) DllCall("Gdi32.dll\DeleteObject", "Ptr",hBrush) DllCall("Gdi32.dll\DeleteObject", "Ptr",hPen) Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0, "Int",W*5, "Int",H*5, "Int",LRFlag, "Ptr") Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0, "Int",W, "Int",H, "Int",0x2008, "Ptr") DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm) DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hFnt) DllCall("Gdi32.dll\SetTextColor", "Ptr",mDC, "Int",0xE3E3E3) DllCall("Gdi32.dll\SetBkMode", "Ptr",mDC, "Int",1) ; TRANSPARENT=1 DllCall("User32.dll\DrawText", "Ptr",mDC, "Str",Text, "Int",StrLen(Text), "Ptr",&RECT, "Int",0x25) DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1) DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC) Return Hbm } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_SetImageAnimate(Glob, Hbm) { Local VarSetCapacity(BITMAP, Sz := A_PtrSize=8 ? 32 : 24 ) DllCall("Gdi32.dll\GetObject", "Ptr",Hbm, "Int",Sz, "Ptr",&BITMAP) SW := Numget(BITMAP, 4, "UInt") SH := Numget(BITMAP, 8, "UInt") TH := TW := Glob.Gradient.W tDC := DllCall("User32.dll\GetWindowDC", "Ptr",Glob.Gradient.Hwnd, "Ptr") mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr") DllCall("Gdi32.dll\SaveDC", "Ptr",mDC) DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm) Loop , Parse, % "2,4,8,12,16,20,24,28,32,36,40,48,96,128,192,255", `, { DllCall("Gdi32.dll\GdiAlphaBlend" , "Ptr",tDC, "Int",0, "Int",0, "Int",TW, "Int",TH , "Ptr",mDC, "Int",0, "Int",0, "Int",SW, "Int",SH, "Int",A_LoopField<<16) Sleep 1 } DllCall("User32.dll\ReleaseDC", "Ptr",Glob.Gradient.Hwnd, "Ptr",tDC) DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1) DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC) Glob.Func.SetImage.Call(Glob.Gradient.Hwnd, Hbm, False) } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ChooseColors_BoxCur(P*) { ; v0.3 by SKAN on D47J/D47K @ tiny.cc/boxcur Local If ! ( P.Count() ) Return DllCall("User32.dll\SystemParametersInfo", "Int",SPI_SETCURSORS := 0x57, "Int",0, "Int",0, "Int",0) CW := Max( 32, Format("{:d}", P[1]) ) CH := Max( 32, Format("{:d}", P[2]) ) RegRead, m, HKEY_CURRENT_USER\Control Panel\Cursors, CursorBaseSize m := ( (m := Format("{:d}", m)) > 32 ? m/32 : 1 ) CW := Round(CW/m) CH := Round(CH/m) VarSetCapacity(BITMAPINFO, 40, 0) pBMI := &BITMAPINFO, pBits := 0 NumPut(1, NumPut(1,NumPut(CH,NumPut(CW,NumPut(40,pBMI+0,"Int"),"Int"),"Int"),"Short"),"Short") hBM := DllCall("gdi32.dll\CreateDIBSection", "Ptr",0, "Ptr",pBMI, "Int",0, "PtrP",pBits, "Ptr",0, "Int", 0, "Ptr") hPen := DllCall("Gdi32.dll\CreatePen", "Int",0, "Int",1, "Int",0xFFFFFF, "Ptr") hBrush := DllCall("Gdi32.dll\CreateSolidBrush", "Int",m!=1 || P[3]!="" ? 0xFFFFFF : 0x000000, "Ptr") mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr") DllCall("Gdi32.dll\SaveDC", "Ptr",mDC) DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBrush) DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hPen) DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBM) DllCall("Gdi32.dll\RoundRect", "Ptr",mDC, "Int",0, "Int",0, "Int",CW, "Int",CH, "Int",0, "Int",0) DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1) DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC) DllCall("Gdi32.dll\DeleteObject", "Ptr",hBrush) DllCall("Gdi32.dll\DeleteObject", "Ptr",hPen) VarSetCapacity( BITMAP, SzBITMAP := ( A_PtrSize = 8 ? 32 : 24 ) ) DllCall("Gdi32.dll\GetObject", "Ptr",hBM, "Int",SzBITMAP, "Ptr",&BITMAP) WB := Numget(BITMAP, 12, "Int") biSize := (WB*CH) * 2 ttlSize := 22 + 40 + 8 + biSize pCURSOR := DllCall("Kernel32.dll\GlobalAlloc", "Int",0x40, "Ptr",ttlSize, "Ptr") NumPut(0x0100020000, pCURSOR + 0, "Int64") NumPut(CW, pCURSOR + 6, "UChar") NumPut(CH, pCURSOR + 7, "UChar") NumPut(40 + 8 + biSize, pCURSOR + 14, "UInt") NumPut(22, pCURSOR + 18, "UInt") NumPut(0xFFFFFF, pCURSOR + 66, "UInt") NumPut(CW, pBMI + 4, "UInt") NumPut(CH*2, pBMI + 8, "UInt") NumPut(bisize, pBMI + 20, "UInt") NumPut(2, pBMI + 32, "UInt") NumPut(2, pBMI + 36, "UInt") DllCall("Kernel32.dll\RtlMoveMemory", "Ptr",pCURSOR + 22, "Ptr",pBMI, "Ptr",40) DllCall("Kernel32.dll\RtlMoveMemory", "Ptr",pCURSOR + 70, "Ptr",pBits, "Ptr",WB*CH) DllCall("Kernel32.dll\RtlFillMemory", "Ptr",pCURSOR + 70+(WB*CH), "Ptr",(WB*CH), "Int",255) DllCall("Gdi32.dll\DeleteObject", "Ptr",hBM) Loop, Parse, % "32512,32513,32514,32515,32516,32640,32641,32642,32643,32644,32645,32646,32648,32649,32650,32651", `, DllCall("User32.dll\SetSystemCursor", "Ptr",DllCall("User32.dll\CreateIconFromResourceEx", "Ptr",pCURSOR+22 , "UInt",ttlSize-22, "Int",True, "Int",0x30000, "Int",CW, "Int",CH, "Int",0, "Ptr"), "Int",A_Loopfield) DllCall("Kernel32.dll\GlobalFree", "Ptr",pCURSOR) Return ttlSize } ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
#NoEnv
#Warn
#SingleInstance, Force

INI := ""
FileRead, INI, Menu.ini

GuiOptions := { "Title" : "Choose colors"
              , "New"   : "-MinimizeBox"
              , "Show"  : "x50 yCenter"
              , "Menu"  : INI }

History := ["663399", "D2B48C", "BF00FF", "FF9F00", "00BFFF"
          , "FF0000", "FF69B4", "3399FF", "FAEBD7", "D2691E"] ; up to 25 colors

Colors := ChooseColors(GuiOptions, History*)

If Colors.Count()
   MsgBox % Colors[1]

; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=92145
ChooseColors(GuiOptions:="", Colors*) { ;                 ChooseColors() v0.97 by SKAN, on D46L/D47K @ tiny.cc/choosecolors
Local
  _Batchlines:= A_BatchLines
  SetBatchLines -1

  TextFont  :=  ["s11", "Calibri"]
  MonoFont  :=  ["S12", "Consolas"]
  CancelW   :=   70    ;  min 60 px max 80 px
  CancelH   :=   24    ;  min 23 px max 32 px
  SliderH   :=    3    ;  min  1 px max 14 px
  KeyUp  :=  "F1"   ;  Key for adding colors to History

  Glob := { "Gui":{}, "Func":{}, "CoordMode":{}, "Settings":{}, "Paint":1, "Esc":0 }

  Loop % ( Min(Colors.Count(), 25), Var := "")
      Var .= Format("{:06X}", "0x" . Colors[A_Index]) . "|"
  Glob.Que := RTrim(Var, "|")

  Color          :=  OldColor := ( StrLen(Glob.Que) ? StrSplit(Glob.Que, "|",, 2).1 : "FF0000" )
  Glob.SysColor  :=  Format("0x{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit( Format("{:06X}"
                   , DllCall("User32.dll\GetSysColor", "Int",15)))* )

  Title          :=  StrLen(GuiOptions.Title) ? GuiOptions.Title : "ChooseColors()"
  NewOptions     :=  GuiOptions.New
  ShowOptions    :=  GuiOptions.Show
  DefaultOpts    :=  "-Resize +Sysmenu +LabelChooseColors_Gui +HwndhGui"
  Glob.Menu      :=  "|" . StrReplace(StrReplace(GuiOptions.Menu, "`r`n", "`n"), "`n", "|") . "|[]"
  _DefaultGui    :=  A_DefaultGUI
  Gui, ChooseColors: New, +AlwaysOnTop %NewOptions% %DefaultOpts%, %Title%
  Gui, %_DefaultGui%: Default

  ChooseColors_RegisterClass(Glob, True) ; Register "CcStatic"

  Glob.CCUI      := "ahk_id" . (Glob.Gui.Hwnd := hGui)
  Glob.Gui.Hicon := ChooseColors_GetIcon("caption.png")
  DllCall("SendMessage", "Ptr",Glob.Gui.Hwnd, "Int",WM_SETICON:=0x80, "Ptr",0, "Ptr",Glob.Gui.Hicon)
  Glob.Func.Keypressed        :=  Func("ChooseColors_Keypress").Bind(KeyUp)

  Glob.Func.Gui               :=  Func("ChooseColors_Gui").Bind(Glob)
  Glob.Func.GuiControl        :=  Func("ChooseColors_GuiControl").Bind(Glob)
  Glob.Func.GuiControlGet     :=  Func("ChooseColors_GuiControlGet").Bind(Glob)
  Glob.Func.SetImage          :=  Func("ChooseColors_SetImage")
  Glob.Func.CreateGradient    :=  Func("ChooseColors_CreateGradient")
  Glob.Func.CreateBitmap      :=  Func("ChooseColors_CreateBitmap")

  Glob.Func.CreateBitmapText  :=  Func("ChooseColors_CreateBitmapText").Bind(Glob)
  Glob.Func.Settings          :=  Func("ChooseColors_Settings").Bind(Glob)
  Glob.Func.CoordMode         :=  Func("ChooseColors_CoordMode").Bind(Glob)
  Glob.Func.GetHexColor       :=  Func("ChooseColors_GetHexColor").Bind(Glob)
  Glob.Func.SetColorName      :=  Func("ChooseColors_SetColorName").Bind(Glob)
  Glob.Func.HistorySetBitmap  :=  Func("ChooseColors_HistorySetBitmap").Bind(Glob)
  Glob.Func.SetImageAnimate   :=  Func("ChooseColors_SetImageAnimate").Bind(Glob)
  Glob.Func.EditHex           :=  Func("ChooseColors_Hex").Bind(Glob)
  Glob.Func.ClipCursor        :=  Func("ChooseColors_ClipCursor")
  Glob.Func.GetWindowRect     :=  Func("ChooseColors_GetWindowRect")
  Glob.Func.GetMonitorRect    :=  Func("ChooseColors_GetMonitorRect")
  Glob.Func.SetRect           :=  Func("ChooseColors_SetRect")
  Glob.Func.GetImage          :=  Func("ChooseColors_GetImage")
  Glob.Func.DeleteBitmap      :=  Func("ChooseColors_DeleteBitmap")
  Glob.Func.UpdateRGBHSL      :=  Func("ChooseColors_UpdateRGBHSL")
  Glob.Func.SetSystemCursor   :=  Func("ChooseColors_SetSystemCursor")
  Glob.Func.MemDC             :=  Func("ChooseColors_MemDC")

  Gui            :=  Glob.Func.Gui
  GuiControl     :=  Glob.Func.GuiControl
  GuiControlGet  :=  Glob.Func.GuiControlGet
  SetImage       :=  Glob.Func.SetImage
  CreateBitmap   :=  Glob.Func.CreateBitmap
  CreateGradient :=  Glob.Func.CreateGradient
  AddUpDown      :=  Func("ChooseColors_AddUpDown").Bind(Glob)
  AddGoSub       :=  Func("ChooseColors_GoSub").Bind(Glob)

  Gui.Call("+DpiScale")
  Gui.Call("Font", TextFont*)
  Gui.Call("Margin", 0, 0)

  Gui.Call("Add", "Button", "HwndCancelB x0 y0 w0 h0 -Tabstop", "&Cancel")
  AddGoSub.Call("CancelB", "ChooseColors_GuiCancel", Glob)
  Gui.Call("Add", "Button", "HwndOkayB Default x+0 yp w0 h0 -Tabstop", "&Ok")
  AddGoSub.Call("OkayB", "ChooseColors_GuiOkay", Glob)

  Gui.Call("Add", "Custom",   "HwndGradient CcStatic w288 h288 SS_NOTIFY SS_REALSIZECONTROL SS_BITMAP")
  AddGoSub.Call("Gradient", "ChooseColors_HueSelect", Glob)
  Gui.Call("Add", "Custom",   "HwndHue CcStatic x0 y+0 w288 h16 SS_NOTIFY SS_REALSIZECONTROL SS_BITMAP")
  AddGoSub.Call("Hue", "ChooseColors_HueSelect", Glob)
  HueColors := [0xFF0000, 0xFFFF00, 0x00FF00, 0x00FFFF, 0x0000FF, 0xFF00FF, 0xFF0000]
  Hbm := CreateGradient.Call(Glob.Hue.W, 1, False, HueColors*)
  SetImage.Call(Glob.Hue.Hwnd, Hbm, 1)

  SH := Max(2, Min(14, SliderH))
  Gui.Call("Margin", 16, 12)
  Gui.Call("Add", "Text",     "x16  w16 Section", "R")
  Gui.Call("Add", "Text",     "x+0 w0", "&R")
  Gui.Call("Add", "Edit",     "HwndEditR x+0 w40 h26 Number Limit3 Right")
  AddGoSub.Call("EditR", "ChooseColors_RGB", Glob)
  AddUpDown.Call("EditR",     "HwndUpdown Range0-255")
  Gui.Call("Add", "Custom",   "HwndSlider1 CcStatic x16 y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
  AddGoSub.Call("Slider1", "ChooseColors_Slider", Glob)
  Tbm := CreateBitmap.Call(Glob.Slider1.W, SH, 0xDD0000),   SetImage.Call(Glob.Slider1.Hwnd, Tbm)

  Gui.Call("Margin", 16, 6)
  Gui.Call("Add", "Text",     "x16  w16", "G")
  Gui.Call("Add", "Text",     "x+0 w0", "&G")
  Gui.Call("Add", "Edit",     "HwndEditG x+0 w40 h26 Number Limit3 Right")
  AddGoSub.Call("EditG", "ChooseColors_RGB", Glob)
  AddUpDown.Call("EditG",     "HwndUpdown Range0-255")
  Gui.Call("Add", "Custom",   "HwndSlider2 CcStatic x16 y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
  AddGoSub.Call("Slider2", "ChooseColors_Slider", Glob)
  Tbm := CreateBitmap.Call(Glob.Slider2.W, SH, 0x00DD00),   SetImage.Call(Glob.Slider2.Hwnd, Tbm)

  Gui.Call("Add", "Text",     "x16  w16", "B")
  Gui.Call("Add", "Text",     "x+0 w0", "&B")
  Gui.Call("Add", "Edit",     "HwndEditB x+0 w40 h26 Number Limit3 Right")
  AddGoSub.Call("EditB", "ChooseColors_RGB", Glob)
  AddUpDown.Call("EditB",     "HwndUpdown Range0-255")
  Gui.Call("Add", "Custom",   "HwndSlider3 CcStatic x16 y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
  AddGoSub.Call("Slider3", "ChooseColors_Slider", Glob)
  Tbm := CreateBitmap.Call(Glob.Slider3.W, SH, 0x0000DD),   SetImage.Call(Glob.Slider3.Hwnd, Tbm)

  Gui.Call("Add", "Text",     "x+m ys w16 Section", "H")
  Gui.Call("Add", "Text",     "x+0 w0", "&H")
  Gui.Call("Add", "Edit",     "HwndEditH x+0 w40 h26 Number Limit3 Right")
  AddGoSub.Call("EditH", "ChooseColors_HLS", Glob)
  AddUpDown.Call("EditH",     "HwndUpdown Range0-360 Wrap")
  Gui.Call("Add", "Text",     "x+4 w12 hp 0x200 Disabled", Chr(176))
  Gui.Call("Add", "Custom",   "HwndSlider4 CcStatic xs y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
  AddGoSub.Call("Slider4", "ChooseColors_Slider", Glob)
  Tbm := CreateGradient.Call(Glob.Slider4.W, SH, False, HueColors*),    SetImage.Call(Glob.Slider4.Hwnd, Tbm)

  Gui.Call("Add", "Text",     "xs w16 hp", "S")
  Gui.Call("Add", "Text",     "x+0 w0", "&S")
  Gui.Call("Add", "Edit",     "HwndEditS x+0 w40 h26 Number Limit3 Right")
  AddGoSub.Call("EditS", "ChooseColors_HLS", Glob)
  AddUpDown.Call("EditS",     "HwndUpdown Range0-100")
  Gui.Call("Add", "Text",     "x+4 w12 hp 0x200 Disabled", "%")
  Gui.Call("Add", "Custom",   "HwndSlider5 CcStatic xs y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
  AddGoSub.Call("Slider5", "ChooseColors_Slider", Glob)
  Tbm := CreateGradient.Call(Glob.Slider5.W, SH, False, 0x7F7F7F, 0x7F7F7F, 0x7F7F7F)
  SetImage.Call(Glob.Slider5.Hwnd, Tbm)

  Gui.Call("Add", "Text",     "xs w16 hp", "L")
  Gui.Call("Add", "Text",     "x+0 w0", "&L")
  Gui.Call("Add", "Edit",     "HwndEditL x+0 w40 h26 Number Limit3 Right")
  AddGoSub.Call("EditL", "ChooseColors_HLS", Glob)
  AddUpDown.Call("EditL",     "HwndUpdown Range0-100")
  Gui.Call("Add", "Text",     "x+2 w12 hp 0x200 Disabled", "%")
  Gui.Call("Add", "Custom",   "HwndSlider6 CcStatic xs y+0 w56 h14 SS_NOTIFY SS_CENTERIMAGE SS_BITMAP", Glob.Updown.Hwnd)
  AddGoSub.Call("Slider6", "ChooseColors_Slider", Glob)
  Tbm := CreateGradient.Call(Glob.Slider6.W, SH, False, 0x444444, 0xAAAAAA, 0xFFFFFF)
  SetImage.Call(Glob.Slider6.Hwnd, Tbm)

  Gui.Call("Add", "Text",     "HwndColorName x16 y+0 w250 h16 SS_CENTERIMAGE Right")
  Gui.Call("Add", "Custom",   "HwndHistory CcStatic y+2 w250 h12 SS_NOTIFY SS_REALSIZECONTROL SS_BITMAP +E0x20000")
  AddGoSub.Call("History", "ChooseColors_HueSelect2", Glob)
  Gui.Call("Add", "Button",   "HwndDelQB xp yp w0 hp -Tabstop", "&D", hDelQB:=0)
  AddGoSub.Call("DelQB", "ChooseColors_DelColorFmQ", Glob)

  Gui.Call("Margin", 16, 12)
  IH := Max(23, Min(32, CancelH))
  Gui.Call("Add", "Picture",  "HwndPickScr x16 y+m w24 Left SS_CENTERIMAGE SS_ICON h" . IH)
  GuiControl.Call("", Glob.PickScr.Hwnd, "*w0 *h0 hicon:" . ChooseColors_GetIcon("pickscr.png"))
  AddGoSub.Call("PickScr", "ChooseColors_PickScr", Glob)

  Gui.Call("Add", "Picture",  "HwndPickClr x+8 yp wp hp SS_CENTERIMAGE SS_ICON")
  GuiControl.Call("", Glob.PickClr.Hwnd, "*w0 *h0 hicon:" . ChooseColors_GetIcon("pickclr.png"))
  AddGoSub.Call("PickClr", "ChooseColors_PickScr", Glob)

  CW := Max(60, Min(80, CancelW))
  Gui.Call("Add", "Custom",     "HwndCancel CcStatic x+m hp -Tabstop Center SS_NOTIFY SS_BITMAP w" . CW, "&Cancel")
  AddGoSub.Call("Cancel", "ChooseColors_GuiCancel", Glob)
  Tbm := Glob.Func.CreateBitmapText.Call(Glob.Cancel.Hwnd)
  SetImage.Call(Glob.Cancel.Hwnd, Tbm)

  Gui.Call("Add", "Custom",     "HwndOkay   CcStatic x+m hp -Tabstop Center SS_NOTIFY SS_BITMAP w" . (CW//3)*2, "&OK")

  AddGoSub.Call("Okay", "ChooseColors_GuiOkay", Glob)
  Tbm := Glob.Func.CreateBitmapText.Call(Glob.Okay.Hwnd)
  SetImage.Call(Glob.Okay.Hwnd, Tbm)

  Gui.Call("Margin", 16, 6)
  Gui.Call("Add", "Text",     "x157 ys w40 Right Section h40 BackgroundTrans", "Old")
  Gui.Call("Add", "Progress", "x+6 w68 hp Disabled Border Background" . OldColor)
  Gui.Call("Add", "Custom",   "HwndOld CcStatic xp yp wp hp BackgroundTrans SS_NOTIFY WS_EX_STATICEDGE")
  AddGoSub.Call("Old", "ChooseColors_SetNew", Glob, OldColor)

  Gui.Call("Add", "Text",     "HwndRandom  xs w40 y+m hp Right", "New")
  Gui.Call("Add", "Button",   "HwndRandomB x+0 yp w0 hp -Tabstop", "&N")
  AddGoSub.Call("Random",  "ChooseColors_GenRandom", Glob)
  AddGoSub.Call("RandomB", "ChooseColors_GenRandom", Glob)
  Gui.Call("Add", "Progress", "HwndNew x+6 w68 hp Disabled Border Background" . OldColor)
  Gui.Call("Add", "Custom",   "HwndPreview CcStatic xp yp wp hp BackgroundTrans SS_NOTIFY WS_EX_STATICEDGE")
  AddGoSub.Call("Preview", "ChooseColors_Preview", Glob, Glob.Preview.Hwnd)

  Gui.Call("Add", "Text",     "HwndAddQ xs y+m w40 h26 Right", "#")
  Gui.Call("Add", "Button",   "HwndAddQB x+0 yp w0 h0 -Tabstop", "&A")
  AddGoSub.Call("AddQ",  "ChooseColors_AddColorToQ", Glob)
  AddGoSub.Call("AddQB", "ChooseColors_AddColorToQ", Glob)
  Gui.Call("Add", "Text",     "x+0 w0", "&X")

  Gui.Call("Font", MonoFont*)
  Gui.Call("Add", "Edit",     "HwndEdit0 x+6  w0 h0 ReadOnly -Tabstop", &Glob)
  Gui.Call("Add", "Edit",     "HwndEditHex xp yp w68 h26 Uppercase Limit6 Right", Color)
  AddGoSub.Call("EditHex", "ChooseColors_Hex", Glob)
  Gui.Call("Font", TextFont*)

  Gui.Call("-DpiScale")

  RM := Glob.Old.W + Glob.Old.X
  GuiControl.Call("Move", Glob.Okay.Hwnd,   "x" . RM - Glob.Okay.W )
  GuiControl.Call("Move", Glob.Cancel.Hwnd, "x" . RM - Glob.Okay.W - Glob.PickScr.X - Glob.Cancel.W)
  NW := (Glob.History.W // 25) * 25
  GuiControl.Call("Move", Glob.ColorName.Hwnd, "x" . (RM-NW) . " w" . (NW))
  GuiControl.Call("Move", Glob.History.Hwnd,   "x" . (RM-NW) . " w" . (NW))
  GuiControl.Call("Move", Glob.PickScr.Hwnd,   "x" . (RM-NW))
  GuiControlGet.Call("Pos", Glob.PickScr.Hwnd, X, Y, W, H)
  GuiControl.Call("Move", Glob.PickClr.Hwnd,   "x" . (X + W + (8*(A_ScreenDPI/96))))

  Gui.Call("+DpiScale")

  Dim := Glob.Hue.W
  ChooseColors_GradientStruct(Dim, VERT, MESH)
  hMainBM := CreateBitmap.Call(Dim, Dim)
  Glob.Func.MemDC.Call(hMainDC, hMainBM)

  Glob.Func.GradientPaint := Func("ChooseColors_GradientPaint").Bind(hMainDC, &VERT, &MESH, Dim, Glob.Gradient.Hwnd)
  Glob.Func.GradientSet   := Func("ChooseColors_GradientSet").Bind(Glob.Gradient.Hwnd, hMainBM)

  hMsimg32 := DllCall("Kernel32.dll\LoadLibrary", "Str","Msimg32.dll", "Ptr")
  hShlwapi := DllCall("Kernel32.dll\LoadLibrary", "Str","Shlwapi.dll", "Ptr")
  Glob.Func.HistorySetBitmap()

  Gui.Call("Margin", 0, 12)
  Gui.Call("Show", "Hide AutoSize xCenter yCenter")

  Glob.Func.GradientPaint.Call("0x" . Color)
  Glob.Func.GradientSet.Call()
  Gui.Call("Show", ShowOptions . " AutoSize")
  GuiControl.Call("", Glob.EditHex.Hwnd, Color)

  If ( WinActive("ahk_id" . Glob.Gui.Hwnd) )
       GuiControl.Call("Focus", Glob.EditHex.Hwnd)

  SetBatchLines, %_Batchlines%
  Glob.Okay := False
  WinWaitClose, % "ahk_id" . Glob.Gui.Hwnd

  Glob.Func.MemDC.Call(hMainDC, False)
  Glob.Func.DeleteBitmap.Call(hMainBM)
  DllCall("User32.dll\DestroyIcon", "Ptr",Glob.Gui.Hicon)
  DllCall("Kernel32.dll\FreeLibrary", "Ptr",hMsimg32)
  DllCall("Kernel32.dll\FreeLibrary", "Ptr",hShlwapi)
  ChooseColors_RegisterClass(Glob, False) ; Unregister "CcStatic"

Return ( Glob.Okay ? StrSplit(Glob.Que, "|") : "" )
}
; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =


ChooseColors_GuiOkay(Glob) {
If ! ( StrLen(Glob.Que) )
       SoundPlay *-1
Else DllCall("SendMessage", "Ptr",Glob.Gui.Hwnd, "Int",0x10 * (Glob.Okay := True), "Ptr",0, "Ptr",0) ; WM_CLOSE
}

ChooseColors_GuiCancel(Glob) {
     DllCall("SendMessage", "Ptr",Glob.Gui.Hwnd, "Int",0x10, "Ptr",0, "Ptr",0)                       ; WM_CLOSE
}

ChooseColors_GuiEscape(hGui) {
     If ( GetKeyState("LButton", "P") = False )
          DllCall("SendMessage", "Ptr",hGui, "Int",0x10, "Ptr",0, "Ptr",0)                           ; WM_CLOSE
Return
}

ChooseColors_GuiClose(hGui) {
    Gui, %hGui%:Destroy
}

ChooseColors_GuiContextMenu(GuiHwnd, CtrlHwnd, EventInfo, IsRightClick, X, Y) {
Local
    GuiControlGet, ObjPtr, %GuiHwnd%:, Edit7
    Glob := Object(ObjPtr)
    MouseGetPos,,,, hCtrl, 2
    Switch ( hCtrl )
    {
             Case Glob.History.Hwnd  : ChooseColors_HistoryMenu(Glob)
             Case Glob.Gradient.Hwnd : ChooseColors_PaletteMenu(Glob, Glob.Gradient.Hwnd)
             Case Glob.Preview.Hwnd  : ChooseColors_PaletteMenu(Glob, Glob.Preview.Hwnd)
    }
}
; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =


ChooseColors_RegisterClass(Glob, Register:=1) {
Local
    If ( Register=False )
    {
        DllCall("Kernel32.dll\GlobalFree", "Ptr",Glob.StaticProc, "Ptr")
        Return DllCall("User32.dll\UnregisterClass", "Str","CcStatic", "Ptr",0)
    }

    P8 := (A_PtrSize=8),    Classname   := "CcStatic"
    VarSetCapacity(WNDCLASS, P8 ? 72 : 40, 0)
    DllCall("User32.dll\GetClassInfo", "Ptr",0, "Str","Static", "Ptr",&WNDCLASS)

    OldProc     := NumGet(WNDCLASS, A_PtrSize, "Ptr")
    StaticProc  := Glob.StaticProc := RegisterCallback("ChooseColors_CcStaticProc",, 4, OldProc)
    hCursor     := DllCall("User32.dll\LoadCursor", "Ptr",0, "Int",32649, "Ptr") ; IDC_HAND

    NumPut(hCursor,     WNDCLASS, P8 ? 40 : 24, "Ptr")
    NumPut(StaticProc,  WNDCLASS, A_PtrSize, "Ptr")
    NumPut(&Classname,  WNDCLASS, P8 ? 64 : 36, "Ptr")

Return DllCall("User32.dll\RegisterClass", "Ptr",&WNDCLASS)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_CcStaticProc(Hwnd, Msg, WP, LP) {
Local
    If ( Msg = 2 ) ; WM_DESTROY
    If ( Hbm := DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",0x173, "Ptr",0, "Ptr",0, "Ptr") ) ; STM_GETIMAGE
         DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm)

Return DllCall("User32.dll\CallWindowProc", "Ptr",A_EventInfo, "Int",Hwnd, "Int",Msg, "Ptr",WP, "Ptr",LP)
}
; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

ChooseColors_Preview(Glob, hCtrl:=0) {
Local
    If GetKeyState("Shift", "P")
       Return ChooseColors_AddColorToQ(Glob, hCtrl, "")

    Glob.Func.GetHexColor.Call(Color)
    Hbm := Glob.Func.CreateBitmap.Call(1, 1)
    DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",4*1, "UIntP","0x" . Color)
    Glob.Func.SetImage.Call(Glob.Gradient.Hwnd, Hbm, True)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_HLS(Glob, hCtrl, GuiEvent, EventInfo) {
Local
    If ( DllCall("User32.dll\GetFocus", "Ptr") != hCtrl )
         Return

    GuiControl    := Glob.Func.GuiControl
    GuiControlGet := Glob.Func.GuiControlGet

    GuiControlGet.Call("", Glob.EditH.Hwnd, H:=0)
    GuiControlGet.Call("", Glob.EditL.Hwnd, L:=0)
    GuiControlGet.Call("", Glob.EditS.Hwnd, S:=0)

    Color := DllCall("Shlwapi.dll\ColorHLSToRGB", "Short",H/1.5, "Short",L*2.4, "Short",S*2.4, "UInt")
    Color := Format( "{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Format("{:06X}", Color))*)
    GuiControl.Call("", Glob.EditHex.Hwnd, Color)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_RGB(Glob, hCtrl, GuiEvent, EventInfo) {
Local
    If ( DllCall("User32.dll\GetFocus", "Ptr") != hCtrl )
         Return

    GuiControl    := Glob.Func.GuiControl
    GuiControlGet := Glob.Func.GuiControlGet

    GuiControlGet.Call("", Glob.EditR.Hwnd, R)
    GuiControlGet.Call("", Glob.EditG.Hwnd, G)
    GuiControlGet.Call("", Glob.EditB.Hwnd, B)

    Color := Format("{:02X}{:02X}{:02X}", Min(R, 255), Min(G, 255), Min(B, 255))
    GuiControl.Call("", Glob.EditHex.Hwnd, Color)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GetHexColor(Glob, ByRef Color:="") {
Local
    Glob.Func.GuiControlGet.Call("", Glob.EditHex.Hwnd, Color:="")
Return ( Color := Format("{:06X}", "0x" . Color) )
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_Hex(Glob, hEditHex, GuiEvent, EventInfo) {
Local
Critical On
    Glob.Func.GetHexColor.Call(Hex)
    Glob.Func.GuiControl.Call("+Background" . Hex, Glob.New.Hwnd)
    Glob.Func.SetColorName.Call(Hex)
    Glob.Func.UpdateRGBHSL.Call(Glob, Hex)

    If ( Glob.Paint=True )
         Glob.Func.GradientPaint.Call("0x" . Hex)

    If ( GetKeyState("LButton", "P")=False )
    {
         GradientSet := Glob.Func.GradientSet
         SetTimer, %GradientSet%, -100
    }
Critical Off
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_UpdateRGBHSL(Glob, Hex) {
Local
    hFocus        := DllCall("User32.dll\GetFocus", "Ptr")
    GuiControl    := Glob.Func.GuiControl
    Color  := Format( "0x{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Hex)*)
    DllCall("Shlwapi.dll\ColorRGBToHLS", "Int",Color, "ShortP",H:=0, "ShortP",L:=0, "ShortP",S:=0)

    _ := ( Glob.EditH.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditH.Hwnd, Round(H*1.5))
  , _ := ( Glob.EditL.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditL.Hwnd, Round(L/2.4))
  , _ := ( Glob.EditS.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditS.Hwnd, Round(S/2.4))
  , RGB := Format("0x{:x}", "0x" . Hex) + 0
  , _ := ( Glob.EditR.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditR.Hwnd, RGB>>16 & 255)
  , _ := ( Glob.EditG.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditG.Hwnd, RGB>>8  & 255)
  , _ := ( Glob.EditB.Hwnd = hFocus ) ? 0 : GuiControl.Call("", Glob.EditB.Hwnd, RGB     & 255)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GetMonitorRect(Hwnd, ByRef RECT:="", ByRef x1:=0, ByRef y1:=0, ByRef x2:=0, ByRef y2:=0) {
Local
    hMon := DllCall("User32.dll\MonitorFromWindow", "Ptr",HWnd, "Int",0x2, "Ptr") ; _DEFAULTTONEAREST = 0x2
  , VarSetCapacity(MONITORINFO, 40, 0), NumPut(40, MONITORINFO, "Int")
  , DllCall("User32.dll\GetMonitorInfo", "Ptr",hMon, "Ptr",&MONITORINFO)
  , VarSetCapacity(RECT, 16)
  , x1 := NumGet(MONITORINFO,  4, "Int"),    y1 := NumGet(MONITORINFO,  8, "Int")
  , x2 := NumGet(MONITORINFO, 12, "Int"),    y2 := NumGet(MONITORINFO, 16, "Int")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GetWindowRect(Hwnd, ByRef RECT:="", ByRef x1:=0, ByRef y1:=0, ByRef x2:=0, ByRef y2:=0) {
Local
    VarSetCapacity(RECT, 16)
  , DllCall("User32.dll\GetWindowRect", "Ptr",Hwnd, "Ptr",&RECT)
  , x1 := NumGet(RECT,0, "Int"),   y1 := NumGet(RECT,4, "Int")
  , x2 := NumGet(RECT,8, "Int"),   y2 := NumGet(RECT,12,"Int")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_SetRect(ByRef RECT, x1, y1, x2, y2) {
Local
    VarSetCapacity(RECT, 16)
    DllCall("User32.dll\SetRect", "Ptr",&RECT, "Int",x1, "Int",y1, "Int",x2, "Int",y2)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_SetSystemCursor(Which:=0, With:=0) {
Local
    If ! ( Which ) ;                             SPI_SETCURSORS := 0x57
           Return DllCall("User32.dll\SystemParametersInfo", "Int",0x57, "Int",0, "Int",0, "Int",0)

    IDC := { "IDC_APPSTARTING":32650, "IDC_ARROW":32512, "IDC_CROSS":32515, "IDC_HAND":32649
           , "IDC_HELP":32651, "IDC_IBEAM":32513, "IDC_NO":32648, "IDC_SIZEALL":32646, "IDC_SIZENESW":32643
           , "IDC_SIZENS":32645, "IDC_SIZENWSE":32642, "IDC_SIZEWE":32644, "IDC_UPARROW":32516, "IDC_WAIT":32514 }

    hCursor  := DllCall("User32.dll\LoadCursor", "Ptr",0, "Int",IDC[With], "Ptr")
    DllCall("User32.dll\SetSystemCursor", "Ptr",hCursor, "Int",IDC[Which])
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_ClipCursor(ByRef RECT:=0) {
Local
    DllCall("User32.dll\ClipCursor", "Ptr",IsByRef(RECT) ? &RECT : 0)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GradientSet(hGradient, hMainBM) {
Local ; ; STM_GETIMAGE = 0x173
    Hbm := DllCall("User32.dll\CopyImage", "Ptr",hMainBM, "Int",0x0, "Int",0, "Int",0, "Int",0x2000, "Ptr")
    ChooseColors_SetImage(hGradient, Hbm)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GradientPaint(mDC, pVERT, pMESH, W, hGradient, Color) {
Local
    Color := Format("{:06X}", Color & 0xFFFFFF)
  , Color := Format("0x{5:}{6:}00{3:}{4:}00{1:}{2:}00", StrSplit(Color)*)
  , NumPut(Color, pVERT+24, "Int64")
  , DllCall("Msimg32.dll\GradientFill", "Ptr",mDC, "Ptr",pVERT, "Int",4, "Ptr",pMESH, "Int",2, "Int",2)
  , hDC := DllCall("User32.dll\GetDC", "Ptr",hGradient, "Ptr")
  , DllCall("Gdi32.dll\GdiAlphaBlend"
          , "Ptr",hDC, "Int",0, "Int",0, "Int",W, "Int",W
          , "Ptr",mDC, "Int",0, "Int",0, "Int",W, "Int",W, "Int",16711680) ; 0x00FF0000 = 16711680
  , DllCall("User32.dll\ReleaseDC", "Ptr",hGradient, "Ptr",hDC)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GradientMemDC(ByRef mDC, W:=0) {
Local
    If ( W )
         Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",24, "PtrP",0, "Ptr")
       , Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",W, "Int",0x200C, "Ptr")
       , mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
       , DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
       , DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
    Else
         DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
       , mDC := DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC) * 0
       , Hbm := DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm) * 0
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GradientStruct(W, ByRef VERT, ByRef MESH) {
Local
    VarSetCapacity(VERT, 4*16, 0),   VarSetCapacity(MESH, 2*12, 0)
  , NumPut(0xFE00CA00DE00, NumPut(0xFF00FF00FF00, VERT, 8, "Int64")+8, "Int64")
  , NumPut(W, NumPut(W, NumPut(W, NumPut(W, VERT, 16, "Int")+16, "Int")+8, "Int"), "Int")
  , NumPut(1, NumPut(3, NumPut(2, NumPut(2, NumPut(1, MESH, 4, "Int"), "Int"), "Int"), "Int"), "Int")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_SetNew(Glob, Color, Esc:=0) {
Local
    Glob.Esc := Esc
    Glob.Func.GuiControl.Call("Focus", Glob.EditHex.Hwnd)
    Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_HueSelect2(Glob, hCtrl, GuiEvent, EventInfo) {
Local
    Glob.Func.CoordMode.Call("Save")
    MouseGetPos, X, Y
    PixelGetColor, Color, %X%, %Y%, RGB
    Color := SubStr(Color, 3)
    Glob.Func.CoordMode.Call("Restore")

    If ( InStr(Glob.Que, Color) = False )
         Return

    If ( GetKeyState("Shift", "P")=False )
         Return ChooseColors_HueSelect(Glob, hCtrl, GuiEvent, EventInfo)

    ChooseColors_DelColorFmQ(Glob, 0, Color)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_HueSelect(Glob, hCtrl, GuiEvent, EventInfo) {
Local
    Glob.Func.Settings.Call("Save")
    Glob.Func.GuiControl.Call("Focus", Glob.Edit0.Hwnd)

    Glob.Func.GetWindowRect.Call(hCtrl, RECT, x1, y1, x2, y2)
    If ( hCtrl = Glob.History.Hwnd )
         StrReplace(Glob.Que, "|", "|", nColors:=0)
       , W  := x2 - x1
       , x1 :=  x1 + (W // 25) * (24-nColors) + 1
       , x2 -= 1

    If   ( hCtrl != Glob.Gradient.Hwnd )
           y3 := y1 + ((y2-y1)//2)
        ,  _  := Glob.Func.SetRect.Call(RECT, x1, y3, x2, y3+1)
    Else ( Glob.Paint := False )

    Glob.Func.ClipCursor.Call(RECT)
    PColor := 0, Color := ""
    While ( WinActive(Glob.CCUI) && GetKeyState("LButton", "P") && !GetKeyState("Escape", "P") )
    {
            Sleep 1
            MouseGetPos, X, Y
            PixelGetColor, Color, %X%, %Y%, RGB
            Color := SubStr(Color,3)

            If ( Glob.Func.Keypressed() )
                 ChooseColors_AddColorToQ(Glob, 0, Color)

            If ( PColor != Color )
                 Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, PColor:=Color)
    }

    Glob.Esc := ( GetKeyState("Escape", "P")=True || WinActive(Glob.CCUI)=False )
    Glob.Func.ClipCursor.Call(False)

    If ( Glob.Esc )
         Glob.Func.Settings.Call("Restore")
    Else
    {
         If ( hCtrl=Glob.History.Hwnd )
              ChooseColors_AddColorToQ(Glob, 0, Color)
         Glob.Func.Settings.Call("Clear")
    }
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_Slider(Glob, hCtrl, GuiEvent, EventInfo) {
Local
    Glob.Func.Settings.Call("Save")

    Glob.Func.GuiControlGet.Call("", hCtrl, hUpDown:=0)
    DllCall("SendMessage", "Ptr",hUpDown, "Int",UDM_GETRANGE32 := 0x470, "PtrP",Min:=0, "PtrP",Max:=0)
    Glob.Func.GuiControlGet.Call("", hUpdown, Pos:=0)
    Glob.Func.GuiControl.Call("", hUpDown, Pos)
    hBuddy  := DllCall("User32.dll\SendMessage", "Ptr",hUpDown, "Int",UDM_GETBUDDY := 0x46A, "Ptr",0, "Ptr",0, "Ptr")
    Glob.Func.GuiControl.Call("Focus", hBuddy)

    Glob.Func.GetWindowRect.Call(hCtrl, RECT, x1, y1, x2, y2)
    y3 := y1 + ((y2-y1)//2)          ; Vertical center
    W  := x2 - x1 - 1                ; Width of control
    X  := X1 + Round(W * (Pos/Max))  ; Find X pos for MouseMove
    Glob.Func.SetRect.Call(RECT, x1, y3, x2, y3+1)

    SavedX := X
    MouseMove, %X%, %y3%, 0
    Glob.Func.ClipCursor.Call(RECT)

    PX := 0
    While ( WinActive(Glob.CCUI) && GetKeyState("LButton", "P") && !GetKeyState("Escape", "P") )
    {
            Sleep 1
            If ( Glob.Func.Keypressed() )
                 Color := Glob.Func.GetHexColor.Call()
               , ChooseColors_AddColorToQ(Glob, 0, Color)

            MouseGetPos, X
            If ( PX =  X )
                 Continue
            Else PX := X

            Val := ( (X-X1) / W )
            Glob.Func.GuiControl.Call("", hUpDown, Max*Val)

            If ( Max=255 )
                 Tooltip % Round(Val*100) . "%",,, 20
    }

    Glob.Esc := ( GetKeyState("Escape", "P")=True || WinActive(Glob.CCUI)=False )
    Glob.Func.ClipCursor.Call(False)
    If ( Max=255 )
         Tooltip,,,, 20

    If ( Glob.Esc )
         Glob.Func.Settings.Call("Restore")
    Else Glob.Func.Settings.Call("Clear")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_PickScr(Glob, hCtrl, GuiEvent, EventInfo) {
Local
    Glob.Func.Settings.Call("Save")

    TW            := Glob.Hue.W
    Glob.Func.GetWindowRect.Call(hCtrl, RECT, x1, y1, x2, y2)
    x1 := x1 + ((x2-x1)/2)
    y1 := y1 + ((y2-y1)/2)
    Glob.Func.SetRect.Call(RECT, x1, y1, x1+1, y1+1)
    Glob.Func.ClipCursor.Call(RECT)
    Glob.Func.ClipCursor.Call(False)

    Glob.Func.GuiControl.Call("Focus", Glob.Edit0.Hwnd)
    Glob.Func.GetHexColor.Call(CurrentColor)
    Glob.Func.GuiControlGet.Call("", Glob.ColorName.Hwnd, ColorName)

    PickClr := ( hCtrl = Glob.PickClr.Hwnd )
    SW  := ( PickClr ? 1 : 40*(A_ScreenDPI/96) )
    Off := ( PickClr ? 0 : SW//2 )

    Hbm := Glob.Func.CreateBitmap.Call(SW, SW)
    Glob.Func.MemDC.Call(mDC:=0, Hbm)
    sWnd := DllCall("User32.dll\GetDesktopWindow", "Ptr")
    sDC  := DllCall("User32.dll\GetWindowDC", "Ptr",sWnd, "Ptr")
    tDC  := DllCall("User32.dll\GetWindowDC", "Ptr",Glob.Gradient.Hwnd, "Ptr")

    Glob.Func.GetMonitorRect.Call(Glob.Gui.Hwnd, RECT, x1, y1, x2, y2)
    Glob.Func.SetRect.Call(RECT, x1+Off, y1+Off, x2-Off, y2-Off)
    DllCall("SetForegroundWindow","Ptr",A_ScriptHwnd)
    Glob.Func.ClipCursor.Call(RECT)
    If ( Glob.PickClr.Hwnd )
         ChooseColors_BoxCur(SW, SW)
    Else Glob.Func.SetSystemCursor.Call("IDC_ARROW", "IDC_HELP")

    Glob.Paint := False
    Color := ""
    While ( GetKeyState("LButton", "P") && ! GetKeyState("Escape", "P") )
    {
          Sleep 0
          Glob.Func.ClipCursor.Call(RECT)

          MouseGetPos, X, Y
          X -= Off, Y -= Off

          DllCall("Gdi32.dll\GdiAlphaBlend"
                , "Ptr",mDC, "Int",0, "Int",0, "Int",SW, "Int",SW
                , "Ptr",sDC, "Int",X, "Int",Y, "Int",SW, "Int",SW, "Int",0x00FF0000)

          DllCall("Gdi32.dll\GdiAlphaBlend"
                , "Ptr",tDC, "Int",0, "Int",0, "Int",TW, "Int",TW
                , "Ptr",mDC, "Int",0, "Int",0, "Int",SW, "Int",SW, "Int",0x00FF0000)

          Color := DllCall("Gdi32.dll\GetPixel", "Ptr",mDC, "Int",Off, "Int",Off, "UInt")
          Color := Format("{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Format("{:06X}", Color))*)
          Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color)

          If ( Glob.Func.Keypressed() )
               ChooseColors_AddColorToQ(Glob, 0, Color)
    }

    Glob.Esc   := ( GetKeyState("Escape", "P") || StrLen(Color)=0 )
    Glob.Func.GuiControl.Call("-g", Glob.EditHex.Hwnd)
    Glob.Func.SetSystemCursor.Call(False)
    Glob.Func.ClipCursor.Call(False)

    DllCall("User32.dll\ReleaseDC", "Ptr",sWnd, "Ptr",sDC)
    DllCall("User32.dll\ReleaseDC", "Ptr",Glob.Gradient.Hwnd, "Ptr",tDC)
    Glob.Func.MemDC.Call(mDC)

    If ( Glob.Esc )
         Glob.Func.DeleteBitmap.Call(Hbm)
       , Glob.Func.Settings.Call("Restore")
    Else Glob.Func.SetImage.Call(Glob.Gradient.Hwnd, Hbm, True)
       , Glob.Func.Settings.Call("Clear")

    Glob.Func.Gui.Call("Show")
    Glob.Func.GuiControl.Call("+g", Glob.EditHex.Hwnd, Glob.Func.EditHex)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GenRandom(Glob) {
Local
    Hbm := Glob.Func.CreateBitmap.Call(5, 5)
    VarSetCapacity(BMBITS, 16*5, 0), pBits := &BMBITS
    DllCall("Advapi32.dll\SystemFunction036", "Ptr",&BMBITS, "Int",16*5)
    DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",16*5, "Ptr",&BMBITS)
    Color := Format("{3:02x}{2:02X}{1:02X}", *(pBits+38), *(pBits+39), *(pBits+40))

    Glob.Func.GuiControl.Call("-g", Glob.EditHex.Hwnd)
    Glob.Func.GuiControl.Call("Focus", Glob.EditHex.Hwnd)
    Glob.Func.UpdateRGBHSL.Call(Glob, Color)
    Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color)
    Glob.Func.GuiControl.Call("+Background" . Color, Glob.New.Hwnd)
    Glob.Func.SetColorName.Call(Color)
    Glob.Func.GuiControl.Call("+g", Glob.EditHex.Hwnd, Glob.Func.EditHex)
    Glob.Func.SetImageAnimate.Call(Hbm)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_Settings(Glob, Mode) {
Local
    If ( Mode="Save" )
    {
         Glob.Func.CoordMode.Call("Save")
         Glob.Func.GetImage.Call(Glob.Gradient.Hwnd, Obm)
         Glob.Func.GuiControlGet.Call("", Glob.ColorName.Hwnd, ColorName)
         Glob.Func.GetHexColor.Call(CurrentColor)
         Glob.Settings := { "Obm":Obm, "CurrentColor":CurrentColor, "ColorName":ColorName, "A_BatchLines":A_BatchLines }
         SetBatchLines -1
         Return
    }

    If ( Mode="Restore" )
    {
         Glob.Func.GuiControl.Call("-g", Glob.EditHex.Hwnd)
         Glob.Func.GuiControl.Call("Focus", Glob.EditHex.Hwnd)
         Glob.Func.UpdateRGBHSL.Call(Glob, Glob.Settings.CurrentColor)
         Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd,   Glob.Settings.CurrentColor)
         Glob.Func.GuiControl.Call("", Glob.ColorName.Hwnd, Glob.Settings.ColorName)
         Glob.Func.GuiControl.Call("+Background" . Glob.Settings.CurrentColor, Glob.New.Hwnd)
         Glob.Func.SetImageAnimate.Call(Glob.Settings.Obm)
         Glob.Settings.Obm := 0
         Glob.Func.GuiControl.Call("+g", Glob.EditHex.Hwnd, Glob.Func.EditHex)
    }

    If ( Glob.Settings.Obm )
    {
         Glob.Func.DeleteBitmap.Call(Glob.Settings.Obm)
         Glob.Func.GetHexColor.Call(Color)
         Glob.Func.GuiControl.Call("", Glob.EditHex.Hwnd, Color)
    }

    Glob.Esc := False
    Glob.Paint    := True
    Glob.Settings := {}
    Glob.Func.CoordMode.Call("Restore")
    SetBatchLines, % Glob.Settings.A_BatchLines
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_CoordMode(Glob, Mode) {
Local
    Loop, Parse, % "A_CoordModeToolTip|A_CoordModePixel|A_CoordModeMouse|A_CoordModeCaret|A_CoordModeMenu", |
          If ( Mode="Save" )
               CoordMode, % SubStr(A_LoopField,12) . SubStr(Glob.CoordMode[A_LoopField] := %A_LoopField%, 1,0), Screen
          Else CoordMode, % SubStr(A_LoopField,12), % Glob.CoordMode[A_LoopField]
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_DelColorFmQ(Glob, hCtrl:=0, Color:="" ) {
Local
    If ( hCtrl )
         Glob.Func.GetHexColor.Call(Color:="")

    If ( Color="" )
         Glob.Que := ""
    Else Glob.Que := ChooseColors_StrQ(Glob.Que, Color)
       , Glob.Que := StrSplit(Glob.Que, "|",, 2).2

 Glob.Func.HistorySetBitmap()
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_AddColorToQ(Glob, hCtrl, Color) {
Local
    If ( hCtrl )
         Glob.Func.GetHexColor.Call(Color:="")

    Glob.Que := ChooseColors_StrQ(Glob.Que, Color)
    Glob.Func.HistorySetBitmap()
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_HistorySetBitmap(Glob) {
Local
    Hbm := Glob.Func.CreateBitmap.Call(25, 1, 0, 32)
    VarSetCapacity(BMBITS, 100, 0),   n := pBits := &BMBITS+100,   i := Ok := 0

    Loop, Parse, % Glob.Que, |
        pBits := Numput("0x" . A_LoopField, pBits-4, "UInt") - 4,   i := Ok := A_Index
    Loop % ( 25-i )
        pBits := Numput(0xFFFFFF, pBits-4, "UInt") - 4

    DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "Int",100, "Ptr",&BMBITS)
    Glob.Func.SetImage.Call(Glob.History.Hwnd, Hbm, True)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_StrQ(Q, I, Max:=16, D:="|") { ;  StrQ v.0.91,  By SKAN on D09F/D46R @ tiny.cc/strq
Return ( StrLen(Q)=0 ? I : InStr(I, D) ? Q : Q=I ? Q : SubStr(Q := StrLen(I) ? (I . D
       . Trim(StrReplace((D . Q . D), (D . I . D), D), D) . D) : (Q . D), 1
       , (I := InStr(Q, D, 0, 1, Max)) ? I-1 : Max<1 ? 0 : StrLen(Q)-1) )
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_MemDC(ByRef mDC, Hbm:=0) {
Local
  If ( Hbm )
       mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
     , DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
     , DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
  Else DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
     , mDC := DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC) * 0
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_ShowMenu(Hwnd, MenuName, BottomAlign:=0) {
Local
    VarSetCapacity(RECT, 16)
    DllCall("User32.dll\GetWindowRect", "Ptr",Hwnd, "Ptr",&RECT)
    x1 := NumGet(RECT,0, "Int"),   x2 := NumGet(RECT,8, "Int"),   XCenter := X1 + ((X2-X1)//2)

    DllCall("User32.dll\GetCursorPos", "Ptr",&RECT)
    CX := NumGet(RECT, 0, "Int"),   CY := NumGet(RECT, 4, "Int")

    TPM_RIGHTALIGN := 0x08,   TPM_BOTTOMALIGN := 0x20
    Flags := ( CX>XCenter ?  TPM_RIGHTALIGN : 0 ) | (BottomAlign ? TPM_BOTTOMALIGN : 0)
    CX    := ( CX>XCenter ? x2-4 : x1+4 )

    DllCall("User32.dll\TrackPopupMenu", "Ptr",MenuGetHandle(MenuName), "Int",Flags
           ,"Int",CX, "Int",CY, "Int",0, "Ptr",Hwnd, "Ptr",0, "UInt")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_HistoryMenu(Glob) {
Local
    Glob.Func.CoordMode.Call("Save")
    MouseGetPos, X, Y
    PixelGetColor, Color, %X%, %Y%, RGB
    Color := SubStr(Color, 3)
    Glob.Func.CoordMode.Call("Restore")
    Glob.Func.GetHexColor.Call(Hex:="")

    ClearHistory  := Func("ChooseColors_DelColorFmQ").Bind(Glob, 0, "")
    DelColorFmQ   := Func("ChooseColors_DelColorFmQ").Bind(Glob, 0, Color)
    AddColorToQ   := Func("ChooseColors_AddColorToQ").Bind(Glob, 0, Color)

    Menu, ChooseColors, UseErrorLevel
    If ( InStr(Glob.Que, Color) )
    {
         Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Color), 32)
         MenuName := "Delete`tShift+Click"
         Menu, ChooseColors, Add, %MenuName%, %DelColorFmQ%
         Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm%
         If ( Color != Hex )
         {
              Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Color), 32)
              MenuName  := "Set as New`tClick"
              SetNew    := Func("ChooseColors_SetNew").Bind(Glob, Color)
              Menu, ChooseColors, Add, %MenuName%, %SetNew%
              Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm%
         }
    }

    If ( InStr(Glob.Que, Hex) = False )
    {
         Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Hex), 32)
         AddColorToQ := Func("ChooseColors_AddColorToQ").Bind(Glob, 0, Hex)
         MenuName    := "Add`tAlt+A"
         Menu, ChooseColors, Add, %MenuName%, %AddColorToQ%
         Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm%
    }

    Menu, ChooseColors, Add, Clear History, %ClearHistory%
    If ( StrLen(Glob.Que) = 0 )
         Menu, ChooseColors, Disable, Clear History

    ChooseColors_ShowMenu(Glob.Gui.Hwnd, "ChooseColors", True)
    Menu, ChooseColors, DeleteAll
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_PaletteMenu(Glob, hCtrl) {
Local
    Glob.Func.CoordMode.Call("Save")
    MouseGetPos, X, Y
    PixelGetColor, Color, %X%, %Y%, RGB
    Color := SubStr(Color, 3)
    Glob.Func.CoordMode.Call("Restore")

    CreatePalette := Func("ChooseColors_CreatePalette").Bind(Glob)
    CreateRandom  := Func("ChooseColors_GenRandom").Bind(Glob)
    AddColorToQ   := Func("ChooseColors_AddColorToQ").Bind(Glob, 0, Color)
    DelColorFmQ   := Func("ChooseColors_DelColorFmQ").Bind(Glob, 0, Color)
    Preview       := Func("ChooseColors_Preview").Bind(Glob)

    Menu, ChooseColors, UseErrorLevel
    Hbm := Glob.Func.CreateBitmap.Call(24, 24, ("0x" . Color), 32)
    MenuName := "Add #" . Color . (hCtrl = Glob.Preview.Hwnd ? "`tAlt+A" : "")
    Menu, ChooseColors, Add, %MenuName%, %AddColorToQ%
    Menu, ChooseColors, Icon, %MenuName%, HBITMAP:%Hbm%
    Menu, ChooseColors, Add, Random colors `tAlt+N, %CreateRandom%

    If ( hCtrl = Glob.Preview.Hwnd )
    {
         If InStr(Glob.Que, Color)
            Menu, ChooseColors, Insert, 2&, Delete #%Color% `tAlt+D, %DelColorFmQ%
         Menu, ChooseColors, Insert, 3&, Preview color`tClick, %Preview%
    }

    If ( hCtrl = Glob.Gradient.Hwnd )
    {
         Menu, ChooseColors, Add             ; Add separator

         N := 1, ErrorLevel := 0, I := 0
         While ( Section := ChooseColors_xStr(Glob.Menu,, "|[", "]|", N,,,, 0, 0) )
                 If ( Section := Trim(Section, "[|]") )
                 {
                      I += 1
                      Menu, ChooseColors, Add, %Section%, %CreatePalette%
                 }

       If ( I = 0 )
            Menu, ChooseColors, Delete, 3& ; Remove separator
    }

    ChooseColors_ShowMenu(Glob.Gui.Hwnd, "ChooseColors", hCtrl = Glob.Preview.Hwnd)
    Menu, ChooseColors, DeleteAll
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_CreatePalette(Glob, Section) {
Local
    Colors  := "",   Count := 0
    Section := ChooseColors_xStr(Glob.Menu,, "|[" . Section . "]|", "[")

    Loop, Parse, Section, |
        If ( StrLen(L := StrSplit(A_LoopField, "=", A_Space).1) = 6 )
             If L is xdigit
                Colors .= L . "|",  Count += 1

    If (  Count = 0  )
          Return
    Else  Colors := RTrim(Colors, "|")

    If ( Count <= 25 )
       W := ( H := 5 )
    Else W := ( H := Ceil(Sqrt(Count)) )

    VarSetCapacity(BMBITS, W*H*4),   pBits := &BMBITS
    Loop, Parse, Colors, |
          pBits := NumPut("0x" . A_LoopField, pBits+0, "Int"),   I := A_Index
    Loop % ((W*H)-I)
          pBits := NumPut(Glob.SysColor,        pBits+0, "Int")

    Hbm := Glob.Func.CreateBitmap.Call(W, H, 0, 32)
    DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",(W*4)*H, "Ptr",&BMBITS)
    Glob.Func.SetImageAnimate.Call(Hbm)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_SetColorName(Glob, Color) {
Local
    ColorName  := ChooseColors_xStr(Glob.Menu,, "|" . Color . "=", "|")
    Glob.Func.GuiControl.Call("", Glob.ColorName.Hwnd, ColorName)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_xStr(ByRef H, C:=0, B:="", E:="",ByRef BO:=1, EO:="", BI:=1, EI:=1, BT:="", ET:="") {
Local L, LB, LE, P1, P2, Q, N:="", F:=0                 ; xStr v0.97 by SKAN on D1AL/D343 @ tiny.cc/xstr
 Return SubStr(H,!(ErrorLevel:=!((P1:=(L:=StrLen(H))?(LB:=StrLen(B))?(F:=InStr(H,B,C&1,BO,BI))?F+(BT=N?LB
  :BT):0:(Q:=(BO=1&&BT>0?BT+1:BO>0?BO:L+BO))>1?Q:1:0)&&(P2:=P1?(LE:=StrLen(E))?(F:=InStr(H,E,C>>1,EO=N?(F
 ?F+LB:P1):EO,EI))?F+LE-(ET=N?LE:ET):0:EO=N?(ET>0?L-ET+1:L+1):P1+EO:0)>=P1))?P1:L+1,(BO:=Min(P2,L+1))-P1)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GoSub(Glob, HwndName, FunctionName, Bind*) {
Local
    Glob.Func.GuiControl.Call("+g", Glob[HwndName].Hwnd, Func(FunctionName).Bind(Bind*))
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_Keypress(Keyname) {
Local
   If ! GetKeyState(Keyname, "P")
        Return 0
   KeyWait, %KeyName%
Return ! Errorlevel
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_Gui(Glob, SubCommand, Value1:="", Value2:="", Value3:="") {
Local
    Subcommand := Glob.Gui.Hwnd . ":" . Subcommand

    Repl := { "SS_REALSIZECONTROL":0x40, "SS_BITMAP":0xE, "SS_ICON":0x3, "SS_NOTIFY":0x100
            , "CcStatic": "ClassCcStatic -Tabstop", "SS_CENTERIMAGE":0x200, "WS_EX_STATICEDGE":"E0x20000" }
    For K,V in Repl
        Value2 := StrReplace(Value2, K, V)

    Gui, %SubCommand%, %Value1%, % Value2 . (InStr(Value2, "Hwnd") ? " HwndHwnd" : ""), %Value3%
    If ( Var := StrSplit(StrSplit(Value2, "Hwnd").2, A_Space).1 )
    {
        Gui, % Glob.Gui.Hwnd . ":-DPIScale"
        GuiControlGet, _, % Glob.Gui.Hwnd . ":Pos", %Hwnd%
        Glob[Var] := {"Hwnd":Hwnd, "X":_X, "Y":_Y, "W":_W, "H":_H}
        Gui, % Glob.Gui.Hwnd . ":+DPIScale"
    }
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GuiControl(Glob, SubCommand:="", ControlID:="", Value:="") {
Local
    Subcommand := Glob.Gui.Hwnd . ":" . Subcommand
    GuiControl, %SubCommand%, %ControlID%, %Value%
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GuiControlGet(Glob, SubCommand:="", ControlID:=""
   , ByRef _X:="", ByRef _Y:=0, ByRef _W:=0, ByRef _H:=0, ByRef _:="") {
Local
    VarSetCapacity(_X, 3, 0)
    Subcommand := Glob.Gui.Hwnd . ":" . Subcommand
    GuiControlGet, _, %SubCommand%, %ControlID%
    _X := StrLen(_) ? _ : _X
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_AddUpDown(Glob, EditControl, Options, ByRef Hwnd:=0) {
Local
    Glob.Func.Gui.Call("Add", "UpDown", Options)
    Glob.Func.Gui.Call("-Dpiscale")
    Glob.Func.GuiControl.Call("Move", Glob.Updown.Hwnd, "w0")
    Glob.Func.GuiControl.Call("Move", Glob[EditControl].Hwnd, "w" . Glob[EditControl].W)
    Glob.Func.Gui.Call("+Dpiscale")
    Func := Func("ChooseColors_UpDown").Bind(Glob, Glob.Updown.Hwnd, Glob[EditControl].Hwnd)
    Glob.Func.GuiControl.Call("+g", Glob.Updown.Hwnd, Func)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_UpDown(Glob, hUpDown, hBuddy) {
Local
    If ( hBuddy = DllCall("User32.dll\GetFocus", "Ptr") )
        Return
    DllCall("User32.dll\SetFocus", "Ptr",hBuddy)
    Glob.Func.GuiControlGet.Call("", hUpDown, Val:=0)
    Glob.Func.GuiControl.Call("", hBuddy, Val)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_CreateBitmap(W:=0, H:=0, Color:=0, BPP:=24) {
Local
    Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",BPP, "Ptr",0, "Ptr")
    Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",1, "Int",1, "Int",0x2008, "Ptr")
    DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",4, "UIntP",Color)
Return DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",H, "Int",0x2008, "Ptr")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_DeleteBitmap(Hbm) {
Local
Return DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_SetImage(Hwnd, Hbm, Redraw:=0) { 
Local STM_SETIMAGE = 0x172, STM_GETIMAGE := 0x173, WM_SETREDRAW := 0xB, Obm := 0

    DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",WM_SETREDRAW, "Ptr",Redraw, "Ptr",0, "Ptr")
    Obm := DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",STM_SETIMAGE, "Ptr",0, "Ptr",Hbm, "Ptr")
    DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",WM_SETREDRAW, "Ptr",True, "Ptr",0, "Ptr")

    If ( Obm )
         Obm := DllCall("Gdi32.dll\DeleteObject", "Ptr",Obm) * 0

    Obm := DllCall("User32.dll\SendMessage", "Ptr",Hwnd, "Int",STM_GETIMAGE, "Ptr",0, "Ptr",0, "Ptr")

    If ( Obm != Hbm )
         Hbm := DllCall("Gdi32.dll\DeleteObject", "Ptr",Hbm) * 0
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GetImage(Hwnd, ByRef Hbm:=0, Copy:=1) { ; this function returns copy of image
Local STM_GETIMAGE := 0x173
    Hbm := DllCall("user32.dll\SendMessage", "Ptr",Hwnd, "Int",STM_GETIMAGE, "Ptr",0, "Ptr",0, "Ptr")
    If ( Copy )                                                     ; LR_CREATEDIBSECTION = 0x2000
         Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0, "Int",0, "Int",0, "Int",0x2000, "Ptr")
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_CreateGradient(W, H, V:=0, Colors*) {        ; by SKAN on D46L/D46L @ tiny.cc/creategradient
Local
    N := ( Colors := Colors.Count()>1 ? Colors : [ 0, 16777215, 0 ] ).Count()

    xOFF := (X := V ? W : 0) ? 0 : Ceil(W/(N-1))
    yOFF := (Y := V ? 0 : H) ? 0 : Ceil(H/(N-1))
    VarSetCapacity(VERT, N*16, 0)
    VarSetCapacity(MESH, N*8,  0)

    Loop % ( N,  pVert:=&VERT,  pMesh:=&MESH )
             X :=   V ? (X=0 ? W : X:=0) : X
           , Y :=  !V ? (Y=0 ? H : Y:=0) : Y
           , Color :=  Format("{:06X}", Colors[A_Index] & 0xFFFFFF)
           , Color :=  Format("0x{5:}{6:}00{3:}{4:}00{1:}{2:}00", StrSplit(Color)*)
           , pVert :=  NumPut(Color, NumPut(Y, NumPut(X, pVert+0, "Int"), "Int"), "Int64")
           , pMesh :=  NumPut(A_Index, NumPut(A_Index-1, pMesh+0, "Int"), "Int")
           , Z :=  V ? (Y += yOFF) : (X += xOFF)

    Hbm := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",32, "PtrP",0, "Ptr")
    Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",H, "Int",0x2008, "Ptr")
    mDC := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
    DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
    DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
    DllCall("Msimg32.dll\GradientFill", "Ptr",mDC, "Ptr",&VERT, "Int",N, "Ptr",&MESH, "Int",N-1, "Int",!!V)
    DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
    DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC)
Return Hbm
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_GetIcon(Filename, W:=0, H:=0) {
Local
    Switch ( FileName )
    {
       Case "caption.png" : Base64PNG := "
       ( LTrim Join
         iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAApUlEQVRIie1VAQqDMAy8yD7jK3XPlrRkWKyELFanLQO3gxAx5S5J05ZEZIQBEaUfIm
         JDLkrru0MMF/AX2MUjb5CHUuzo+vYVeKO1jt2EARFAAJKfjRcfFmOAejxxakwteTDk2UoVFKOa0Gavv08L5My91lSpQBNuifAVAS9b3R6uKdCkRVsZ
         B+VjywpijRaxIfuwRfORfXtwauLLd9HPP5k3EADwAsmVfeJ0bmDRAAAAAElFTkSuQmCC
       )"

       Case "pickscr.png" : Base64PNG := "
       ( LTrim Join
         iVBORw0KGgoAAAANSUhEUgAAABcAAAAXAgMAAACdRDwzAAAACVBMVEUAAAD///8AAABzxoNxAAAAA3RSTlMAv7/C9di0AAAAQUlEQVQI12NYtZKBcd
         UKhqmhDIyhEQwTGIBAAp3SWrVqAZBSDQ1NkGAIAFEiDAwgioF4CqoPYgrMTKz2Qd0CdRkAcTwhFlkgH1gAAAAASUVORK5CYII=
       )"

       Case "pickclr.png" : Base64PNG := "
       ( LTrim Join
         iVBORw0KGgoAAAANSUhEUgAAABcAAAAXAgMAAACdRDwzAAAACVBMVEUAAAD///8AAABzxoNxAAAAA3RSTlMAv7/C9di0AAAATUlEQVQI12NYtZKBcd
         UKhqmhDIyhEQwTGIBAAkixOoApNkwqAESJMDCAKBBgBVJAvQGioUBq1QSplVAeTA6qEqYP00y4fVDboW6BugwAhowXw6cdQ8QAAAAASUVORK5CYII=
       )"

       Default : Base64PNG := ""
  }
Return ChooseColors_PNG2HICON(Base64PNG, W, H)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_PNG2HICON(Base64PNG, W:=0, H:=0) {          ;    By SKAN on D094/D46Q @ tiny.cc/t-36636
Local
    VarSetCapacity(Bin, nBytes := Floor((B64Len := StrLen(Base64PNG := RTrim(Base64PNG,"=")))*3/4))
Return DllCall("Crypt32.dll\CryptStringToBinary", "Str",Base64PNG, "Int",B64Len, "Int",1, "Ptr",&Bin
              ,"UIntP",nBytes, "Int",0, "Int",0)
    ?  DllCall("User32.dll\CreateIconFromResourceEx", "Ptr",&Bin, "Int",nBytes, "Int",True
              ,"Int",0x30000, "Int",W, "Int",H, "Int",0, "Ptr") : 0
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_CreateBitmapText(Glob, hTxt) { ;  modified ver of TextToPic() v0.50
Local                                       ;  by SKAN on D475/D475 @ tiny.cc/t92338
    ControlGetText, Text,, ahk_id %hTxt%
    hFnt := DllCall("User32.dll\SendMessage", "Ptr",hTxt, "Int",0x31, "Ptr",0, "Ptr",0, "Ptr") ; WM_GETFONT
    VarSetCapacity(RECT, 16)
    DllCall("User32.dll\GetClientRect", "Ptr",hTxt, "Ptr",&RECT)
    x1 := NumGet(RECT,0, "Int"),   y1 := NumGet(RECT,4, "Int")
    x2 := NumGet(RECT,8, "Int"),   y2 := NumGet(RECT,12,"Int")
    W  := x2-x1,                   H  := y2-y1

    FileGetVersion, OSV, user32.dll
    LRFlag := Format("{1:}.{2:}", StrSplit(OSV,".")*) > 6.3 ? 0x8 : 0x2008

    WindowColor := Format("0x{5:}{6:}{3:}{4:}{1:}{2:}", StrSplit(Format("{:06X}"
                 , DllCall("User32.dll\GetSysColor", "Int",15)))*)

    Hbm    := DllCall("Gdi32.dll\CreateBitmap", "Int",1, "Int",1, "Int",0x1, "Int",24, "Ptr",0, "Ptr")
    Hbm    := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",1, "Int",1, "Int",0x2008, "Ptr")
              DllCall("Gdi32.dll\SetBitmapBits", "Ptr",Hbm, "UInt",4, "UIntP",WindowColor)
    Hbm    := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0x0, "Int",W, "Int",H, "Int",LRFlag, "Ptr")

    hBrush := DllCall("CreateSolidBrush", "Int",0x998877, "Ptr")
    hPen   := DllCall("CreatePen", "Int",0, "Int",1, "Int",0xFAFAFA, "Ptr" )

    mDC    := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
    DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
    DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBrush)
    DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hPen)
    DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
    DllCall("Gdi32.dll\RoundRect", "Ptr",mDC, "Int",0, "Int",0, "Int",W, "Int",H, "Int",H*.45, "Int",H*.45)
    DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
    DllCall("Gdi32.dll\DeleteObject", "Ptr",hBrush)
    DllCall("Gdi32.dll\DeleteObject", "Ptr",hPen)

    Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0, "Int",W*5, "Int",H*5, "Int",LRFlag, "Ptr")
    Hbm := DllCall("User32.dll\CopyImage", "Ptr",Hbm, "Int",0, "Int",W,   "Int",H,   "Int",0x2008, "Ptr")

    DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
    DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hFnt)
    DllCall("Gdi32.dll\SetTextColor", "Ptr",mDC, "Int",0xE3E3E3)
    DllCall("Gdi32.dll\SetBkMode", "Ptr",mDC, "Int",1) ; TRANSPARENT=1
    DllCall("User32.dll\DrawText", "Ptr",mDC, "Str",Text, "Int",StrLen(Text), "Ptr",&RECT, "Int",0x25)
    DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
    DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC)

Return Hbm
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_SetImageAnimate(Glob, Hbm) {
Local
    VarSetCapacity(BITMAP, Sz := A_PtrSize=8 ? 32 : 24 )
    DllCall("Gdi32.dll\GetObject", "Ptr",Hbm, "Int",Sz, "Ptr",&BITMAP)
    SW := Numget(BITMAP, 4, "UInt")
    SH := Numget(BITMAP, 8, "UInt")
    TH := TW := Glob.Gradient.W

    tDC  := DllCall("User32.dll\GetWindowDC", "Ptr",Glob.Gradient.Hwnd, "Ptr")
    mDC    := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
    DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)
    DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",Hbm)
    Loop , Parse, % "2,4,8,12,16,20,24,28,32,36,40,48,96,128,192,255", `,
    {
           DllCall("Gdi32.dll\GdiAlphaBlend"
                 , "Ptr",tDC, "Int",0, "Int",0, "Int",TW, "Int",TH
                 , "Ptr",mDC, "Int",0, "Int",0, "Int",SW, "Int",SH, "Int",A_LoopField<<16)
           Sleep 1
    }
    DllCall("User32.dll\ReleaseDC", "Ptr",Glob.Gradient.Hwnd, "Ptr",tDC)
    DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
    DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC)
    Glob.Func.SetImage.Call(Glob.Gradient.Hwnd, Hbm, False)
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ChooseColors_BoxCur(P*) {  ; v0.3 by SKAN on D47J/D47K @ tiny.cc/boxcur
Local                      
    If ! ( P.Count() )
           Return DllCall("User32.dll\SystemParametersInfo", "Int",SPI_SETCURSORS := 0x57, "Int",0, "Int",0, "Int",0)

    CW := Max( 32, Format("{:d}", P[1]) )
    CH := Max( 32, Format("{:d}", P[2]) )
    RegRead, m, HKEY_CURRENT_USER\Control Panel\Cursors, CursorBaseSize
    m  := ( (m := Format("{:d}", m)) > 32 ? m/32 : 1 )
    CW := Round(CW/m)
    CH := Round(CH/m)

    VarSetCapacity(BITMAPINFO, 40, 0)
    pBMI := &BITMAPINFO,  pBits := 0
    NumPut(1, NumPut(1,NumPut(CH,NumPut(CW,NumPut(40,pBMI+0,"Int"),"Int"),"Int"),"Short"),"Short")

    hBM   := DllCall("gdi32.dll\CreateDIBSection", "Ptr",0, "Ptr",pBMI, "Int",0, "PtrP",pBits, "Ptr",0, "Int", 0, "Ptr")
    hPen  := DllCall("Gdi32.dll\CreatePen", "Int",0, "Int",1, "Int",0xFFFFFF, "Ptr")
    hBrush  := DllCall("Gdi32.dll\CreateSolidBrush", "Int",m!=1 || P[3]!="" ? 0xFFFFFF : 0x000000, "Ptr")
    mDC     := DllCall("Gdi32.dll\CreateCompatibleDC", "Ptr",0, "Ptr")
    DllCall("Gdi32.dll\SaveDC", "Ptr",mDC)

    DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBrush)
    DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hPen)
    DllCall("Gdi32.dll\SelectObject", "Ptr",mDC, "Ptr",hBM)
    DllCall("Gdi32.dll\RoundRect", "Ptr",mDC, "Int",0, "Int",0, "Int",CW, "Int",CH, "Int",0, "Int",0)

    DllCall("Gdi32.dll\RestoreDC", "Ptr",mDC, "Int",-1)
    DllCall("Gdi32.dll\DeleteDC", "Ptr",mDC)
    DllCall("Gdi32.dll\DeleteObject", "Ptr",hBrush)
    DllCall("Gdi32.dll\DeleteObject", "Ptr",hPen)

    VarSetCapacity( BITMAP, SzBITMAP := ( A_PtrSize = 8 ? 32 : 24 ) )
    DllCall("Gdi32.dll\GetObject", "Ptr",hBM, "Int",SzBITMAP, "Ptr",&BITMAP)
    WB      := Numget(BITMAP, 12, "Int")
    biSize  := (WB*CH) * 2
    ttlSize :=  22 + 40 + 8 + biSize

    pCURSOR := DllCall("Kernel32.dll\GlobalAlloc", "Int",0x40, "Ptr",ttlSize, "Ptr")

    NumPut(0x0100020000,    pCURSOR +  0, "Int64")
    NumPut(CW,              pCURSOR +  6, "UChar")
    NumPut(CH,              pCURSOR +  7, "UChar")
    NumPut(40 + 8 + biSize, pCURSOR + 14, "UInt")
    NumPut(22,              pCURSOR + 18, "UInt")
    NumPut(0xFFFFFF,        pCURSOR + 66, "UInt")
    NumPut(CW,     pBMI +  4, "UInt")
    NumPut(CH*2,   pBMI +  8, "UInt")
    NumPut(bisize, pBMI + 20, "UInt")
    NumPut(2,      pBMI + 32, "UInt")
    NumPut(2,      pBMI + 36, "UInt")

    DllCall("Kernel32.dll\RtlMoveMemory", "Ptr",pCURSOR + 22,         "Ptr",pBMI,    "Ptr",40)
    DllCall("Kernel32.dll\RtlMoveMemory", "Ptr",pCURSOR + 70,         "Ptr",pBits,   "Ptr",WB*CH)
    DllCall("Kernel32.dll\RtlFillMemory", "Ptr",pCURSOR + 70+(WB*CH), "Ptr",(WB*CH), "Int",255)
    DllCall("Gdi32.dll\DeleteObject", "Ptr",hBM)

    Loop, Parse, % "32512,32513,32514,32515,32516,32640,32641,32642,32643,32644,32645,32646,32648,32649,32650,32651", `,
          DllCall("User32.dll\SetSystemCursor", "Ptr",DllCall("User32.dll\CreateIconFromResourceEx", "Ptr",pCURSOR+22
                , "UInt",ttlSize-22, "Int",True, "Int",0x30000, "Int",CW, "Int",CH, "Int",0, "Ptr"), "Int",A_Loopfield)

    DllCall("Kernel32.dll\GlobalFree", "Ptr",pCURSOR)
Return ttlSize
}
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。