Deutsches AutoHotkey Homepage AutoHotkey Community
Wir helfen uns gegenseitig aus der Patsche
 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   RegistrierenRegistrieren 
 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Farbige Controls (keine Bitmap)
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Skripte & Funktionen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
DerRaphael



Anmeldedatum: 09.01.2008
Beiträge: 834
Wohnort: Zuhause

BeitragVerfasst am: Mo Feb 18, 2008 10:05 pm    Titel: Farbige Controls (keine Bitmap) Antworten mit Zitat

Techdemo:



Die Basis diesen Codes hatte ich mal gelesen und dann wieder vergessen woher ich diese Info hatte. Nachdem ich mir einen Wolf gesucht habe, bin ich durch eine Info von Skan darauf gestoßen worden, dass diese Funktion in der Hilfe dokumentiert ist. Das ist ein simples Beispiel für RegisterCallBack() gewesen. Ich habe es mal meinen Bedürfnissen angepasst, so dass relativ einfach Controls nun eine Hintergrundfarbe bekommen können.

Dazu muss eine Variable definiert werden, welche die Farbe im Format BGR (Blau, Grün, Rot) enthält.

Die Nomenklatur der Variablen ist wie folgt:

Jedes Control, dass eine Texthintergrundfarbe bekommen soll, bekommt den Parameter HwndControl1

Hwnd: die Option (ähnlich g oder v)
Control: Der fixe Namensteil (nötig für die Routine - ein anderer geht nicht)
1: Laufende Nummer

Die Farbe selbst wird dazu passend in einer Variable
Control1BG
gespeichert.

Wichtig: Vor dem Gui, Show muss mit der Zeile:
Code:
RCBCtrlBG := Ctrl_RCB()

Der Callback Initiiert werden, sonst gehts net.

Code:
; Beispiel für farbigen Hintergund für verschiedene Controls
; basierend auf dem RCB Beispiel aus der Hilfe

; Abriss: Funktioniert, durch eine Umlenkung der CallWindowProc zu einer Funktion
;         innerhalb des Skripts. Anschließend wird der Abruf zu der eigentlichen
;         Adresse weitergeleitet.

Gui, Add, Text, HwndControl1, Hier ist ein wenig Text `nmit farbigen Hintergrund
 Control1BG := 0xFFBBBB

Gui, Add, CheckBox, HwndControl2, Dafür wieder hier  :)
 Control2BG := 0xFFFFFF

Gui, Add, Radio, HwndControl3, Und hier  :)
 Control3BG := 0x00ff00

Gui, Add, Text, HwndControl4 Disabled, Hier auch :D
 Control4BG := 0x00ffff

Gui +LastFound

RCBCtrlBG := Ctrl_RCB()
Gui Show

return

GuiEscape:
GuiClose:
  ExitApp


ControlBG(hwnd, uMsg, wParam, lParam)
{
  Global
  Critical

  if (uMsg = 0x138) ; 0x138 WM_CTLCOLORSTATIC
  {
    WinGet, Liste, ControlListHwnd, ahk_id %hwnd%
    Loop, Parse, Liste,`n
    {
      If (lParam=Control%A_Index%) {
        DllCall("SetBkColor", UInt, wParam, UInt, Control%A_Index%BG)
        return DllCall("CreateSolidBrush", UInt, Control%A_Index%BG)
      }
    }
  }
  return DllCall("CallWindowProcA", UInt, RCBCtrlBG, UInt, hwnd, UInt, uMsg, UInt, wParam, UInt, lParam)
}

Ctrl_RCB(){
  return DllCall("SetWindowLong", UInt, (WinExist())
                  , Int, -4, Int, (RegisterCallback("ControlBG","",4)), UInt)
}


Buttons und Tabs habe ich getestet: mit diesem Code ist keine Farbzuweisung möglich.

grüße
derRaphael
_________________


Zuletzt bearbeitet von DerRaphael am Sa Feb 23, 2008 1:02 pm, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
denick



Anmeldedatum: 15.09.2006
Beiträge: 1088
Wohnort: Berlin

BeitragVerfasst am: Do Feb 21, 2008 12:17 pm    Titel: Antworten mit Zitat

Moin DerRaphael,

Dein Skript hat mich fasziniert, weil es eine recht einfache und überschaubare Antwort auf die immer wieder gestellte Frage nach individuellen Hintergrundfarben gibt.

Ich habe damit intensiv herumprobiert und das Mutterforum durchwühlt, weil meine Windows-API-Kenntnisse nicht der Rede Wert sind.

Letztlich sind dann zwei Erweiterungen dabei herausgekommen:

1. Das Ganze funktioniert jetzt auch für Edits.
2. Für Edit- und Textfelder kann auch die Schriftfarbe vorgegeben werden. Die per Gui, Font eingestellten Farben werden ja aus welchen Gründen auch immer ignoriert.

Für Checkboxen und Radiobuttons funktioniert das mit der Schriftfarbe bisher nicht. Vielleicht fällt Dir ja dazu etwas ein.

Ich habe die komplette Funktionalität dann noch in eine Funktion gegossen. Das ändert am Funktionsumfang nichts, gefällt mir persönlich aber besser. Die Fensterfunktion kann (muss) auch direkt aus dem Skript aufgerufen werden und verwaltet die Farbeinstellungen und die Registrierung als CallBack. Es bleibt noch reichlich Raum für Erweiterungen.

