该代码实现了一个自定义颜色选择对话框,允许用户选择颜色并进行各种颜色的调整和操作,颜色值最终会被保存到 colors.ini
文件中。
versioninfo =
(
========================================================================
Description ...: A Custom ColorDialog
Usage..........: Run from your script and selected color is saved to colors.ini as RGB
.................: runwait, colordialog.ahk ; run script, return when exited
..................: IniRead, color, colors.ini, Color, color_selected,0x00000 ; load color from dialog into %color%
Version .......: 1.0
Modified ......: 2017.07.06
Author ........: Peared
AHK-Version....: 1.1.26.00 U32
OS-Versions....: Win 10 64
========================================================================
Copyright (C) 2014-2016
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
It would never been anything other than an idea without all help ihave 4
found in Autohotkey.com forum, so thank you all for sharing.
)
; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=34092
#NoEnv
color_dialog_tool()
color_dialog_tool(){
global
colorlist2:=[0xffff0000,0xffff6600,0xffffcc00,0xffccff00,0xff66ff00,0xff00ff00,0xff00ff66,0xff00ffcc,0xff00ccff,0xff0066ff,0xff0000ff,0xff6600ff,0xffcc00ff,0xffff00cc,0xffff0066,0xffff0004]
colorlist1:=[0xff000000,0xffff0000,0xffffffff]
colorlist1pos := [0.0,0.3,1.0]
c1:=0
gui colordial:+alwaysontop +lastfound
Gui, colordial:Margin, 5, 5
Gui, colordial:color, white
Gui, colordial:FONT, BLACK
loop 8
{
IniRead, v%c1%, colors.ini, Color, v%c1%,0x000000
tmpcol := v%c1%
Gui, colordial:Add, text,+E0x20 0x200 w20 h20 BackgroundTrans v1%c1% gcolor_preset,
Gui, colordial:Add, Progress, x+-20 y+-20 w20 h20 Background%tmpcol% vv%c1%
c1++
GuiControl,+Background%tmpcol%,v%c1%
}
loop 4
{
IniRead, v%c1%, colors.ini, Color, v%c1%,0x000000
tmpcol := v%c1%
Gui, colordial:Add, text,+E0x20 0x200 x+5 y5 w20 h20 BackgroundTrans v1%c1% gcolor_preset,
Gui, colordial:Add, Progress, x+-20 y+-20 w20 h20 Background%tmpcol% vv%c1%
c1++
GuiControl,+Background%tmpcol%,v%c1%
loop 7
{
IniRead, v%c1%, colors.ini, Color, v%c1%,0x000000
tmpcol := v%c1%
Gui, colordial:Add, text,y+5 +E0x20 0x200 w20 h20 BackgroundTrans v2%c1% gcolor_preset,
Gui, colordial:Add, progress, x+-20 y+-20 w20 h20 Background%tmpcol% vv%c1%
GuiControl,+Background%tmpcol%,v%c1%
c1++
}
}
gui, colordial:font, s10 w700,
Gui, colordial:Add, Pic, x+5 y5 w200 h200 gcolorpal hwndHPI1C
Gui, colordial:Add, Pic, x+5 w15 h200 gcolorver hwndHPIC
Gui, colordial:Add, text, x+5 y5 +E0x20 0x200 w60 h30 section BackgroundTrans gcolor_preset_set,
Gui, colordial:Add, Progress, x+-60 y+-30 w60 h30 Background%RGB_v% vpC
Gui, colordial:Add, text, x+5 +E0x20 0x200 w70 h30 BackgroundTrans vrgbval, # %color_main%
gui, colordial:add, button, x+5 w50 h30 gcopy, Copy
Gui, colordial:Add, text,xs y+0 +E0x20 0x200 w60 h30 BackgroundTrans gcolor_preset_set,
Gui, colordial:Add, Progress, x+-60 y+-30 w60 h30 Background%RGB_v2% vpC2
Gui, colordial:Add, text, x+5 +E0x20 0x200 w70 h30 BackgroundTrans vrgbvalold, # %color_old%
gui, colordial:add, button, x+5 w50 h30 gcopyold, Copy
Gui, colordial:Add, Slider,xs y+10 w120 h20 AltSubmit +NoTicks +Range0-255 vsR gSlidermove line1, %R_v%
Gui, colordial:Add, Text, x+5 w28 h28 +Border vtr cBLACK +BackgroundTrans, R:
gui, colordial:font
Gui, colordial:Add, Edit, X+-10 W50 r1 LIMIT3 number vS_Red hwndRED gedit_set,%R_v%
Gui, colordial:Add, UpDown, vU_redDown Range0-255 gupdown_set, %R_v%
Gui, colordial:Add, Slider, xs y+7 w120 h20 AltSubmit +NoTicks +Range0-255 vsG gSlidermove line1, %G_v%
gui, colordial:font, s10 w700,
Gui, colordial:Add, Text,x+5 w28 h28 +Border vtg cBLACK +BackgroundTrans, G:
gui, colordial:font
Gui, colordial:Add, Edit, X+-10 W50 r1 LIMIT3 number r1 vS_GREEN hwndGREEN gedit_set,%G_v%
Gui, colordial:Add, UpDown, vU_greenDown Range0-255 gupdown_set, %G_v%
Gui, colordial:Add, Slider, xs y+8 w120 h20 AltSubmit +NoTicks +Range0-255 vsB gSlidermove line1, %B_v%
gui, colordial:font, s10 w700,
Gui, colordial:Add, Text, x+5 w28 h28 +Border vtb cBLACK +BackgroundTrans, B:
gui, colordial:font
Gui, colordial:Add, Edit, X+-10 W50 r1 LIMIT3 number r1 vS_BLUE hwndBLUE gedit_set,%B_v%
Gui, colordial:Add, UpDown, vU_blueDown Range0-255 gupdown_set, %B_v%
IC := Colors.MaxIndex()
Ip := pos.MaxIndex()
gui, colordial:add, button, xs+11 y+18 w80 h30 gcolor_ok_button, OK
gui, colordial:add, button, x+12 w80 h30 gcolor_cancel_button, Cancel
LinearGradient(HPI1C, Colorlist1, colorlist1pos, 2,1,200, 200)
LinearGradient(HPIC, Colorlist2, , 1,1)
Gui, colordial:Font, s14, Tahoma
Gui, colordial:Show, , AHK ColorPick
return
; -------------------------------------------------------------------------------------------------------
color_cancel_button:
gui, colordial:destroy
exitapp
return
; -------------------------------------------------------------------------------------------------------
color_ok_button:
gui, colordial:destroy
IniWrite, %color%, colors.ini, Color,color_selected
exitapp
return
; ------------------------------------------------------------------------------------------------------
copy:
clipboard = %color%
return
; ---------------------------------------------------------------------------------------------------------
copyold:
clipboard = %color_old%
return
; ------------------------------------------------------------------------------------------------------
colorver:
color_old := color
loop
{
MouseGetPos, ,,, OutputVarControl,3
if (OutputVarControl = HPIC)
{
MouseGetPos, MouseX, MouseY
PixelGetColor, color, %MouseX%, %MouseY%, RGB
set_color_sel(color)
c := Hex2RGB(color)
r_v := rgb("1" ,color), g_v:=rgb("2",color) ,B_v:=rgb("3" ,color)
set_control_val(r_v, g_v, b_v)
GuiControl,+Background%color%,pC
GuiControl,+Background%color_old%,pC2
stringtrimleft,color, color, 2
color_main := color
color_view(color_main)
}
GetKeyState, OutputVar, lbutton
if outputvar = U
break
}
return
; ------------------------------------------------------------------------------------------------------
color_preset_set:
set_col := 1
return
; --------------------------------------------------------
color_preset:
if set_col = 1
{
var := A_GuiControl
stringtrimleft,var, var, 1
GuiControl,+Background%color%,v%var%
v%var% = %color%
set_col = 0
IniWrite, %color%, colors.ini, Color,v%var%
} else {
var := A_GuiControl
stringtrimleft,var, var, 1
color := v%var%
GuiControl,+Background%color%,pC
color_main := Hex2RGB(color)
r_v := rgb("1" ,color), g_v:=rgb("2",color) ,B_v:=rgb("3" ,color)
set_control_val(r_v, g_v, b_v)
color_view(color)
set_color_sel(color)
}
return
;-------------------------------------------------------------
colorpal:
color_old := color
loop
{
MouseGetPos, ,,, OutputVarControl,3
if (OutputVarControl = HPI1C)
{
MouseGetPos, MouseX, MouseY
PixelGetColor, color, %MouseX%, %MouseY%, RGB
set_color_sel(color)
c := Hex2RGB(color)
r_v := rgb("1" ,color), g_v:=rgb("2",color) ,B_v:=rgb("3" ,color)
set_control_val(r_v, g_v, b_v)
stringtrimleft,color, color, 2
}
GetKeyState, OutputVar, lbutton
if outputvar = U
break
}
return
; ------------------------------------------------------------------------------------------------------
edit_set:
GuiControlGet,R_v,,s_red
GuiControlGet,G_v,,s_green
GuiControlGet,B_v,,s_blue
set_control_val(r_v, g_v, b_v)
rgb_c = %R_v%,%G_v%,%B_v%
hex_c := RGB2Hex(rgb_c)
set_color_sel("0x" hex_c)
return
updown_set:
GuiControlGet,R_v,,U_redDown
GuiControlGet,G_v,,U_greenDown
GuiControlGet,B_v,,U_blueDown
set_control_val(r_v, g_v, b_v)
rgb_c = %R_v%,%G_v%,%B_v%
hex_c := RGB2Hex(rgb_c)
color_view(hex_c)
set_color_sel("0x" hex_c)
return
}
set_color_sel(color){
global
IfInString, color, 0x
stringtrimleft,color, color, 2
GuiControl,+Background%color%,pC
GuiControl,+Background%color_old%,pC2
GuiControl,,rgbval,# %color%
GuiControl,,rgbvalold,# %color_old%
}
set_control_val(r_v, g_v, b_v){
GuiControl,,sr,%R_v%
GuiControl,,sg,%G_v%
GuiControl,,sb,%B_v%
GuiControl,,s_red,%R_v%
GuiControl,,s_green,%G_v%
GuiControl,,s_blue,%B_v%
GuiControl,,U_redDown,%R_v%
GuiControl,,U_greenDown,%G_v%
GuiControl,,U_blueDown,%B_v%
return
}
slidermove:
GuiControlGet,R_v,,sR
GuiControlGet,G_v,,sG
GuiControlGet,B_v,,sB
set_control_val(r_v, g_v, b_v)
rgb_c = %R_v%,%G_v%,%B_v%
hex_c := RGB2Hex(rgb_c)
color_main := hex_c
color_view(color_main)
GuiControl,+Background%hex_c%,pC
GuiControl,,s_red,%R_v%
GuiControl,,s_green,%G_v%
GuiControl,,s_blue,%B_v%
GuiControl,,U_redDown,%R_v%
GuiControl,,U_greenDown,%G_v%
GuiControl,,U_blueDown,%B_v%
return
color_view(color_main){
global
colorlist1.RemoveAt(2 , 2)
colorlist1.InsertAt(2 , "0xff" color_main, "0x00" color_main)
LinearGradient(HPI1C, Colorlist1, colorlist1pos, 2,1,200, 200)
return
}
Hex2RGB(CR) {
NumPut( "0x" SubStr(CR,-5), (V:="000000") )
return NumGet(V,2,"UChar") "," NumGet(V,1,"UChar") "," NumGet(V,0,"UChar")
}
RGB(vNum, sColor) {
vRGB := Hex2RGB(sColor)
StringSplit, aRGB, vRGB, `,
if (vNum = 1)
return aRGB1
else if (vNum = 2)
return aRGB2
else if (vNum = 3)
return aRGB3
}
RGB2Hex(s, d="") {
StringSplit, s, s, % d = "" ? "," : d
SetFormat, Integer, % (f := A_FormatInteger) = "D" ? "H" : f
h := s1 + 0 . s2 + 0 . s3 + 0
SetFormat, Integer, %f%
Return, RegExReplace(RegExReplace(h, "0x(.)(?=$|0x)", "0$1"), "0x")
}
;-------------- Code by JustMe
LinearGradient(HWND, oColors, oPositions = "", D = 0, GC = 0, BW = 0, BH = 0) {
Static SS_BITMAP := 0xE
Static SS_ICON := 0x3
Static STM_SETIMAGE := 0x172
Static IMAGE_BITMAP := 0x0
If !IsObject(oColors) || (oColors.MaxIndex() < 2) {
ErrorLevel := "Invalid parameter oColors!"
Return False
}
IC := oColors.MaxIndex()
If IsObject(oPositions) {
If (oPositions.MaxIndex() <> IC) {
ErrorLevel := "Invalid parameter oPositions!"
Return False
}
} Else {
oPositions := [0.0]
P := 1.0 / (IC - 1)
Loop, % (IC - 2)
oPositions.Insert(P * A_Index)
oPositions.Insert(1.0)
}
; -------------------------------------------------------------------------------------------------------------------
; Check HWND
WinGetClass, Class, ahk_id %HWND%
If (Class != "Static") {
ErrorLevel := "Class " . Class . " is not supported!"
Return False
}
If !DllCall("GetModuleHandle", "Str", "Gdiplus")
hGDIP := DllCall("LoadLibrary", "Str", "Gdiplus")
VarSetCapacity(SI, 16, 0)
Numput(1, SI, "UInt")
DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", pToken, "Ptr", &SI, "Ptr", 0)
If (!pToken) {
ErrorLevel := "GDIPlus could not be started!`nCheck the availability of GDIPlus on your system, please!"
Return False
}
VarSetCapacity(RECT, 16, 0)
DllCall("User32.dll\GetClientRect", "Ptr", HWND, "Ptr", &RECT)
W := NumGet(RECT, 8, "Int")
H := NumGet(RECT, 12, "Int")
If D Not In 0,1,2,3
D := 0
If GC Not In 0,1
GC := 0
If BW Not Between 1 And W
BW := W
If BH Not Between 1 And H
BH := H
DllCall("Gdiplus.dll\GdipCreateBitmapFromScan0", "Int", W, "Int", H, "Int", 0
, "Int", 0x26200A, "Ptr", 0, "PtrP", pBitmap)
DllCall("Gdiplus.dll\GdipGetImageGraphicsContext", "Ptr", pBitmap, "PtrP", pGraphics)
VarSetCapacity(RECTF, 16, 0)
NumPut(BW, RECTF, 8, "Float")
NumPut(BH, RECTF, 12, "Float")
DllCall("Gdiplus.dll\GdipCreateLineBrushFromRect", "Ptr", &RECTF
, "Int", 0, "Int", 0, "Int", D, "Int", 0, "PtrP", pBrush)
DllCall("Gdiplus.dll\GdipSetLineGammaCorrection", "Ptr", pBrush, "Int", GC)
VarSetCapacity(COLORS, IC * 4, 0)
O := -4
For I, V In oColors
NumPut(V | 0x00000000, COLORS, O += 4, "UInt")
VarSetCapacity(POSITIONS, IC * 4, 0)
O := -4
For I, V In oPositions
NumPut(V, POSITIONS, O += 4, "Float")
DllCall("Gdiplus.dll\GdipSetLinePresetBlend", "Ptr", pBrush, "Ptr", &COLORS, "Ptr", &POSITIONS, "Int", IC)
VarSetCapacity(ColourMatrix, 100, 0)
Matrix := 1.5|0|0|0|0|0|1.5|0|0|0|0|0|1.5|0|0|0|0|0|1|0|0.05|0.05|0.05|0|1
StringSplit, Matrix, Matrix, |
Loop, 25
{
Matrix := (Matrix%A_Index% != "") ? Matrix%A_Index% : Mod(A_Index-1, 6) ? 0 : 1
NumPut(Matrix, ColourMatrix, (A_Index-1)*4, "float")
}
DllCall("gdiplus\GdipCreateImageAttributes", "ptr*", ImageAttr)
DllCall("gdiplus\GdipSetImageAttributesColorMatrix", "ptr", ImageAttr, "int", 1, "int", 1, "ptr", &ColourMatrix, "ptr", 0, "int", 0)
DllCall("Gdiplus.dll\GdipFillRectangle", "Ptr", pGraphics, "Ptr", pBrush
, "Float", 0, "Float", 0, "Float", W, "Float", H)
; -------------------------------------------------------------------------------------------------------------------
; Create HBITMAP from bitmap
DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", pBitmap, "PtrP", hBitmap, "Int", 0X00FFFFFF)
; -------------------------------------------------------------------------------------------------------------------
; Free resources
DllCall("gdiplus\GdipSetSmoothingMode", "uint", pGraphics, "int", 4)
DllCall("gdiplus\GdipCreatePen1", "int", 0xffff0000, "float", 3, "int", 2, "uint*", pPen)
; Create HBITMAP from bitmap
DllCall("gdiplus\GdipDrawEllipse", "uint", pGraphics, "uint", pPen, "float", 0, "float", 80, "float", 80, "float", 60)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pBitmap)
DllCall("Gdiplus.dll\GdipDeleteBrush", "Ptr", pBrush)
DllCall("Gdiplus.dll\GdipDeleteGraphics", "Ptr", pGraphics)
; Shutdown GDI+
DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", pToken)
If (hGDIP)
DllCall("FreeLibrary", "Ptr", hGDIP)
; -------------------------------------------------------------------------------------------------------------------
; Set control styles
Control, Style, -%SS_ICON%, , ahk_id %HWND%
Control, Style, +%SS_BITMAP%, , ahk_id %HWND%
; Assign the bitmap
SendMessage, STM_SETIMAGE, IMAGE_BITMAP, hBitmap, , ahk_id %HWND%
; Done!
DllCall("Gdi32.dll\DeleteObject", "Ptr", hBitmap)
Return True
}
versioninfo =
(
========================================================================
Description ...: A Custom ColorDialog
Usage..........: Run from your script and selected color is saved to colors.ini as RGB
.................: runwait, colordialog.ahk ; run script, return when exited
..................: IniRead, color, colors.ini, Color, color_selected,0x00000 ; load color from dialog into %color%
Version .......: 1.0
Modified ......: 2017.07.06
Author ........: Peared
AHK-Version....: 1.1.26.00 U32
OS-Versions....: Win 10 64
========================================================================
Copyright (C) 2014-2016
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
It would never been anything other than an idea without all help ihave 4
found in Autohotkey.com forum, so thank you all for sharing.
)
; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=34092
#NoEnv
color_dialog_tool()
color_dialog_tool(){
global
colorlist2:=[0xffff0000,0xffff6600,0xffffcc00,0xffccff00,0xff66ff00,0xff00ff00,0xff00ff66,0xff00ffcc,0xff00ccff,0xff0066ff,0xff0000ff,0xff6600ff,0xffcc00ff,0xffff00cc,0xffff0066,0xffff0004]
colorlist1:=[0xff000000,0xffff0000,0xffffffff]
colorlist1pos := [0.0,0.3,1.0]
c1:=0
gui colordial:+alwaysontop +lastfound
Gui, colordial:Margin, 5, 5
Gui, colordial:color, white
Gui, colordial:FONT, BLACK
loop 8
{
IniRead, v%c1%, colors.ini, Color, v%c1%,0x000000
tmpcol := v%c1%
Gui, colordial:Add, text,+E0x20 0x200 w20 h20 BackgroundTrans v1%c1% gcolor_preset,
Gui, colordial:Add, Progress, x+-20 y+-20 w20 h20 Background%tmpcol% vv%c1%
c1++
GuiControl,+Background%tmpcol%,v%c1%
}
loop 4
{
IniRead, v%c1%, colors.ini, Color, v%c1%,0x000000
tmpcol := v%c1%
Gui, colordial:Add, text,+E0x20 0x200 x+5 y5 w20 h20 BackgroundTrans v1%c1% gcolor_preset,
Gui, colordial:Add, Progress, x+-20 y+-20 w20 h20 Background%tmpcol% vv%c1%
c1++
GuiControl,+Background%tmpcol%,v%c1%
loop 7
{
IniRead, v%c1%, colors.ini, Color, v%c1%,0x000000
tmpcol := v%c1%
Gui, colordial:Add, text,y+5 +E0x20 0x200 w20 h20 BackgroundTrans v2%c1% gcolor_preset,
Gui, colordial:Add, progress, x+-20 y+-20 w20 h20 Background%tmpcol% vv%c1%
GuiControl,+Background%tmpcol%,v%c1%
c1++
}
}
gui, colordial:font, s10 w700,
Gui, colordial:Add, Pic, x+5 y5 w200 h200 gcolorpal hwndHPI1C
Gui, colordial:Add, Pic, x+5 w15 h200 gcolorver hwndHPIC
Gui, colordial:Add, text, x+5 y5 +E0x20 0x200 w60 h30 section BackgroundTrans gcolor_preset_set,
Gui, colordial:Add, Progress, x+-60 y+-30 w60 h30 Background%RGB_v% vpC
Gui, colordial:Add, text, x+5 +E0x20 0x200 w70 h30 BackgroundTrans vrgbval, # %color_main%
gui, colordial:add, button, x+5 w50 h30 gcopy, Copy
Gui, colordial:Add, text,xs y+0 +E0x20 0x200 w60 h30 BackgroundTrans gcolor_preset_set,
Gui, colordial:Add, Progress, x+-60 y+-30 w60 h30 Background%RGB_v2% vpC2
Gui, colordial:Add, text, x+5 +E0x20 0x200 w70 h30 BackgroundTrans vrgbvalold, # %color_old%
gui, colordial:add, button, x+5 w50 h30 gcopyold, Copy
Gui, colordial:Add, Slider,xs y+10 w120 h20 AltSubmit +NoTicks +Range0-255 vsR gSlidermove line1, %R_v%
Gui, colordial:Add, Text, x+5 w28 h28 +Border vtr cBLACK +BackgroundTrans, R:
gui, colordial:font
Gui, colordial:Add, Edit, X+-10 W50 r1 LIMIT3 number vS_Red hwndRED gedit_set,%R_v%
Gui, colordial:Add, UpDown, vU_redDown Range0-255 gupdown_set, %R_v%
Gui, colordial:Add, Slider, xs y+7 w120 h20 AltSubmit +NoTicks +Range0-255 vsG gSlidermove line1, %G_v%
gui, colordial:font, s10 w700,
Gui, colordial:Add, Text,x+5 w28 h28 +Border vtg cBLACK +BackgroundTrans, G:
gui, colordial:font
Gui, colordial:Add, Edit, X+-10 W50 r1 LIMIT3 number r1 vS_GREEN hwndGREEN gedit_set,%G_v%
Gui, colordial:Add, UpDown, vU_greenDown Range0-255 gupdown_set, %G_v%
Gui, colordial:Add, Slider, xs y+8 w120 h20 AltSubmit +NoTicks +Range0-255 vsB gSlidermove line1, %B_v%
gui, colordial:font, s10 w700,
Gui, colordial:Add, Text, x+5 w28 h28 +Border vtb cBLACK +BackgroundTrans, B:
gui, colordial:font
Gui, colordial:Add, Edit, X+-10 W50 r1 LIMIT3 number r1 vS_BLUE hwndBLUE gedit_set,%B_v%
Gui, colordial:Add, UpDown, vU_blueDown Range0-255 gupdown_set, %B_v%
IC := Colors.MaxIndex()
Ip := pos.MaxIndex()
gui, colordial:add, button, xs+11 y+18 w80 h30 gcolor_ok_button, OK
gui, colordial:add, button, x+12 w80 h30 gcolor_cancel_button, Cancel
LinearGradient(HPI1C, Colorlist1, colorlist1pos, 2,1,200, 200)
LinearGradient(HPIC, Colorlist2, , 1,1)
Gui, colordial:Font, s14, Tahoma
Gui, colordial:Show, , AHK ColorPick
return
; -------------------------------------------------------------------------------------------------------
color_cancel_button:
gui, colordial:destroy
exitapp
return
; -------------------------------------------------------------------------------------------------------
color_ok_button:
gui, colordial:destroy
IniWrite, %color%, colors.ini, Color,color_selected
exitapp
return
; ------------------------------------------------------------------------------------------------------
copy:
clipboard = %color%
return
; ---------------------------------------------------------------------------------------------------------
copyold:
clipboard = %color_old%
return
; ------------------------------------------------------------------------------------------------------
colorver:
color_old := color
loop
{
MouseGetPos, ,,, OutputVarControl,3
if (OutputVarControl = HPIC)
{
MouseGetPos, MouseX, MouseY
PixelGetColor, color, %MouseX%, %MouseY%, RGB
set_color_sel(color)
c := Hex2RGB(color)
r_v := rgb("1" ,color), g_v:=rgb("2",color) ,B_v:=rgb("3" ,color)
set_control_val(r_v, g_v, b_v)
GuiControl,+Background%color%,pC
GuiControl,+Background%color_old%,pC2
stringtrimleft,color, color, 2
color_main := color
color_view(color_main)
}
GetKeyState, OutputVar, lbutton
if outputvar = U
break
}
return
; ------------------------------------------------------------------------------------------------------
color_preset_set:
set_col := 1
return
; --------------------------------------------------------
color_preset:
if set_col = 1
{
var := A_GuiControl
stringtrimleft,var, var, 1
GuiControl,+Background%color%,v%var%
v%var% = %color%
set_col = 0
IniWrite, %color%, colors.ini, Color,v%var%
} else {
var := A_GuiControl
stringtrimleft,var, var, 1
color := v%var%
GuiControl,+Background%color%,pC
color_main := Hex2RGB(color)
r_v := rgb("1" ,color), g_v:=rgb("2",color) ,B_v:=rgb("3" ,color)
set_control_val(r_v, g_v, b_v)
color_view(color)
set_color_sel(color)
}
return
;-------------------------------------------------------------
colorpal:
color_old := color
loop
{
MouseGetPos, ,,, OutputVarControl,3
if (OutputVarControl = HPI1C)
{
MouseGetPos, MouseX, MouseY
PixelGetColor, color, %MouseX%, %MouseY%, RGB
set_color_sel(color)
c := Hex2RGB(color)
r_v := rgb("1" ,color), g_v:=rgb("2",color) ,B_v:=rgb("3" ,color)
set_control_val(r_v, g_v, b_v)
stringtrimleft,color, color, 2
}
GetKeyState, OutputVar, lbutton
if outputvar = U
break
}
return
; ------------------------------------------------------------------------------------------------------
edit_set:
GuiControlGet,R_v,,s_red
GuiControlGet,G_v,,s_green
GuiControlGet,B_v,,s_blue
set_control_val(r_v, g_v, b_v)
rgb_c = %R_v%,%G_v%,%B_v%
hex_c := RGB2Hex(rgb_c)
set_color_sel("0x" hex_c)
return
updown_set:
GuiControlGet,R_v,,U_redDown
GuiControlGet,G_v,,U_greenDown
GuiControlGet,B_v,,U_blueDown
set_control_val(r_v, g_v, b_v)
rgb_c = %R_v%,%G_v%,%B_v%
hex_c := RGB2Hex(rgb_c)
color_view(hex_c)
set_color_sel("0x" hex_c)
return
}
set_color_sel(color){
global
IfInString, color, 0x
stringtrimleft,color, color, 2
GuiControl,+Background%color%,pC
GuiControl,+Background%color_old%,pC2
GuiControl,,rgbval,# %color%
GuiControl,,rgbvalold,# %color_old%
}
set_control_val(r_v, g_v, b_v){
GuiControl,,sr,%R_v%
GuiControl,,sg,%G_v%
GuiControl,,sb,%B_v%
GuiControl,,s_red,%R_v%
GuiControl,,s_green,%G_v%
GuiControl,,s_blue,%B_v%
GuiControl,,U_redDown,%R_v%
GuiControl,,U_greenDown,%G_v%
GuiControl,,U_blueDown,%B_v%
return
}
slidermove:
GuiControlGet,R_v,,sR
GuiControlGet,G_v,,sG
GuiControlGet,B_v,,sB
set_control_val(r_v, g_v, b_v)
rgb_c = %R_v%,%G_v%,%B_v%
hex_c := RGB2Hex(rgb_c)
color_main := hex_c
color_view(color_main)
GuiControl,+Background%hex_c%,pC
GuiControl,,s_red,%R_v%
GuiControl,,s_green,%G_v%
GuiControl,,s_blue,%B_v%
GuiControl,,U_redDown,%R_v%
GuiControl,,U_greenDown,%G_v%
GuiControl,,U_blueDown,%B_v%
return
color_view(color_main){
global
colorlist1.RemoveAt(2 , 2)
colorlist1.InsertAt(2 , "0xff" color_main, "0x00" color_main)
LinearGradient(HPI1C, Colorlist1, colorlist1pos, 2,1,200, 200)
return
}
Hex2RGB(CR) {
NumPut( "0x" SubStr(CR,-5), (V:="000000") )
return NumGet(V,2,"UChar") "," NumGet(V,1,"UChar") "," NumGet(V,0,"UChar")
}
RGB(vNum, sColor) {
vRGB := Hex2RGB(sColor)
StringSplit, aRGB, vRGB, `,
if (vNum = 1)
return aRGB1
else if (vNum = 2)
return aRGB2
else if (vNum = 3)
return aRGB3
}
RGB2Hex(s, d="") {
StringSplit, s, s, % d = "" ? "," : d
SetFormat, Integer, % (f := A_FormatInteger) = "D" ? "H" : f
h := s1 + 0 . s2 + 0 . s3 + 0
SetFormat, Integer, %f%
Return, RegExReplace(RegExReplace(h, "0x(.)(?=$|0x)", "0$1"), "0x")
}
;-------------- Code by JustMe
LinearGradient(HWND, oColors, oPositions = "", D = 0, GC = 0, BW = 0, BH = 0) {
Static SS_BITMAP := 0xE
Static SS_ICON := 0x3
Static STM_SETIMAGE := 0x172
Static IMAGE_BITMAP := 0x0
If !IsObject(oColors) || (oColors.MaxIndex() < 2) {
ErrorLevel := "Invalid parameter oColors!"
Return False
}
IC := oColors.MaxIndex()
If IsObject(oPositions) {
If (oPositions.MaxIndex() <> IC) {
ErrorLevel := "Invalid parameter oPositions!"
Return False
}
} Else {
oPositions := [0.0]
P := 1.0 / (IC - 1)
Loop, % (IC - 2)
oPositions.Insert(P * A_Index)
oPositions.Insert(1.0)
}
; -------------------------------------------------------------------------------------------------------------------
; Check HWND
WinGetClass, Class, ahk_id %HWND%
If (Class != "Static") {
ErrorLevel := "Class " . Class . " is not supported!"
Return False
}
If !DllCall("GetModuleHandle", "Str", "Gdiplus")
hGDIP := DllCall("LoadLibrary", "Str", "Gdiplus")
VarSetCapacity(SI, 16, 0)
Numput(1, SI, "UInt")
DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", pToken, "Ptr", &SI, "Ptr", 0)
If (!pToken) {
ErrorLevel := "GDIPlus could not be started!`nCheck the availability of GDIPlus on your system, please!"
Return False
}
VarSetCapacity(RECT, 16, 0)
DllCall("User32.dll\GetClientRect", "Ptr", HWND, "Ptr", &RECT)
W := NumGet(RECT, 8, "Int")
H := NumGet(RECT, 12, "Int")
If D Not In 0,1,2,3
D := 0
If GC Not In 0,1
GC := 0
If BW Not Between 1 And W
BW := W
If BH Not Between 1 And H
BH := H
DllCall("Gdiplus.dll\GdipCreateBitmapFromScan0", "Int", W, "Int", H, "Int", 0
, "Int", 0x26200A, "Ptr", 0, "PtrP", pBitmap)
DllCall("Gdiplus.dll\GdipGetImageGraphicsContext", "Ptr", pBitmap, "PtrP", pGraphics)
VarSetCapacity(RECTF, 16, 0)
NumPut(BW, RECTF, 8, "Float")
NumPut(BH, RECTF, 12, "Float")
DllCall("Gdiplus.dll\GdipCreateLineBrushFromRect", "Ptr", &RECTF
, "Int", 0, "Int", 0, "Int", D, "Int", 0, "PtrP", pBrush)
DllCall("Gdiplus.dll\GdipSetLineGammaCorrection", "Ptr", pBrush, "Int", GC)
VarSetCapacity(COLORS, IC * 4, 0)
O := -4
For I, V In oColors
NumPut(V | 0x00000000, COLORS, O += 4, "UInt")
VarSetCapacity(POSITIONS, IC * 4, 0)
O := -4
For I, V In oPositions
NumPut(V, POSITIONS, O += 4, "Float")
DllCall("Gdiplus.dll\GdipSetLinePresetBlend", "Ptr", pBrush, "Ptr", &COLORS, "Ptr", &POSITIONS, "Int", IC)
VarSetCapacity(ColourMatrix, 100, 0)
Matrix := 1.5|0|0|0|0|0|1.5|0|0|0|0|0|1.5|0|0|0|0|0|1|0|0.05|0.05|0.05|0|1
StringSplit, Matrix, Matrix, |
Loop, 25
{
Matrix := (Matrix%A_Index% != "") ? Matrix%A_Index% : Mod(A_Index-1, 6) ? 0 : 1
NumPut(Matrix, ColourMatrix, (A_Index-1)*4, "float")
}
DllCall("gdiplus\GdipCreateImageAttributes", "ptr*", ImageAttr)
DllCall("gdiplus\GdipSetImageAttributesColorMatrix", "ptr", ImageAttr, "int", 1, "int", 1, "ptr", &ColourMatrix, "ptr", 0, "int", 0)
DllCall("Gdiplus.dll\GdipFillRectangle", "Ptr", pGraphics, "Ptr", pBrush
, "Float", 0, "Float", 0, "Float", W, "Float", H)
; -------------------------------------------------------------------------------------------------------------------
; Create HBITMAP from bitmap
DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", pBitmap, "PtrP", hBitmap, "Int", 0X00FFFFFF)
; -------------------------------------------------------------------------------------------------------------------
; Free resources
DllCall("gdiplus\GdipSetSmoothingMode", "uint", pGraphics, "int", 4)
DllCall("gdiplus\GdipCreatePen1", "int", 0xffff0000, "float", 3, "int", 2, "uint*", pPen)
; Create HBITMAP from bitmap
DllCall("gdiplus\GdipDrawEllipse", "uint", pGraphics, "uint", pPen, "float", 0, "float", 80, "float", 80, "float", 60)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pBitmap)
DllCall("Gdiplus.dll\GdipDeleteBrush", "Ptr", pBrush)
DllCall("Gdiplus.dll\GdipDeleteGraphics", "Ptr", pGraphics)
; Shutdown GDI+
DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", pToken)
If (hGDIP)
DllCall("FreeLibrary", "Ptr", hGDIP)
; -------------------------------------------------------------------------------------------------------------------
; Set control styles
Control, Style, -%SS_ICON%, , ahk_id %HWND%
Control, Style, +%SS_BITMAP%, , ahk_id %HWND%
; Assign the bitmap
SendMessage, STM_SETIMAGE, IMAGE_BITMAP, hBitmap, , ahk_id %HWND%
; Done!
DllCall("Gdi32.dll\DeleteObject", "Ptr", hBitmap)
Return True
}
versioninfo =
(
========================================================================
Description ...: A Custom ColorDialog
Usage..........: Run from your script and selected color is saved to colors.ini as RGB
.................: runwait, colordialog.ahk ; run script, return when exited
..................: IniRead, color, colors.ini, Color, color_selected,0x00000 ; load color from dialog into %color%
Version .......: 1.0
Modified ......: 2017.07.06
Author ........: Peared
AHK-Version....: 1.1.26.00 U32
OS-Versions....: Win 10 64
========================================================================
Copyright (C) 2014-2016
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
It would never been anything other than an idea without all help ihave 4
found in Autohotkey.com forum, so thank you all for sharing.
)
; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=34092
#NoEnv
color_dialog_tool()
color_dialog_tool(){
global
colorlist2:=[0xffff0000,0xffff6600,0xffffcc00,0xffccff00,0xff66ff00,0xff00ff00,0xff00ff66,0xff00ffcc,0xff00ccff,0xff0066ff,0xff0000ff,0xff6600ff,0xffcc00ff,0xffff00cc,0xffff0066,0xffff0004]
colorlist1:=[0xff000000,0xffff0000,0xffffffff]
colorlist1pos := [0.0,0.3,1.0]
c1:=0
gui colordial:+alwaysontop +lastfound
Gui, colordial:Margin, 5, 5
Gui, colordial:color, white
Gui, colordial:FONT, BLACK
loop 8
{
IniRead, v%c1%, colors.ini, Color, v%c1%,0x000000
tmpcol := v%c1%
Gui, colordial:Add, text,+E0x20 0x200 w20 h20 BackgroundTrans v1%c1% gcolor_preset,
Gui, colordial:Add, Progress, x+-20 y+-20 w20 h20 Background%tmpcol% vv%c1%
c1++
GuiControl,+Background%tmpcol%,v%c1%
}
loop 4
{
IniRead, v%c1%, colors.ini, Color, v%c1%,0x000000
tmpcol := v%c1%
Gui, colordial:Add, text,+E0x20 0x200 x+5 y5 w20 h20 BackgroundTrans v1%c1% gcolor_preset,
Gui, colordial:Add, Progress, x+-20 y+-20 w20 h20 Background%tmpcol% vv%c1%
c1++
GuiControl,+Background%tmpcol%,v%c1%
loop 7
{
IniRead, v%c1%, colors.ini, Color, v%c1%,0x000000
tmpcol := v%c1%
Gui, colordial:Add, text,y+5 +E0x20 0x200 w20 h20 BackgroundTrans v2%c1% gcolor_preset,
Gui, colordial:Add, progress, x+-20 y+-20 w20 h20 Background%tmpcol% vv%c1%
GuiControl,+Background%tmpcol%,v%c1%
c1++
}
}
gui, colordial:font, s10 w700,
Gui, colordial:Add, Pic, x+5 y5 w200 h200 gcolorpal hwndHPI1C
Gui, colordial:Add, Pic, x+5 w15 h200 gcolorver hwndHPIC
Gui, colordial:Add, text, x+5 y5 +E0x20 0x200 w60 h30 section BackgroundTrans gcolor_preset_set,
Gui, colordial:Add, Progress, x+-60 y+-30 w60 h30 Background%RGB_v% vpC
Gui, colordial:Add, text, x+5 +E0x20 0x200 w70 h30 BackgroundTrans vrgbval, # %color_main%
gui, colordial:add, button, x+5 w50 h30 gcopy, Copy
Gui, colordial:Add, text,xs y+0 +E0x20 0x200 w60 h30 BackgroundTrans gcolor_preset_set,
Gui, colordial:Add, Progress, x+-60 y+-30 w60 h30 Background%RGB_v2% vpC2
Gui, colordial:Add, text, x+5 +E0x20 0x200 w70 h30 BackgroundTrans vrgbvalold, # %color_old%
gui, colordial:add, button, x+5 w50 h30 gcopyold, Copy
Gui, colordial:Add, Slider,xs y+10 w120 h20 AltSubmit +NoTicks +Range0-255 vsR gSlidermove line1, %R_v%
Gui, colordial:Add, Text, x+5 w28 h28 +Border vtr cBLACK +BackgroundTrans, R:
gui, colordial:font
Gui, colordial:Add, Edit, X+-10 W50 r1 LIMIT3 number vS_Red hwndRED gedit_set,%R_v%
Gui, colordial:Add, UpDown, vU_redDown Range0-255 gupdown_set, %R_v%
Gui, colordial:Add, Slider, xs y+7 w120 h20 AltSubmit +NoTicks +Range0-255 vsG gSlidermove line1, %G_v%
gui, colordial:font, s10 w700,
Gui, colordial:Add, Text,x+5 w28 h28 +Border vtg cBLACK +BackgroundTrans, G:
gui, colordial:font
Gui, colordial:Add, Edit, X+-10 W50 r1 LIMIT3 number r1 vS_GREEN hwndGREEN gedit_set,%G_v%
Gui, colordial:Add, UpDown, vU_greenDown Range0-255 gupdown_set, %G_v%
Gui, colordial:Add, Slider, xs y+8 w120 h20 AltSubmit +NoTicks +Range0-255 vsB gSlidermove line1, %B_v%
gui, colordial:font, s10 w700,
Gui, colordial:Add, Text, x+5 w28 h28 +Border vtb cBLACK +BackgroundTrans, B:
gui, colordial:font
Gui, colordial:Add, Edit, X+-10 W50 r1 LIMIT3 number r1 vS_BLUE hwndBLUE gedit_set,%B_v%
Gui, colordial:Add, UpDown, vU_blueDown Range0-255 gupdown_set, %B_v%
IC := Colors.MaxIndex()
Ip := pos.MaxIndex()
gui, colordial:add, button, xs+11 y+18 w80 h30 gcolor_ok_button, OK
gui, colordial:add, button, x+12 w80 h30 gcolor_cancel_button, Cancel
LinearGradient(HPI1C, Colorlist1, colorlist1pos, 2,1,200, 200)
LinearGradient(HPIC, Colorlist2, , 1,1)
Gui, colordial:Font, s14, Tahoma
Gui, colordial:Show, , AHK ColorPick
return
; -------------------------------------------------------------------------------------------------------
color_cancel_button:
gui, colordial:destroy
exitapp
return
; -------------------------------------------------------------------------------------------------------
color_ok_button:
gui, colordial:destroy
IniWrite, %color%, colors.ini, Color,color_selected
exitapp
return
; ------------------------------------------------------------------------------------------------------
copy:
clipboard = %color%
return
; ---------------------------------------------------------------------------------------------------------
copyold:
clipboard = %color_old%
return
; ------------------------------------------------------------------------------------------------------
colorver:
color_old := color
loop
{
MouseGetPos, ,,, OutputVarControl,3
if (OutputVarControl = HPIC)
{
MouseGetPos, MouseX, MouseY
PixelGetColor, color, %MouseX%, %MouseY%, RGB
set_color_sel(color)
c := Hex2RGB(color)
r_v := rgb("1" ,color), g_v:=rgb("2",color) ,B_v:=rgb("3" ,color)
set_control_val(r_v, g_v, b_v)
GuiControl,+Background%color%,pC
GuiControl,+Background%color_old%,pC2
stringtrimleft,color, color, 2
color_main := color
color_view(color_main)
}
GetKeyState, OutputVar, lbutton
if outputvar = U
break
}
return
; ------------------------------------------------------------------------------------------------------
color_preset_set:
set_col := 1
return
; --------------------------------------------------------
color_preset:
if set_col = 1
{
var := A_GuiControl
stringtrimleft,var, var, 1
GuiControl,+Background%color%,v%var%
v%var% = %color%
set_col = 0
IniWrite, %color%, colors.ini, Color,v%var%
} else {
var := A_GuiControl
stringtrimleft,var, var, 1
color := v%var%
GuiControl,+Background%color%,pC
color_main := Hex2RGB(color)
r_v := rgb("1" ,color), g_v:=rgb("2",color) ,B_v:=rgb("3" ,color)
set_control_val(r_v, g_v, b_v)
color_view(color)
set_color_sel(color)
}
return
;-------------------------------------------------------------
colorpal:
color_old := color
loop
{
MouseGetPos, ,,, OutputVarControl,3
if (OutputVarControl = HPI1C)
{
MouseGetPos, MouseX, MouseY
PixelGetColor, color, %MouseX%, %MouseY%, RGB
set_color_sel(color)
c := Hex2RGB(color)
r_v := rgb("1" ,color), g_v:=rgb("2",color) ,B_v:=rgb("3" ,color)
set_control_val(r_v, g_v, b_v)
stringtrimleft,color, color, 2
}
GetKeyState, OutputVar, lbutton
if outputvar = U
break
}
return
; ------------------------------------------------------------------------------------------------------
edit_set:
GuiControlGet,R_v,,s_red
GuiControlGet,G_v,,s_green
GuiControlGet,B_v,,s_blue
set_control_val(r_v, g_v, b_v)
rgb_c = %R_v%,%G_v%,%B_v%
hex_c := RGB2Hex(rgb_c)
set_color_sel("0x" hex_c)
return
updown_set:
GuiControlGet,R_v,,U_redDown
GuiControlGet,G_v,,U_greenDown
GuiControlGet,B_v,,U_blueDown
set_control_val(r_v, g_v, b_v)
rgb_c = %R_v%,%G_v%,%B_v%
hex_c := RGB2Hex(rgb_c)
color_view(hex_c)
set_color_sel("0x" hex_c)
return
}
set_color_sel(color){
global
IfInString, color, 0x
stringtrimleft,color, color, 2
GuiControl,+Background%color%,pC
GuiControl,+Background%color_old%,pC2
GuiControl,,rgbval,# %color%
GuiControl,,rgbvalold,# %color_old%
}
set_control_val(r_v, g_v, b_v){
GuiControl,,sr,%R_v%
GuiControl,,sg,%G_v%
GuiControl,,sb,%B_v%
GuiControl,,s_red,%R_v%
GuiControl,,s_green,%G_v%
GuiControl,,s_blue,%B_v%
GuiControl,,U_redDown,%R_v%
GuiControl,,U_greenDown,%G_v%
GuiControl,,U_blueDown,%B_v%
return
}
slidermove:
GuiControlGet,R_v,,sR
GuiControlGet,G_v,,sG
GuiControlGet,B_v,,sB
set_control_val(r_v, g_v, b_v)
rgb_c = %R_v%,%G_v%,%B_v%
hex_c := RGB2Hex(rgb_c)
color_main := hex_c
color_view(color_main)
GuiControl,+Background%hex_c%,pC
GuiControl,,s_red,%R_v%
GuiControl,,s_green,%G_v%
GuiControl,,s_blue,%B_v%
GuiControl,,U_redDown,%R_v%
GuiControl,,U_greenDown,%G_v%
GuiControl,,U_blueDown,%B_v%
return
color_view(color_main){
global
colorlist1.RemoveAt(2 , 2)
colorlist1.InsertAt(2 , "0xff" color_main, "0x00" color_main)
LinearGradient(HPI1C, Colorlist1, colorlist1pos, 2,1,200, 200)
return
}
Hex2RGB(CR) {
NumPut( "0x" SubStr(CR,-5), (V:="000000") )
return NumGet(V,2,"UChar") "," NumGet(V,1,"UChar") "," NumGet(V,0,"UChar")
}
RGB(vNum, sColor) {
vRGB := Hex2RGB(sColor)
StringSplit, aRGB, vRGB, `,
if (vNum = 1)
return aRGB1
else if (vNum = 2)
return aRGB2
else if (vNum = 3)
return aRGB3
}
RGB2Hex(s, d="") {
StringSplit, s, s, % d = "" ? "," : d
SetFormat, Integer, % (f := A_FormatInteger) = "D" ? "H" : f
h := s1 + 0 . s2 + 0 . s3 + 0
SetFormat, Integer, %f%
Return, RegExReplace(RegExReplace(h, "0x(.)(?=$|0x)", "0$1"), "0x")
}
;-------------- Code by JustMe
LinearGradient(HWND, oColors, oPositions = "", D = 0, GC = 0, BW = 0, BH = 0) {
Static SS_BITMAP := 0xE
Static SS_ICON := 0x3
Static STM_SETIMAGE := 0x172
Static IMAGE_BITMAP := 0x0
If !IsObject(oColors) || (oColors.MaxIndex() < 2) {
ErrorLevel := "Invalid parameter oColors!"
Return False
}
IC := oColors.MaxIndex()
If IsObject(oPositions) {
If (oPositions.MaxIndex() <> IC) {
ErrorLevel := "Invalid parameter oPositions!"
Return False
}
} Else {
oPositions := [0.0]
P := 1.0 / (IC - 1)
Loop, % (IC - 2)
oPositions.Insert(P * A_Index)
oPositions.Insert(1.0)
}
; -------------------------------------------------------------------------------------------------------------------
; Check HWND
WinGetClass, Class, ahk_id %HWND%
If (Class != "Static") {
ErrorLevel := "Class " . Class . " is not supported!"
Return False
}
If !DllCall("GetModuleHandle", "Str", "Gdiplus")
hGDIP := DllCall("LoadLibrary", "Str", "Gdiplus")
VarSetCapacity(SI, 16, 0)
Numput(1, SI, "UInt")
DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", pToken, "Ptr", &SI, "Ptr", 0)
If (!pToken) {
ErrorLevel := "GDIPlus could not be started!`nCheck the availability of GDIPlus on your system, please!"
Return False
}
VarSetCapacity(RECT, 16, 0)
DllCall("User32.dll\GetClientRect", "Ptr", HWND, "Ptr", &RECT)
W := NumGet(RECT, 8, "Int")
H := NumGet(RECT, 12, "Int")
If D Not In 0,1,2,3
D := 0
If GC Not In 0,1
GC := 0
If BW Not Between 1 And W
BW := W
If BH Not Between 1 And H
BH := H
DllCall("Gdiplus.dll\GdipCreateBitmapFromScan0", "Int", W, "Int", H, "Int", 0
, "Int", 0x26200A, "Ptr", 0, "PtrP", pBitmap)
DllCall("Gdiplus.dll\GdipGetImageGraphicsContext", "Ptr", pBitmap, "PtrP", pGraphics)
VarSetCapacity(RECTF, 16, 0)
NumPut(BW, RECTF, 8, "Float")
NumPut(BH, RECTF, 12, "Float")
DllCall("Gdiplus.dll\GdipCreateLineBrushFromRect", "Ptr", &RECTF
, "Int", 0, "Int", 0, "Int", D, "Int", 0, "PtrP", pBrush)
DllCall("Gdiplus.dll\GdipSetLineGammaCorrection", "Ptr", pBrush, "Int", GC)
VarSetCapacity(COLORS, IC * 4, 0)
O := -4
For I, V In oColors
NumPut(V | 0x00000000, COLORS, O += 4, "UInt")
VarSetCapacity(POSITIONS, IC * 4, 0)
O := -4
For I, V In oPositions
NumPut(V, POSITIONS, O += 4, "Float")
DllCall("Gdiplus.dll\GdipSetLinePresetBlend", "Ptr", pBrush, "Ptr", &COLORS, "Ptr", &POSITIONS, "Int", IC)
VarSetCapacity(ColourMatrix, 100, 0)
Matrix := 1.5|0|0|0|0|0|1.5|0|0|0|0|0|1.5|0|0|0|0|0|1|0|0.05|0.05|0.05|0|1
StringSplit, Matrix, Matrix, |
Loop, 25
{
Matrix := (Matrix%A_Index% != "") ? Matrix%A_Index% : Mod(A_Index-1, 6) ? 0 : 1
NumPut(Matrix, ColourMatrix, (A_Index-1)*4, "float")
}
DllCall("gdiplus\GdipCreateImageAttributes", "ptr*", ImageAttr)
DllCall("gdiplus\GdipSetImageAttributesColorMatrix", "ptr", ImageAttr, "int", 1, "int", 1, "ptr", &ColourMatrix, "ptr", 0, "int", 0)
DllCall("Gdiplus.dll\GdipFillRectangle", "Ptr", pGraphics, "Ptr", pBrush
, "Float", 0, "Float", 0, "Float", W, "Float", H)
; -------------------------------------------------------------------------------------------------------------------
; Create HBITMAP from bitmap
DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "Ptr", pBitmap, "PtrP", hBitmap, "Int", 0X00FFFFFF)
; -------------------------------------------------------------------------------------------------------------------
; Free resources
DllCall("gdiplus\GdipSetSmoothingMode", "uint", pGraphics, "int", 4)
DllCall("gdiplus\GdipCreatePen1", "int", 0xffff0000, "float", 3, "int", 2, "uint*", pPen)
; Create HBITMAP from bitmap
DllCall("gdiplus\GdipDrawEllipse", "uint", pGraphics, "uint", pPen, "float", 0, "float", 80, "float", 80, "float", 60)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pBitmap)
DllCall("Gdiplus.dll\GdipDeleteBrush", "Ptr", pBrush)
DllCall("Gdiplus.dll\GdipDeleteGraphics", "Ptr", pGraphics)
; Shutdown GDI+
DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", pToken)
If (hGDIP)
DllCall("FreeLibrary", "Ptr", hGDIP)
; -------------------------------------------------------------------------------------------------------------------
; Set control styles
Control, Style, -%SS_ICON%, , ahk_id %HWND%
Control, Style, +%SS_BITMAP%, , ahk_id %HWND%
; Assign the bitmap
SendMessage, STM_SETIMAGE, IMAGE_BITMAP, hBitmap, , ahk_id %HWND%
; Done!
DllCall("Gdi32.dll\DeleteObject", "Ptr", hBitmap)
Return True
}
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)