#NoEnv ; #Include Class_CtlColors.ahk OnExit, GuiClose ; ---------------------------------------------------------------------------------------------------------------------- SysGet, SGW, 71 ; SM_CXMENUCHECK LB_SETCURSEL := 0x186 CB_SETCURSEL := 0x14E Red := "FF0000" Green := "00C000" Blue := "0000FF" Pink := "FF20FF" ; ---------------------------------------------------------------------------------------------------------------------- Gui, Margin, 10, 10 Gui, Add, Radio, vSTDRB1 gSTDRBG hwndRBID1 Checked, Standard Radio 1 CtlColors.Attach(RBID1, "Lime", "") Gui, Add, Radio, x+55 ym vSTDRB2 gSTDRBG hwndRBID2, Standard Radio 2 Gui, Add, CheckBox, xm vSTDCB1 gSTDCB1 hwndCBID1, Standard CheckBox CtlColors.Attach(CBID1, "C0C0C0", "Red") ; ---------------------------------------------------------------------------------------------------------------------- Gui, Add, Text, xm w292 h2 +0x1000 ; "Faked" RadioButtons ------------------------------------------------------------------------------------------------- ; Note: Minimum width and height are font, font size and OS dependend, if you get below the limit, nothing is shown!!! Gui, Add, Radio, xm w%SGW% h20 gRBG vRB1 Section Group Checked Gui, Add, Radio, xm wp hp gRBG vRB2 Gui, Add, Radio, xm wp hp gRBG vRB3 Gui, Add, Text, ys x+5 w50 hp 0x200 cBlue gRBG vRT1 hwndRTID1, Radio 1 Gui, Add, Text, xp y+10 wp hp 0x200 cBlue gRBG vRT2 hwndRTID2, Radio 2 Gui, Add, Text, xp y+10 wp hp 0x200 cBlue gRBG vRT3 hwndRTID3, Radio 3 RBGA := 1 CtlColors.Attach(RTID%RBGA%, "Yellow", "Blue") ; "Faked" CheckBox ----------------------------------------------------------------------------------------------------- ; Note: for minimum width see "Faked" RadioButtons Gui, Add, CheckBox, ys x+80 w%SGW% h20 gCB1 vCB1 Section Gui, Add, Text, x+5 yp hp 0x200 gCB1 vCT1 hwndCTID1, % " Check me! " CtlColors.Attach(CTID1, "", "Green") ; ComboBox ------------------------------------------------------------------------------------------------------------- Gui, Add, Combobox, xs y+40 w141 gCBB1 vCBB1 hwndCBBID1 , ComboBox 1||ComboBox 2|ComboBox 3 CtlColors.Attach(CBBID1, "Aqua", "Red") ; ---------------------------------------------------------------------------------------------------------------------- Gui, Add, Text, xm w292 h2 +0x1000 ; ListBox -------------------------------------------------------------------------------------------------------------- Gui, Add, ListBox, xm w292 r4 gLB1 vLB1 hwndLBID1 , ListBox Red|ListBox Green|ListBox Blue|ListBox Pink CtlColors.Attach(LBID1, Red, "White") GuiControl, Choose, LB1, |1 ; ---------------------------------------------------------------------------------------------------------------------- Gui, Add, Text, xm w292 h2 +0x1000 ; Edit ----------------------------------------------------------------------------------------------------------------- Gui, Font, s10 Gui, Add, Edit, xm w292 r10 vED1 hwndEDID1, I m an Edit, edit me! CtlColors.Attach(EDID1, "606060", "Aqua") Gui, Add, Edit, xm w292 vED2 hwndEDID2 +Disabled, % " I'm disabled!" CtlColors.Attach(EDID2, "Gray", "Lime") ; ---------------------------------------------------------------------------------------------------------------------- Gui, Show, , Colored Controls Return ; ---------------------------------------------------------------------------------------------------------------------- GuiClose: GuiEscape: Gui, Destroy CtlColors.Free() ExitApp ; ---------------------------------------------------------------------------------------------------------------------- GuiSize: If (A_EventInfo != 1) { Gui, %A_Gui%:+LastFound WinSet, ReDraw } Return ; ---------------------------------------------------------------------------------------------------------------------- STDRBG: GuiControlGet, STDRB1 CtlColors.Change(RBID1, (STDRB1 ? "Lime" : ""), "006000") CtlColors.Change(RBID2, (STDRB1 ? "" : "Lime"), "006000") Return ; ---------------------------------------------------------------------------------------------------------------------- STDCB1: GuiControlGet, STDCB1 CtlColors.Change(CBID1, (STDCB1 ? "Lime" : "C0C0C0"), "Red") Return ; ---------------------------------------------------------------------------------------------------------------------- RBG: RBG := SubStr(A_GuiControl, 3) If (RBG != RBGA) { CtlColors.Detach(RTID%RBGA%) CtlColors.Attach(RTID%RBG%, "Yellow", "Blue") GuiControl, , RB%RBG%, 1 RBGA := RBG } Return ; ---------------------------------------------------------------------------------------------------------------------- LB1: GuiControlGet, LB1 StringSplit, LC, LB1, %A_Space% If (%LC2%) { BG := %LC2%, TX := "White" CtlColors.Change(LBID1, BG, TX) SendMessage, LB_SETCURSEL, -1, 0, , ahk_id %LBID1% } Return ; ---------------------------------------------------------------------------------------------------------------------- CB1: GuiControlGet, CB1 If (A_GuiControl = "CT1") CB1 ^= True If (CB1) CtlColors.Change(CTID1, "Lime", "406060") Else CtlColors.Change(CTID1, "", "Green") GuiControl, , CB1, %CB1% Return ; ---------------------------------------------------------------------------------------------------------------------- CBB1: Return ; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=2197 ; Class_CtlColors.ahk ; ====================================================================================================================== ; AHK 1.1+ ; ====================================================================================================================== ; Function: Auxiliary object to color controls on WM_CTLCOLOR... notifications. ; Supported controls are: Checkbox, ComboBox, DropDownList, Edit, ListBox, Radio, Text. ; Checkboxes and Radios accept only background colors due to design. ; Namespace: CtlColors ; Tested with: 1.1.25.02 ; Tested on: Win 10 (x64) ; Change log: 1.0.04.00/2017-10-30/just me - added transparent background (BkColor = "Trans"). ; 1.0.03.00/2015-07-06/just me - fixed Change() to run properly for ComboBoxes. ; 1.0.02.00/2014-06-07/just me - fixed __New() to run properly with compiled scripts. ; 1.0.01.00/2014-02-15/just me - changed class initialization. ; 1.0.00.00/2014-02-14/just me - initial release. ; ====================================================================================================================== ; This software is provided 'as-is', without any express or implied warranty. ; In no event will the authors be held liable for any damages arising from the use of this software. ; ====================================================================================================================== Class CtlColors { ; =================================================================================================================== ; Class variables ; =================================================================================================================== ; Registered Controls Static Attached := {} ; OnMessage Handlers Static HandledMessages := {Edit: 0, ListBox: 0, Static: 0} ; Message Handler Function Static MessageHandler := "CtlColors_OnMessage" ; Windows Messages Static WM_CTLCOLOR := {Edit: 0x0133, ListBox: 0x134, Static: 0x0138} ; HTML Colors (BGR) Static HTML := {AQUA: 0xFFFF00, BLACK: 0x000000, BLUE: 0xFF0000, FUCHSIA: 0xFF00FF, GRAY: 0x808080, GREEN: 0x008000 , LIME: 0x00FF00, MAROON: 0x000080, NAVY: 0x800000, OLIVE: 0x008080, PURPLE: 0x800080, RED: 0x0000FF , SILVER: 0xC0C0C0, TEAL: 0x808000, WHITE: 0xFFFFFF, YELLOW: 0x00FFFF} ; Transparent Brush Static NullBrush := DllCall("GetStockObject", "Int", 5, "UPtr") ; System Colors Static SYSCOLORS := {Edit: "", ListBox: "", Static: ""} ; Error message in case of errors Static ErrorMsg := "" ; Class initialization Static InitClass := CtlColors.ClassInit() ; =================================================================================================================== ; Constructor / Destructor ; =================================================================================================================== __New() { ; You must not instantiate this class! If (This.InitClass == "!DONE!") { ; external call after class initialization This["!Access_Denied!"] := True Return False } } ; ---------------------------------------------------------------------------------------------------------------- __Delete() { If This["!Access_Denied!"] Return This.Free() ; free GDI resources } ; =================================================================================================================== ; ClassInit Internal creation of a new instance to ensure that __Delete() will be called. ; =================================================================================================================== ClassInit() { CtlColors := New CtlColors Return "!DONE!" } ; =================================================================================================================== ; CheckBkColor Internal check for parameter BkColor. ; =================================================================================================================== CheckBkColor(ByRef BkColor, Class) { This.ErrorMsg := "" If (BkColor != "") && !This.HTML.HasKey(BkColor) && !RegExMatch(BkColor, "^[[:xdigit:]]{6}$") { This.ErrorMsg := "Invalid parameter BkColor: " . BkColor Return False } BkColor := BkColor = "" ? This.SYSCOLORS[Class] : This.HTML.HasKey(BkColor) ? This.HTML[BkColor] : "0x" . SubStr(BkColor, 5, 2) . SubStr(BkColor, 3, 2) . SubStr(BkColor, 1, 2) Return True } ; =================================================================================================================== ; CheckTxColor Internal check for parameter TxColor. ; =================================================================================================================== CheckTxColor(ByRef TxColor) { This.ErrorMsg := "" If (TxColor != "") && !This.HTML.HasKey(TxColor) && !RegExMatch(TxColor, "i)^[[:xdigit:]]{6}$") { This.ErrorMsg := "Invalid parameter TextColor: " . TxColor Return False } TxColor := TxColor = "" ? "" : This.HTML.HasKey(TxColor) ? This.HTML[TxColor] : "0x" . SubStr(TxColor, 5, 2) . SubStr(TxColor, 3, 2) . SubStr(TxColor, 1, 2) Return True } ; =================================================================================================================== ; Attach Registers a control for coloring. ; Parameters: HWND - HWND of the GUI control ; BkColor - HTML color name, 6-digit hexadecimal RGB value, or "" for default color ; ----------- Optional ; TxColor - HTML color name, 6-digit hexadecimal RGB value, or "" for default color ; Return values: On success - True ; On failure - False, CtlColors.ErrorMsg contains additional informations ; =================================================================================================================== Attach(HWND, BkColor, TxColor := "") { ; Names of supported classes Static ClassNames := {Button: "", ComboBox: "", Edit: "", ListBox: "", Static: ""} ; Button styles Static BS_CHECKBOX := 0x2, BS_RADIOBUTTON := 0x8 ; Editstyles Static ES_READONLY := 0x800 ; Default class background colors Static COLOR_3DFACE := 15, COLOR_WINDOW := 5 ; Initialize default background colors on first call ------------------------------------------------------------- If (This.SYSCOLORS.Edit = "") { This.SYSCOLORS.Static := DllCall("User32.dll\GetSysColor", "Int", COLOR_3DFACE, "UInt") This.SYSCOLORS.Edit := DllCall("User32.dll\GetSysColor", "Int", COLOR_WINDOW, "UInt") This.SYSCOLORS.ListBox := This.SYSCOLORS.Edit } This.ErrorMsg := "" ; Check colors --------------------------------------------------------------------------------------------------- If (BkColor = "") && (TxColor = "") { This.ErrorMsg := "Both parameters BkColor and TxColor are empty!" Return False } ; Check HWND ----------------------------------------------------------------------------------------------------- If !(CtrlHwnd := HWND + 0) || !DllCall("User32.dll\IsWindow", "UPtr", HWND, "UInt") { This.ErrorMsg := "Invalid parameter HWND: " . HWND Return False } If This.Attached.HasKey(HWND) { This.ErrorMsg := "Control " . HWND . " is already registered!" Return False } Hwnds := [CtrlHwnd] ; Check control's class ------------------------------------------------------------------------------------------ Classes := "" WinGetClass, CtrlClass, ahk_id %CtrlHwnd% This.ErrorMsg := "Unsupported control class: " . CtrlClass If !ClassNames.HasKey(CtrlClass) Return False ControlGet, CtrlStyle, Style, , , ahk_id %CtrlHwnd% If (CtrlClass = "Edit") Classes := ["Edit", "Static"] Else If (CtrlClass = "Button") { IF (CtrlStyle & BS_RADIOBUTTON) || (CtrlStyle & BS_CHECKBOX) Classes := ["Static"] Else Return False } Else If (CtrlClass = "ComboBox") { VarSetCapacity(CBBI, 40 + (A_PtrSize * 3), 0) NumPut(40 + (A_PtrSize * 3), CBBI, 0, "UInt") DllCall("User32.dll\GetComboBoxInfo", "Ptr", CtrlHwnd, "Ptr", &CBBI) Hwnds.Insert(NumGet(CBBI, 40 + (A_PtrSize * 2, "UPtr")) + 0) Hwnds.Insert(Numget(CBBI, 40 + A_PtrSize, "UPtr") + 0) Classes := ["Edit", "Static", "ListBox"] } If !IsObject(Classes) Classes := [CtrlClass] ; Check background color ----------------------------------------------------------------------------------------- If (BkColor <> "Trans") If !This.CheckBkColor(BkColor, Classes[1]) Return False ; Check text color ----------------------------------------------------------------------------------------------- If !This.CheckTxColor(TxColor) Return False ; Activate message handling on the first call for a class -------------------------------------------------------- For I, V In Classes { If (This.HandledMessages[V] = 0) OnMessage(This.WM_CTLCOLOR[V], This.MessageHandler) This.HandledMessages[V] += 1 } ; Store values for HWND ------------------------------------------------------------------------------------------ If (BkColor = "Trans") Brush := This.NullBrush Else Brush := DllCall("Gdi32.dll\CreateSolidBrush", "UInt", BkColor, "UPtr") For I, V In Hwnds This.Attached[V] := {Brush: Brush, TxColor: TxColor, BkColor: BkColor, Classes: Classes, Hwnds: Hwnds} ; Redraw control ------------------------------------------------------------------------------------------------- DllCall("User32.dll\InvalidateRect", "Ptr", HWND, "Ptr", 0, "Int", 1) This.ErrorMsg := "" Return True } ; =================================================================================================================== ; Change Change control colors. ; Parameters: HWND - HWND of the GUI control ; BkColor - HTML color name, 6-digit hexadecimal RGB value, or "" for default color ; ----------- Optional ; TxColor - HTML color name, 6-digit hexadecimal RGB value, or "" for default color ; Return values: On success - True ; On failure - False, CtlColors.ErrorMsg contains additional informations ; Remarks: If the control isn't registered yet, Add() is called instead internally. ; =================================================================================================================== Change(HWND, BkColor, TxColor := "") { ; Check HWND ----------------------------------------------------------------------------------------------------- This.ErrorMsg := "" HWND += 0 If !This.Attached.HasKey(HWND) Return This.Attach(HWND, BkColor, TxColor) CTL := This.Attached[HWND] ; Check BkColor -------------------------------------------------------------------------------------------------- If (BkColor <> "Trans") If !This.CheckBkColor(BkColor, CTL.Classes[1]) Return False ; Check TxColor ------------------------------------------------------------------------------------------------ If !This.CheckTxColor(TxColor) Return False ; Store Colors --------------------------------------------------------------------------------------------------- If (BkColor <> CTL.BkColor) { If (CTL.Brush) { If (Ctl.Brush <> This.NullBrush) DllCall("Gdi32.dll\DeleteObject", "Prt", CTL.Brush) This.Attached[HWND].Brush := 0 } If (BkColor = "Trans") Brush := This.NullBrush Else Brush := DllCall("Gdi32.dll\CreateSolidBrush", "UInt", BkColor, "UPtr") For I, V In CTL.Hwnds { This.Attached[V].Brush := Brush This.Attached[V].BkColor := BkColor } } For I, V In Ctl.Hwnds This.Attached[V].TxColor := TxColor This.ErrorMsg := "" DllCall("User32.dll\InvalidateRect", "Ptr", HWND, "Ptr", 0, "Int", 1) Return True } ; =================================================================================================================== ; Detach Stop control coloring. ; Parameters: HWND - HWND of the GUI control ; Return values: On success - True ; On failure - False, CtlColors.ErrorMsg contains additional informations ; =================================================================================================================== Detach(HWND) { This.ErrorMsg := "" HWND += 0 If This.Attached.HasKey(HWND) { CTL := This.Attached[HWND].Clone() If (CTL.Brush) && (CTL.Brush <> This.NullBrush) DllCall("Gdi32.dll\DeleteObject", "Prt", CTL.Brush) For I, V In CTL.Classes { If This.HandledMessages[V] > 0 { This.HandledMessages[V] -= 1 If This.HandledMessages[V] = 0 OnMessage(This.WM_CTLCOLOR[V], "") } } For I, V In CTL.Hwnds This.Attached.Remove(V, "") DllCall("User32.dll\InvalidateRect", "Ptr", HWND, "Ptr", 0, "Int", 1) CTL := "" Return True } This.ErrorMsg := "Control " . HWND . " is not registered!" Return False } ; =================================================================================================================== ; Free Stop coloring for all controls and free resources. ; Return values: Always True. ; =================================================================================================================== Free() { For K, V In This.Attached If (V.Brush) && (V.Brush <> This.NullBrush) DllCall("Gdi32.dll\DeleteObject", "Ptr", V.Brush) For K, V In This.HandledMessages If (V > 0) { OnMessage(This.WM_CTLCOLOR[K], "") This.HandledMessages[K] := 0 } This.Attached := {} Return True } ; =================================================================================================================== ; IsAttached Check if the control is registered for coloring. ; Parameters: HWND - HWND of the GUI control ; Return values: On success - True ; On failure - False ; =================================================================================================================== IsAttached(HWND) { Return This.Attached.HasKey(HWND) } } ; ====================================================================================================================== ; CtlColors_OnMessage ; This function handles CTLCOLOR messages. There's no reason to call it manually! ; ====================================================================================================================== CtlColors_OnMessage(HDC, HWND) { Critical If CtlColors.IsAttached(HWND) { CTL := CtlColors.Attached[HWND] If (CTL.TxColor != "") DllCall("Gdi32.dll\SetTextColor", "Ptr", HDC, "UInt", CTL.TxColor) If (CTL.BkColor = "Trans") DllCall("Gdi32.dll\SetBkMode", "Ptr", HDC, "UInt", 1) ; TRANSPARENT = 1 Else DllCall("Gdi32.dll\SetBkColor", "Ptr", HDC, "UInt", CTL.BkColor) Return CTL.Brush } }
声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。
评论(0)