Ich habe dann überlegt, ob ich das hier einstelle oder einen eigenen Thread aufmache. Beides gefällt mir nicht wirklich, ich habe mich aber jetzt für diesen Platz entschieden. Ich hoffe, Du hast nichts dagegen. Wenn doch, nehme ich es wieder raus.

So, jetzt kommt es:

Techdemo: (Alpha)



Code:
#NoEnv
; Beispiel für farbigen Hintergund für verschiedene Controls
; basierend auf dem RCB Beispiel aus der Hilfe

; Abriss: Funktioniert durch eine Umlenkung der CallWindowProc zu einer Funktion
;         innerhalb des Skripts. Anschließend wird der Abruf zu der eigentlichen
;         Adresse weitergeleitet.

; HTML Colors im BGR-Format
Black = 0x000000
Green = 0x008000
Silver = 0xC0C0C0
Lime = 0x00FF00
Gray = 0x808080
Olive = 0x800080
White = 0xFFFFFF
Yellow = 0x00FFFF
Maroon = 0x000080
Navy = 0x800000
Red = 0x0000FF
Blue = 0xFF0000
Purple = 0x800080
Teal = 0x808000
Fuchsia = 0xFF00FF
Aqua = 0xFFFF00

Gui, Margin, 10, 10
Gui, Font, s12
Gui, Color, Black
Gui, Add, Text, HwndTX1ID w300, Ein wenig Text`nmit farbigem Hintergrund.
Control_Colors(TX1ID, "Set", Teal, White)
Gui, Add, CheckBox, HwndCB1ID wp vCB1 gCB1Clicked, Und hier eine Checkbox.
Control_Colors(CB1ID, "Set", Silver)
Gui, Add, Radio, HwndRB1ID xp y+0 wp vRB1 gRB1Clicked, Radiobutton als Checkbox
RB1 := False
Control_Colors(RB1ID, "Set", Silver)
Gui, Add, Edit, HwndED1ID ReadOnly wp, Das ist ein Readonly Edit!
Control_Colors(ED1ID, "Set", Red, Yellow)
Gui, Add, Text, HwndTX2ID Disabled wp, Dieser Text ist disabled.
Control_Colors(TX2ID, "Set", Maroon, Black)
Gui, Add, Edit, HwndED2ID r2 wp, Das ist ein normales Edit!
Control_Colors(ED2ID, "Set", Navy, White)
Gui, Add, Button, vBTChange gBTChange wp, Einmal Farben wechseln

Gui, +LastFound
GuiID := WinExist()
Control_Colors(GuiID, "RCB", 0, 0)

Gui, Show, , Colors

Return

GuiEscape:
GuiClose:
ExitApp

BTChange:
Control_Colors(TX1ID, "Set", Red, Teal)
Control_Colors(ED1ID, "Set", Maroon, Yellow)
Control_Colors(TX2ID, "Set", Aqua, White)
Control_Colors(ED2ID, "Set", Silver, Navy)
Gui, +LastFound
WinSet, Redraw
GuiControl, Hide, BTChange
Gui, Show, AutoSize
Return

CB1Clicked:
GuiControlGet, CB1
Control_Colors(CB1ID, "Set", (CB1 ? Yellow : Silver))
WinSet, Redraw, , ahk_id %CB1ID%
Return

RB1Clicked:
RB1 ^= True
Control_Colors(RB1ID, "Set", (RB1 ? Green : Silver))
WinSet, Redraw, , ahk_id %RB1ID%
GuiControl, , RB1, %RB1%
Return

Control_Colors(Hwnd, Msg, wParam, lParam = 0)
{
   Critical
   Static OldWinProc := ""          ; Ursprüngliche Fensterprozedur
   Static NewWinProc := ""          ; Neue Fensterprozedur
   Static SetValue := "Set"         ; Werte übernehmen
   Static Register := "RCB"         ; RegisterCallBack
   Static ValueList := ""           ; WerteListe

   ; Aufruf als Fensterprozedur?
   If (A_EventInfo <> NewWinProc) {
      If (Msg = SetValue) {
         If (RegExMatch(ValueList, "m)^" . (Hwnd +0) . "\|")) {
            ValueList := RegExReplace(ValueList
                                     , "m)^" . (Hwnd + 0) . "\|.*$"
                                     , (Hwnd + 0) . "|"
                                     . (wParam + 0) . "|"
                                     . (lParam + 0))
         } Else {
            ValueList .= (Hwnd + 0) . "|"
                      .  (wParam + 0) . "|"
                      .  (lParam + 0) .  "`r`n"
         }
         Return
      }
      If (Msg = Register) {
         If (NewWinProc = "") {
            NewWinProc := RegisterCallback("Control_Colors","",4)
            OldWinProc := DllCall("SetWindowLong"
                                 , UInt, Hwnd
                                 , Int, -4
                                 , Int, NewWinProc
                                 , UInt)
         }
         Return
      }
      Return
   }
   ; 0x0133 : WM_CTLCOLOREDIT
   ; 0x0138 : WM_CTLCOLORSTATIC
   If (Msg = 0x0133 Or Msg = 0x0135 Or Msg = 0x0138) {
      If (RegExMatch(ValueList, "m)^"
                     . (lParam + 0) . "\|(?P<BG>\d+)\|(?P<TX>\d+)$"
                     , C)) {
         DllCall("SetTextColor", UInt, wParam, UInt, CTX)
         DllCall("SetBkColor", UInt, wParam, UInt, CBG)
         Return, DllCall("CreateSolidBrush", UInt, CBG)
      }
   }
   Return DllCall("CallWindowProcA"
                  , UInt, OldWinProc
                  , UInt, Hwnd
                  , UInt, Msg
                  , UInt, wParam
                  , UInt, lParam)
}

_________________
Hilfe zur Hilfe

(de)nick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BoBo¨
Gast





BeitragVerfasst am: Do Feb 21, 2008 12:47 pm    Titel: Antworten mit Zitat

R E S P E K T ! (Euch darf man auch keine 5 Minuten alleine lassen Very Happy)
Nach oben
DerRaphael



Anmeldedatum: 09.01.2008
Beiträge: 834
Wohnort: Zuhause

BeitragVerfasst am: Do Feb 21, 2008 2:13 pm    Titel: Antworten mit Zitat

denick, ich habe es jetzt erst entdeckt, und ich finde es großartig!!!

danke für diese erweiterung Smile Smile Smile

grüße
derRaphael
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
DerRaphael



Anmeldedatum: 09.01.2008
Beiträge: 834
Wohnort: Zuhause

BeitragVerfasst am: Do Feb 21, 2008 3:02 pm    Titel: Antworten mit Zitat

ich habe mal die funktion von denick (nochmals danke an dieser stelle) so verändert, dass man jetzt auch direkt die variablennamen statt der hWnd übergeben kann. hier ist der code - es werden beiderlei methoden demonstriert.

Code:
#NoEnv
; Beispiel für farbigen Hintergund für verschiedene Controls
; basierend auf dem RCB Beispiel aus der Hilfe

; Abriss: Funktioniert durch eine Umlenkung der CallWindowProc zu einer Funktion
;         innerhalb des Skripts. Anschließend wird der Abruf zu der eigentlichen
;         Adresse weitergeleitet.

; HTML Colors im BGR-Format
Black = 0x000000
Green = 0x008000
Silver = 0xC0C0C0
Lime = 0x00FF00
Gray = 0x808080
Olive = 0x800080
White = 0xFFFFFF
Yellow = 0x00FFFF
Maroon = 0x000080
Navy = 0x800000
Red = 0x0000FF
Blue = 0xFF0000
Purple = 0x800080
Teal = 0x808000
Fuchsia = 0xFF00FF
Aqua = 0xFFFF00

Gui, Margin, 10, 10
Gui, Font, s12
Gui, Color, Black
Gui, Add, Text, vTXT1 HwndTX1ID w300, Ein wenig Text`nmit farbigem Hintergrund.
Control_Colors("TXT1", "Set", Teal, White)
Gui, Add, CheckBox, HwndCB1ID wp vCB1 gCB1Clicked, Und hier eine Checkbox.
Control_Colors("CB1", "Set", Silver)
Gui, Add, Radio, HwndRB1ID xp y+0 wp vRB1 gRB1Clicked, Radiobutton als Checkbox
RB1 := False
Control_Colors("RB1", "Set", Silver)
Gui, Add, Edit, vROED1 HwndED1ID ReadOnly wp, Das ist ein Readonly Edit!
Control_Colors("ROED1", "Set", Red, Yellow)
Gui, Add, Text, vDTXT1 HwndTX2ID Disabled wp, Dieser Text ist disabled.
Control_Colors("DTXT1", "Set", Maroon, Black)
Gui, Add, Edit, vED1 HwndED2ID r2 wp, Das ist ein normales Edit!
Control_Colors("ED1", "Set", Navy, White)
Gui, Add, Button, vBTChange gBTChange wp, Einmal Farben wechseln

