 |
AutoHotkey Community Wir helfen uns gegenseitig aus der Patsche
|
| Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
| Autor |
Nachricht |
DerRaphael
Anmeldedatum: 09.01.2008 Beiträge: 834 Wohnort: Zuhause
|
Verfasst am: Mo Feb 18, 2008 10:05 pm Titel: Farbige Controls (keine Bitmap) |
|
|
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 |
|
 |
denick
Anmeldedatum: 15.09.2006 Beiträge: 1088 Wohnort: Berlin
|
Verfasst am: Do Feb 21, 2008 12:17 pm Titel: |
|
|
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 |
|
 |
BoBo¨ Gast
|
Verfasst am: Do Feb 21, 2008 12:47 pm Titel: |
|
|
R E S P E K T ! (Euch darf man auch keine 5 Minuten alleine lassen ) |
|
| Nach oben |
|
 |
DerRaphael
Anmeldedatum: 09.01.2008 Beiträge: 834 Wohnort: Zuhause
|
Verfasst am: Do Feb 21, 2008 2:13 pm Titel: |
|
|
denick, ich habe es jetzt erst entdeckt, und ich finde es großartig!!!
danke für diese erweiterung
grüße
derRaphael _________________
|
|
| Nach oben |
|
 |
DerRaphael
Anmeldedatum: 09.01.2008 Beiträge: 834 Wohnort: Zuhause
|
Verfasst am: Do Feb 21, 2008 3:02 pm Titel: |
|
|
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 |
|
 |
denick
Anmeldedatum: 15.09.2006 Beiträge: 1088 Wohnort: Berlin
|
Verfasst am: Fr Feb 22, 2008 8:01 am Titel: |
|
|
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 |
|
 |
DerRaphael
Anmeldedatum: 09.01.2008 Beiträge: 834 Wohnort: Zuhause
|
Verfasst am: So Feb 24, 2008 7:36 am Titel: |
|
|
Wenn du nichts gegen hast, würde ich gerne das letzte Skript oben in den ersten Post setzen.
grüße
derRaphael _________________
|
|
| Nach oben |
|
 |
denick
Anmeldedatum: 15.09.2006 Beiträge: 1088 Wohnort: Berlin
|
Verfasst am: So Feb 24, 2008 8:09 am Titel: |
|
|
Moin, do it! _________________ Hilfe zur Hilfe
(de)nick |
|
| Nach oben |
|
 |
BoBo¨ Gast
|
Verfasst am: Do März 06, 2008 1:01 pm Titel: |
|
|
Ä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!  |
|
| Nach oben |
|
 |
DerRaphael
Anmeldedatum: 09.01.2008 Beiträge: 834 Wohnort: Zuhause
|
Verfasst am: Sa März 08, 2008 5:54 pm Titel: |
|
|
| 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!  |
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 |
|
 |
Goofy
Anmeldedatum: 04.11.2006 Beiträge: 20
|
Verfasst am: Mi März 12, 2008 11:37 am Titel: |
|
|
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 |
|
 |
DerRaphael
Anmeldedatum: 09.01.2008 Beiträge: 834 Wohnort: Zuhause
|
Verfasst am: Mi März 12, 2008 1:28 pm Titel: |
|
|
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 |
|
 |
denick
Anmeldedatum: 15.09.2006 Beiträge: 1088 Wohnort: Berlin
|
Verfasst am: Sa Apr 26, 2008 11:26 am Titel: "Farbige" Buttons |
|
|
Moin,
ich habe mich wegen 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 |
|
 |
denick
Anmeldedatum: 15.09.2006 Beiträge: 1088 Wohnort: Berlin
|
Verfasst am: So Jun 01, 2008 11:11 am Titel: "Farbige" Buttons |
|
|
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 |
|
 |
quantum
Anmeldedatum: 19.06.2008 Beiträge: 29
|
Verfasst am: Fr Jun 27, 2008 1:01 am Titel: |
|
|
| 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 |
|
 |
|
|
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
|