Gui, +LastFound
GuiID := WinExist()
Control_Colors(GuiID, "RCB", 0, 0)

Gui, Show, , Colors

Return

GuiEscape:
GuiClose:
ExitApp

BTChange:
Control_Colors(TX1ID, "Set", Red, Teal)
Control_Colors(ED1ID, "Set", Maroon, Yellow)
Control_Colors(TX2ID, "Set", Aqua, White)
Control_Colors(ED2ID, "Set", Silver, Navy)
Gui, +LastFound
WinSet, Redraw
GuiControl, Hide, BTChange
Gui, Show, AutoSize
Return

CB1Clicked:
GuiControlGet, CB1
Control_Colors(CB1ID, "Set", (CB1 ? Yellow : Silver))
WinSet, Redraw, , ahk_id %CB1ID%
Return

RB1Clicked:
RB1 ^= True
Control_Colors(RB1ID, "Set", (RB1 ? Green : Silver))
WinSet, Redraw, , ahk_id %RB1ID%
GuiControl, , RB1, %RB1%
Return

Control_Colors(Hwnd, Msg, wParam, lParam = 0)
{
   Critical

   If !(Hwnd+0) {
     GuiControlGet, nHwnd, Hwnd, %Hwnd%
     Hwnd := nhwnd
   }

   Static OldWinProc := ""          ; Ursprüngliche Fensterprozedur
   Static NewWinProc := ""          ; Neue Fensterprozedur
   Static SetValue := "Set"         ; Werte übernehmen
   Static Register := "RCB"         ; RegisterCallBack
   Static ValueList := ""           ; WerteListe

   ; Aufruf als Fensterprozedur?
   If (A_EventInfo <> NewWinProc) {
      If (Msg = SetValue) {
         If (RegExMatch(ValueList, "m)^" . (Hwnd +0) . "\|")) {
            ValueList := RegExReplace(ValueList
                                     , "m)^" . (Hwnd + 0) . "\|.*$"
                                     , (Hwnd + 0) . "|"
                                     . (wParam + 0) . "|"
                                     . (lParam + 0))
         } Else {
            ValueList .= (Hwnd + 0) . "|"
                      .  (wParam + 0) . "|"
                      .  (lParam + 0) .  "`r`n"
         }
         Return
      }
      If (Msg = Register) {
         If (NewWinProc = "") {
            NewWinProc := RegisterCallback("Control_Colors","",4)
            OldWinProc := DllCall("SetWindowLong"
                                 , UInt, Hwnd
                                 , Int, -4
                                 , Int, NewWinProc
                                 , UInt)
         }
         Return
      }
      Return
   }
   ; 0x0133 : WM_CTLCOLOREDIT
   ; 0x0138 : WM_CTLCOLORSTATIC
   If (Msg = 0x0133 Or Msg = 0x0135 Or Msg = 0x0138) {
      If (RegExMatch(ValueList, "m)^"
                     . (lParam + 0) . "\|(?P<BG>\d+)\|(?P<TX>\d+)$"
                     , C)) {
         DllCall("SetTextColor", UInt, wParam, UInt, CTX)
         DllCall("SetBkColor", UInt, wParam, UInt, CBG)
         Return, DllCall("CreateSolidBrush", UInt, CBG)
      }
   }
   Return DllCall("CallWindowProcA"
                  , UInt, OldWinProc
                  , UInt, Hwnd
                  , UInt, Msg
                  , UInt, wParam
                  , UInt, lParam)
}


grüße
derRaphael
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
denick



Anmeldedatum: 15.09.2006
Beiträge: 1088
Wohnort: Berlin

BeitragVerfasst am: Fr Feb 22, 2008 8:01 am    Titel: Antworten mit Zitat

Moin DerRaphael,

danke für die Blumen, aber wie gesagt, ohne Deinen Ansatz wäre ich nie auf diese Lösung gekommen. Ich hatte auch die Hilfe zu RegisterCallBack nur kurz überflogen, weil ich dachte, ich würde das kaum anwenden können.

Die Erweiterung auf die Guivariablen ist gut. Hast Du mal mit den Radios/Checkboxen experimentiert? Als ich anfing, mich mit der Textfarbe zu beschäftigen, habe ich einfach einen SetTextColor Aufruf mit einer konstanten Farbe (weiß) eingefügt. Ich bilde mir ein, irgendwann auf einem der beteiligten Rechner auch weißen Text in diesen Controls gesehen zu haben. Nachdem ich das Skript dann auf die Verwaltung variabler Farben umgestellt hatte, ist mir das allerdings nicht mehr gelungen. Vielleicht ist die "Erinnerung" ja auch nur einem Wunsch entsprungen.

Noch etwas, Du hast ja wahrscheinlich schon selbst bemerkt, wie in diesem Forum die Suchfunktion genutzt wird. Könntest Du den Titel des Threads in "Farbige Controls ..." oder so ähnlich ändern? Vielleicht wird er dann öfter gefunden.

Grüße!
_________________
Hilfe zur Hilfe

(de)nick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DerRaphael



Anmeldedatum: 09.01.2008
Beiträge: 834
Wohnort: Zuhause

BeitragVerfasst am: So Feb 24, 2008 7:36 am    Titel: Antworten mit Zitat

Wenn du nichts gegen hast, würde ich gerne das letzte Skript oben in den ersten Post setzen.

grüße
derRaphael
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
denick



Anmeldedatum: 15.09.2006
Beiträge: 1088
Wohnort: Berlin

BeitragVerfasst am: So Feb 24, 2008 8:09 am    Titel: Antworten mit Zitat

Moin, do it!
_________________
Hilfe zur Hilfe

(de)nick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
BoBo¨
Gast





BeitragVerfasst am: Do März 06, 2008 1:01 pm    Titel: Antworten mit Zitat

Ähm, ... ließen sich mit Euren Methoden evtl. die (Text)Einträge einer ComboBox gezielt färben?

So das der Eintrag 'red' in roter Schrift, 'green' in grüner Schrift, ...
Zitat:
Gui, Add, ComboBox, , red||green|blue


Wäre der Hammer! Cool
Nach oben
DerRaphael



Anmeldedatum: 09.01.2008
Beiträge: 834
Wohnort: Zuhause

BeitragVerfasst am: Sa März 08, 2008 5:54 pm    Titel: Antworten mit Zitat

BoBo¨ hat Folgendes geschrieben:
Ähm, ... ließen sich mit Euren Methoden evtl. die (Text)Einträge einer ComboBox gezielt färben?

So das der Eintrag 'red' in roter Schrift, 'green' in grüner Schrift, ...
Zitat:
Gui, Add, ComboBox, , red||green|blue


Wäre der Hammer! Cool


hmmm .... so einfach geht das leider das nicht mit den hier vorgestellten methoden.

um bunte einträge in einer combobox zu erzeugen müsste man statt der ahk standard combobox control eine comboboxex control einbinden. da kann man dann auch icons und derlei mehr darstellen, jedoch müsste man erstmal alle prototypen (additem, selectitem, deleteitem, modifyitem etc) und ein messagehandling dafür schreiben.

grüße
derRaphael
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Goofy



Anmeldedatum: 04.11.2006
Beiträge: 20

BeitragVerfasst am: Mi März 12, 2008 11:37 am    Titel: Antworten mit Zitat

Hallo
Ich bin begeistert.
Doch leider habe ich ein Problem. Ich nutze die Funktion bei einem Edit.
Dieser wird mit der Zeit immer weiter mit Daten gefüllt, und immer am unteren Ende gehalten( mittels ^End ). Nach einiger Zeit, bricht der Text aus (Ghost-Fenster) und das Paint-Event scheint nicht mehr an die anderen Fenster weitergeleited zu werden.

Ein Idee?
Danke
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
DerRaphael



Anmeldedatum: 09.01.2008
Beiträge: 834
Wohnort: Zuhause

BeitragVerfasst am: Mi März 12, 2008 1:28 pm    Titel: Antworten mit Zitat

poste mal deinen quelltext in die hilfe sektion .... da nehmen wir den auseinander und setzen ihn neu zusammen, so dass zumschluss dein skript macht, was du wolltest

grüße
derRaphael
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
denick



Anmeldedatum: 15.09.2006
Beiträge: 1088
Wohnort: Berlin

BeitragVerfasst am: Sa Apr 26, 2008 11:26 am    Titel: "Farbige" Buttons Antworten mit Zitat

Moin,

ich habe mich wegen Arrow da mal wieder mit "farbigen" Buttons beschäftigt. Nach einigem Rumprobieren habe ich jetzt eine stabile und wenig aufwändige Lösung für die farbige Beschriftung der Knöpfe durch Überlagerung mit einem BackgroundTrans Textcontrol gefunden:

EDIT:

Erst mal wieder gecancelt! War doch nicht so stabil, wie ich dachte, der Fehler hatte sich nur verlagert. Irgendwie machen die Buttons immer mal wieder einen Refresh, den ich nicht in den Griff bekomme.
_________________
Hilfe zur Hilfe

(de)nick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
denick



Anmeldedatum: 15.09.2006
Beiträge: 1088
Wohnort: Berlin

BeitragVerfasst am: So Jun 01, 2008 11:11 am    Titel: "Farbige" Buttons Antworten mit Zitat

Moin,

so, ich habe mal wieder etwas Zeit damit verbracht und mit Hilfe von WinSpector herausgefunden, dass Buttons zwei höchstinteressante Nachrichten an das "Mutterfenster" senden:
1. per WM_NOTIFY, wenn die Maus in den Bereich eines Buttons eintritt oder ihn verlässt,
2. per WM_COMMAND, wenn der Button geklickt wird.

Durch abfangen dieser Meldungen scheint man jede Veränderung des Buttons und das damit verbundene Redraw rechtzeitig mitzubekommen und kann mit einem Redraw des darüberliegenden Textcontrols reagieren. Selbst MsgBox'en und Menu's, die mir lange zu schaffen gemacht haben, lassen sich so (anscheinend) zuverlässig austricksen.

Deshalb mal wieder ein Versuch:
Code:
#NoEnv
WM_COMMAND := 0x111
WM_NOTIFY := 0x4E
; Ein Menü
Menu, Menü, Add, Eins, MENÜ
Menu, Menü, Add
Menu, Menü, Add, Zwei, MENÜ
; Eine Gui
Gui, Margin, 20, 20
Gui, Font, s10 cBlue
Gui, Add, Edit
   , w400 r10 vED1 Readonly
Gui, Add, Button
   , w400 hwndBTID gBTSTART vBTSTART Default, Start
Gui, Add, Text
   , xp yp wp hp hwndTXID cGreen BackgroundTrans Center 0x200, Start
%BTID% := TXID
Gui, Add, Button
   , w400 hwndBTID gBTSTOP vBTSTOP Disabled, Stop
Gui, Add, Text
   , xp yp wp hp hwndTXID cRed BackgroundTrans center 0x200, Stop
%BTID% := TXID
Gui, Add, Button
   , w400 gBTLANGWEILER, Langweiler
Gui, Show, , "Farbige" Buttons
; Nachrichtenbehandlung
OnMessage(WM_COMMAND, "WM_COMMAND")
OnMessage(WM_NOTIFY, "WM_NOTIFY")
Return
; ------------------------------------------------------------------------------
GuiClose:
GuiEscape:
ExitApp
; ------------------------------------------------------------------------------
MENÜ:
MsgBox, %A_ThisMenuItem%
Return
; ------------------------------------------------------------------------------
BTSTART:
GuiControl, -Readonly, ED1
GuiControl, , ED1
GuiControl, Disable, BTSTART
GuiControl, Enable, BTSTOP
MsgBox, Hallo!
Return
; ------------------------------------------------------------------------------
BTSTOP:
GuiControl, +Readonly, ED1
GuiControl, Enable, BTSTART
GuiControl, Disable, BTSTOP
Menu, Menü, Show
Return
BTLANGWEILER:
MsgBox, Na und nu?
Return
; ------------------------------------------------------------------------------
; Die Maus kommt in den Buttonbereich oder verlässt ihn
WM_NOTIFY(W, L)
{
   Global
   SetFormat, Integer, H
   ID := NumGet(L+0)
   If (%ID%) {
      WinSet, Redraw, , % "ahk_id " . %ID%
   }
}
; ------------------------------------------------------------------------------
; Ein Button wurde angeklickt
WM_COMMAND(W, L)
{
   Global
   SetFormat, Integer, H
   L += 0
   If (%L%) {
      WinSet, Redraw, , % "ahk_id " . %L%
   }
}
; ------------------------------------------------------------------------------

_________________
Hilfe zur Hilfe

(de)nick
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
quantum



Anmeldedatum: 19.06.2008
Beiträge: 29

BeitragVerfasst am: Fr Jun 27, 2008 1:01 am    Titel: Antworten mit Zitat

denick hat Folgendes geschrieben:

Code:
#NoEnv
; Beispiel für farbigen Hintergund für verschiedene Controls
; basierend auf dem RCB Beispiel aus der Hilfe

; Abriss: Funktioniert durch eine Umlenkung der CallWindowProc zu einer Funktion
;         innerhalb des Skripts. Anschließend wird der Abruf zu der eigentlichen
;         Adresse weitergeleitet.

; HTML Colors im BGR-Format
Black = 0x000000
Green = 0x008000
Silver = 0xC0C0C0
Lime = 0x00FF00
Gray = 0x808080
Olive = 0x800080
White = 0xFFFFFF
Yellow = 0x00FFFF
Maroon = 0x000080
Navy = 0x800000
Red = 0x0000FF
Blue = 0xFF0000
Purple = 0x800080
Teal = 0x808000
Fuchsia = 0xFF00FF
Aqua = 0xFFFF00

Gui, Margin, 10, 10
Gui, Font, s12
Gui, Color, Black
Gui, Add, Text, HwndTX1ID w300, Ein wenig Text`nmit farbigem Hintergrund.
Control_Colors(TX1ID, "Set", Teal, White)
Gui, Add, CheckBox, HwndCB1ID wp vCB1 gCB1Clicked, Und hier eine Checkbox.
Control_Colors(CB1ID, "Set", Silver)
Gui, Add, Radio, HwndRB1ID xp y+0 wp vRB1 gRB1Clicked, Radiobutton als Checkbox
RB1 := False
Control_Colors(RB1ID, "Set", Silver)
Gui, Add, Edit, HwndED1ID ReadOnly wp, Das ist ein Readonly Edit!
Control_Colors(ED1ID, "Set", Red, Yellow)
Gui, Add, Text, HwndTX2ID Disabled wp, Dieser Text ist disabled.
Control_Colors(TX2ID, "Set", Maroon, Black)
Gui, Add, Edit, HwndED2ID r2 wp, Das ist ein normales Edit!
Control_Colors(ED2ID, "Set", Navy, White)
Gui, Add, Button, vBTChange gBTChange wp, Einmal Farben wechseln

Gui, +LastFound
GuiID := WinExist()
Control_Colors(GuiID, "RCB", 0, 0)

Gui, Show, , Colors

Return

GuiEscape:
GuiClose:
ExitApp

BTChange:
Control_Colors(TX1ID, "Set", Red, Teal)
Control_Colors(ED1ID, "Set", Maroon, Yellow)
Control_Colors(TX2ID, "Set", Aqua, White)
Control_Colors(ED2ID, "Set", Silver, Navy)
Gui, +LastFound
WinSet, Redraw
GuiControl, Hide, BTChange
Gui, Show, AutoSize
Return

CB1Clicked:
GuiControlGet, CB1
Control_Colors(CB1ID, "Set", (CB1 ? Yellow : Silver))
WinSet, Redraw, , ahk_id %CB1ID%
Return

RB1Clicked:
RB1 ^= True
Control_Colors(RB1ID, "Set", (RB1 ? Green : Silver))
WinSet, Redraw, , ahk_id %RB1ID%
GuiControl, , RB1, %RB1%
Return

Control_Colors(Hwnd, Msg, wParam, lParam = 0)
{
   Critical
   Static OldWinProc := ""          ; Ursprüngliche Fensterprozedur
   Static NewWinProc := ""          ; Neue Fensterprozedur
   Static SetValue := "Set"         ; Werte übernehmen
   Static Register := "RCB"         ; RegisterCallBack
   Static ValueList := ""           ; WerteListe

   ; Aufruf als Fensterprozedur?
   If (A_EventInfo <> NewWinProc) {
      If (Msg = SetValue) {
         If (RegExMatch(ValueList, "m)^" . (Hwnd +0) . "\|")) {
            ValueList := RegExReplace(ValueList
                                     , "m)^" . (Hwnd + 0) . "\|.*$"
                                     , (Hwnd + 0) . "|"
                                     . (wParam + 0) . "|"
                                     . (lParam + 0))
         } Else {
            ValueList .= (Hwnd + 0) . "|"
                      .  (wParam + 0) . "|"
                      .  (lParam + 0) .  "`r`n"
         }
         Return
      }
      If (Msg = Register) {
         If (NewWinProc = "") {
            NewWinProc := RegisterCallback("Control_Colors","",4)
            OldWinProc := DllCall("SetWindowLong"
                                 , UInt, Hwnd
                                 , Int, -4
                                 , Int, NewWinProc
                                 , UInt)
         }
         Return
      }
      Return
   }
   ; 0x0133 : WM_CTLCOLOREDIT
   ; 0x0138 : WM_CTLCOLORSTATIC
   If (Msg = 0x0133 Or Msg = 0x0135 Or Msg = 0x0138) {
      If (RegExMatch(ValueList, "m)^"
                     . (lParam + 0) . "\|(?P<BG>\d+)\|(?P<TX>\d+)$"
                     , C)) {
         DllCall("SetTextColor", UInt, wParam, UInt, CTX)
         DllCall("SetBkColor", UInt, wParam, UInt, CBG)
         Return, DllCall("CreateSolidBrush", UInt, CBG)
      }
   }
   Return DllCall("CallWindowProcA"
                  , UInt, OldWinProc
                  , UInt, Hwnd
                  , UInt, Msg
                  , UInt, wParam
                  , UInt, lParam)
}


Hallo de(nick),

Klasse Sache. Habe es gerade in mein Script, bei dem du mir so toll geholfen hast eingebaut. Brauche aber mal wieder deine geschätzte Hilfe.

Ich will damit das Ausgabe Edit Feld je nach Ergebnis der Abfrage mit einem anderen Hintergrund versehen. Hierzu habe ich eine If Else Abfrage für das betreffenden Edit Feld eingebaut.

Wenn ich die If Abfrage manuell teste, also ohne ohne die Berechnungsfunktion, funktioniert das einwandfrei. Wenn ich es aber hier im Script benutze funzt es nicht und er nimmt immer
die, die als letzes in der If Abfrage steht.

Was mache ich verkehrt?

Code:
#NoEnv

; HTML Colors im BGR-Format
Black = 0x000000
Green = 0x008000
Silver = 0xC0C0C0
Lime = 0x00FF00
Gray = 0x808080
Olive = 0x800080
White = 0xFFFFFF
Yellow = 0x00FFFF
Maroon = 0x000080
Navy = 0x800000
Red = 0x0000FF
Blue = 0xFF0000
Purple = 0x800080
Teal = 0x808000
Fuchsia = 0xFF00FF
Aqua = 0xFFFF00


; Du kannst die Treffer auch so im Skript verankern. Wenn es allerdings
; haüfige Änderungen gibt, kannst Du das auch einfach in eine Datei schreiben,
; die dann mit FileRead, Treffer, MeineDatei.txt eingelesen wird.
Treffer =
(
1|A|rot|10|W=Montag
2|B|blau|20|X=Dienstag
3|C|grün|30|Y=Mittwoch
4|D|rot|40|Z=Donnerstag
5|E|blau|50|W=Freitag
)
; Weil Du für die Farben Radios willst, solltest Du auch sie in Variablen
; ablegen
Farbe1 := "rot"
Farbe2 := "blau"
Farbe3 := "grün"

Gui, Font, S9 CDefault, Verdana
; Texte und Buttons
Gui, Add, Text, x6 y6 w100 h20 , Eingabebereich
Gui, Add, Text, x6 y40 w50 h20 , Wert 1
Gui, Add, Text, x176 y40 w50 h20 , Wert 2
Gui, Add, Text, x6 y80 w50 h20 , Wert 3
Gui, Add, Text, x6 y120 w50 h20 , Wert 4
Gui, Add, Text, x176 y120 w50 h20 , Wert 5
Gui, Add, Button, x6 y160 w90 h30 gBerechnen, Berechnen
Gui, Add, Text, x110 y168 w110 h20 , Ergebnisausgabe
Gui, Add, Button, x6 y210 w90 h30 gReset, Reset
Gui, Add, Button, x239 y210 w90 h30 gBeenden, Beenden

; Eingabe Felder
; Allen Eingabefeldern sollten Veriablen zugewiesen werden, das macht das Leben
; leichter. Für die Vorauswahl in DDLs hängst Du || an den Eintrag an.
Gui, Add, DropDownList, x66 y35 w90 h200 vDDL1 , 1||2|3|4|5|6|7|8|9|10
Gui, Add, DropDownList, x236 y35 w90 h200 vDDL2, A||B|C|D|E|F|G|H|I|J
; Wenn den Radios einer Gruppe nur eine Variable zugewiesen wird, wird in ihr
; die Nummer des ausgewählten Radios abgelegt (1|2|3)
Gui, Add, Radio, x66 y72 w50 h30 +Checked vRBG, %Farbe1%
Gui, Add, Radio, x116 y72 w50 h30, %Farbe2%
Gui, Add, Radio, x176 y72 w50 h30, %Farbe3%
Gui, Add, DropDownList, x66 y115 w90 h150 vDDL3, 10||20|30|40|50|60
Gui, Add, DropDownList, x236 y115 w90 h100 vDDL4, W||X|Y|Z


; Hier im Anschluss habe ich eine If Abfrage für das Ausgabefeld gemacht,
; so das der Hintergrund des Edit-Feldes je nach Ergebnis der Berechnung
; ein anderer ist.

; Wenn ich es ohne die Berechnungsfunktion mache, funktioniert die Abfrage.
; Wenn ich es aber hier im Script benutze funzt es nicht und er nimmt immer
; die, die als letzes in der If Abfrage steht.

; Was mache ich verkehrt?

; Beginn Ausgabefeld

Ausgabe = %Ausgabe%
if (Ausgabe = "Montag" or Ausgabe = "Dienstag")
{
    Gui, Add, Edit, x236 y165 w90 h20 HwndED1ID +ReadOnly vAusgabe,
    Control_Colors(ED1ID, "Set", Yellow, Red)
}
else if (Ausgabe = "Mittwoch" or Ausgabe = "Donnerstag")
{
    Gui, Add, Edit, x236 y165 w90 h20 HwndED2ID +ReadOnly vAusgabe,
    Control_Colors(ED2ID, "Set", Aqua, Black)
}
else if (Ausgabe = "Freitag")
{
    Gui, Add, Edit, x236 y165 w90 h20 HwndED3ID +ReadOnly vAusgabe,
    Control_Colors(ED3ID, "Set", White, Gray)
}
else
{
    Gui, Add, Edit, x236 y165 w90 h20 HwndED4ID +ReadOnly vAusgabe,
    Control_Colors(ED4ID, "Set", Silver, Blue)
}
; Ende Ausgabefeld


Gui, +LastFound
GuiID := WinExist()
Control_Colors(GuiID, "RCB", 0, 0)

Gui, Show, x541 y328 h253 w335, Quantums Test Rechner
Return

; Berechnungbereich
Berechnen:
Gui, Submit, Nohide
Farbe := Farbe%RBG%
Eingabe = %DDL1%|%DDL2%|%Farbe%|%DDL3%|%DDL4%
; Standardausgabe
Ausgabe = Unbekannt!
Loop, Parse, Treffer, `n, `r
{
   StringSplit, T, A_LoopField, =
   If Eingabe = %T1%
   {
      Ausgabe = %T2%
      Break
   }
}
GuiControl, ,Ausgabe, %Ausgabe%
Return


; Zurücksetzen
Reset:
; Die jeweils ersten Einträge werden aktiviert
GuiControl, Choose, DDL1, 1
GuiControl, Choose, DDL2, 1
GuiControl, , RBG, 1
GuiControl, Choose, DDL3, 1
GuiControl, Choose, DDL4, 1
GuiControl, , Ausgabe
Return


; Beenden
Beenden:
GuiClose:
ExitApp

BTChange:
Control_Colors(TX1ID, "Set", Red, Teal)
Control_Colors(ED1ID, "Set", Maroon, Yellow)
Control_Colors(TX2ID, "Set", Aqua, White)
Control_Colors(ED2ID, "Set", Silver, Navy)
Gui, +LastFound
WinSet, Redraw
GuiControl, Hide, BTChange
Gui, Show, AutoSize
Return

CB1Clicked:
GuiControlGet, CB1
Control_Colors(CB1ID, "Set", (CB1 ? Yellow : Silver))
WinSet, Redraw, , ahk_id %CB1ID%
Return

RB1Clicked:
RB1 ^= True
Control_Colors(RB1ID, "Set", (RB1 ? Green : Silver))
WinSet, Redraw, , ahk_id %RB1ID%
GuiControl, , RB1, %RB1%
Return

Control_Colors(Hwnd, Msg, wParam, lParam = 0)
{
   Critical
   Static OldWinProc := ""          ; Ursprüngliche Fensterprozedur
   Static NewWinProc := ""          ; Neue Fensterprozedur
   Static SetValue := "Set"         ; Werte übernehmen
   Static Register := "RCB"         ; RegisterCallBack
   Static ValueList := ""           ; WerteListe

   ; Aufruf als Fensterprozedur?
   If (A_EventInfo <> NewWinProc) {
      If (Msg = SetValue) {
         If (RegExMatch(ValueList, "m)^" . (Hwnd +0) . "\|")) {
            ValueList := RegExReplace(ValueList
                                     , "m)^" . (Hwnd + 0) . "\|.*$"
                                     , (Hwnd + 0) . "|"
                                     . (wParam + 0) . "|"
                                     . (lParam + 0))
         } Else {
            ValueList .= (Hwnd + 0) . "|"
                      .  (wParam + 0) . "|"
                      .  (lParam + 0) .  "`r`n"
         }
         Return
      }
      If (Msg = Register) {
         If (NewWinProc = "") {
            NewWinProc := RegisterCallback("Control_Colors","",4)
            OldWinProc := DllCall("SetWindowLong"
                                 , UInt, Hwnd
                                 , Int, -4
                                 , Int, NewWinProc
                                 , UInt)
         }
         Return
      }
      Return
   }
   ; 0x0133 : WM_CTLCOLOREDIT
   ; 0x0138 : WM_CTLCOLORSTATIC
   If (Msg = 0x0133 Or Msg = 0x0135 Or Msg = 0x0138) {
      If (RegExMatch(ValueList, "m)^"
                     . (lParam + 0) . "\|(?P<BG>\d+)\|(?P<TX>\d+)$"
                     , C)) {
         DllCall("SetTextColor", UInt, wParam, UInt, CTX)
         DllCall("SetBkColor", UInt, wParam, UInt, CBG)
         Return, DllCall("CreateSolidBrush", UInt, CBG)
      }
   }
   Return DllCall("CallWindowProcA"
                  , UInt, OldWinProc
                  , UInt, Hwnd
                  , UInt, Msg
                  , UInt, wParam
                  , UInt, lParam)
}


Kannst du mir bitte helfen?

Vielen Dank

Gruss, Quantum
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    AutoHotkey Community Foren-Übersicht -> Skripte & Funktionen Alle Zeiten sind GMT
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de