Beiträge von BugFix
-
-
[autoit]
Func __o_StartUp($hG)
[/autoit]
Local $aParameters = _($oGraph.StartUp_Parameters)
_GDIPlus_Startup()
Global $hGraphic = _GDIPlus_GraphicsCreateFromHWND($aParameters[1])
Global $hBitmap = _GDIPlus_BitmapCreateFromGraphics($Width, $Height, $hGraphic)
Global $hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap)
EndFuncNa, die 3 Globalen Variablen hast du doch bereits am Skriptanfang deklariert! Hier dann nur den Wert zuweisen, ohne "Global".

-
-
-
Hi,
ich habe gerade mit der AutoitObject UDF ein Problem.
Ich möchte ByRef-Parameter in einer Methode einsetzen. Innerhalb der Methode funktioniert das noch ordentlich, aber die ByRef-Variable selbst wird nicht geändert obwohl der ByRef-Parameter im Aufruf (der ja nur einen Verweis auf die ByRef-Variable darstellt) den richtigen Wert annimmt.
Wo hängt der Hammer? :wacko:Edit: Habe es jetzt parallel im EN-Forum gepostet.
Spoiler anzeigen
[autoit]#include <AutoItObject.au3>
[/autoit] [autoit][/autoit] [autoit]_AutoItObject_Startup()
[/autoit] [autoit][/autoit] [autoit]; == Problematik:
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
; Eine unveränderliche Funktion ("_SomeFunc") soll über ein Objekt für diese Funktion aufrufbar sein.
; Die Funktion kann ByRef-Parameter enthalten. Die ByRef-Funktionalität muss gewährleistet bleiben.$oTest = _CreateObjFunc('Test')
[/autoit] [autoit][/autoit] [autoit]$a1 = 5
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite('Return Methode = ' & $oTest.Meth($a1, 3, 5) & ' [OK]' & @LF)
ConsoleWrite('ByRef "$a1" nach Aufruf = ' & $a1 & ' [FALSCH]' & @LF) ; == obwohl Parameter $a1 in der Methode geändert wurde bleibt $a1 unverändert im Wert;------------------------------------- OBJECT ------------------------------------------------------
[/autoit] [autoit][/autoit] [autoit]
Func _CreateObjFunc($_sName)
Local $oSelf = _AutoItObject_Create()
_AutoItObject_AddMethod($oSelf, 'Meth', "_Meth")
Return $oSelf
EndFuncFunc _Meth(ByRef $oSelf, ByRef $A, $B=1, $C=1)
[/autoit] [autoit][/autoit] [autoit]
Local $vRet = _SomeFunc($A, $B, $C) ; == $A ist ByRef
Local $iErr = @error
ConsoleWrite('ByRef "$A" in Methode = ' & $A & ' [OK]' & @LF) ; == $A wurde ByRef geändert -- OK
Return SetError($iErr,0,$vRet)
EndFunc
;---------------------------------------------------------------------------------------------------Func _SomeFunc(ByRef $A, $B=1, $C=1)
[/autoit]
$A += $B + $C
Return $A
EndFunc -
Anscheinend wurde das in dieser Excel-Sheet so definiert oder was auch immer, aber definitv benutzt werden weniger.
Eventuell sind ja bis an das Ende Formeln kopiert? Dann ist die Zelle auch nicht leer, also "used". -
Hast du meine Beiträge überhaupt gelesen
Selbstverständlich.
Und nachdem er das Skript postete hast du gesagt, dass Global nicht nötig sei und nicht verwendet werden sollte. Dann hättest du konsequenterweise auch sagen müssen, dass er keinerlei Variablen im Hauptskript verwenden soll (da undeklariert auch Global)
-- Denn genau das ist die logische Konsequenz deiner Aussage in Bezug auf das gezeigte Skript. 
-
Da ich das Thema gerade in einem Thread wieder entdeckt hatte hier mal ein Weg, wie man Variablen in lokalem Namensraum ablegen kann und doch Globalen Zugriff erlangt.
Inwiefern es wirklich sinnvoll ist Globale Variablen zu meiden sei mal völlig dahingestellt. Dazu wurden schon Diskussionen ergebnisoffen im EN-Forum geführt.Das Bsp. ist denke ich selbsterklärend:
Spoiler anzeigen
[autoit]_A(2,3) ; = Summe + 6
[/autoit] [autoit][/autoit] [autoit]
_A(4,4) ; = Summe + 16
_A(5,4) ; = Summe + 20
ConsoleWrite('Summe: ' & _ManageVars('Summe') & @LF)
_B(5,3) ; = Summe + 2
_B(12,3) ; = Summe + 9
ConsoleWrite('Summe: ' & _ManageVars('Summe') & @LF)Func _A($a, $b)
[/autoit] [autoit][/autoit] [autoit]
Local $Summe = _ManageVars('Summe') ; == Wert abfragen
If @error Then ; == $Summe wurde noch nicht verwendet - noch ohne Wert
_ManageVars('Summe', False, $a * $b) ; == Wert setzen
Else
_ManageVars('Summe', False, $Summe + $a * $b)
EndIf
EndFuncFunc _B($a, $b)
[/autoit] [autoit][/autoit] [autoit]
Local $Summe = _ManageVars('Summe')
If @error Then
_ManageVars('Summe', False, $a - $b)
Else
_ManageVars('Summe', False, $Summe + ($a - $b))
EndIf
EndFunc;===============================================================================
[/autoit]
; Function Name....: _ManageVars
; Description......: Verwaltung von global anwendbaren Variablen in Lokalem Namespace
; Parameter(s).....: $_sVar Variablenname (mit oder ohne "$")
; .................: $_fGet "True" (Standard) fragt Wert ab, "False" um Wert zu setzen
; .................: $_vVal Wenn Wert gesetzt wird, der Variablenwert
; Return Value(s)..: (nur bei Get) Erfolg Der Variablenwert
; .................: Fehler 0 @error=1 angefragte Variable noch nicht hinterlegt
; Author(s)........: BugFix ( [email='bugfix@autoit.de'][/email] )
;===============================================================================
Func _ManageVars($_sVar, $_fGet=True, $_vVal=0)
Local Static $oVars = ObjCreate("Scripting.Dictionary")
If $_fGet Then
If $oVars.Exists($_sVar) Then
Return $oVars.Item($_sVar)
Else
Return SetError(1,0,0)
EndIf
Else
If $oVars.Exists($_sVar) Then
$oVars.Item($_sVar) = $_vVal
Else
$oVars.Add($_sVar, $_vVal)
EndIf
EndIf
EndFunc ;==>_ManageVars -
2. Global ist hier nicht nötig und sollte nicht benutzt werden.
Woraus ziehst du diesen Schluß?
Wenn du in AutoIt eine Variable erstellst ohne speziellen Namespace wird diese automatisch als Global behandelt.Zitat von AutoIt HilfeA variable's scope is controlled by when and how you declare the variable. If you declare a variable at the start of your script and outside any functions it exists in the Global scope
[autoit]
Folgende Situation im Hauptskript ist vom Namensraum daher absolut identisch:
[/autoit]
$Variable1 = "Wert"
Global $Variable2 = "Wert"Ich stimme dir zu, dass die Anwendung Globaler Variablen möglichst minimiert sein soll (wobei die Meinungen dazu auch weit auseinandergehen, ich hatte einen Thread aus dem EN-Forum dazu mal hier im Forum eingebracht). Seit der Möglichkeit mit Static-Variablen zu arbeiten ist dieses auch wesentlich einfacher geworden. Ich habe das z.T. so gelöst, dass ich in einer Verwaltungs-Funktion alle global erforderlichen Variablen statisch lokal ablege und mit entsprechendem Aufrufparameter den Wert einer jeweiligen Variable abfrage oder setze. So kann man die Variablen ausschließlich im Localen Namespace halten und trotzdem im gesamten Skript darauf zugreifen. Wenn das Skript allerdings sehr auf Geschwindigkeit orientiert ist, werden wohl die ms zum Abfragen/Setzen schon wieder zu viel sein.

-
-
Hast du vergessen _GUICtrlListView_Formatting_Startup aufzurufen?
Das Skript läuft problemlos unter XP u. Win7 32/64 Bit. Allerdings könnte es Probleme geben, wenn du es als 64Bit kompilieren willst - das dürfte schief gehen. -
2 Sachen
- kpl. Zeilen in einer Farbe einfärben geht mit nativen Funktionen. ID von GUICtrlCreateListViewItem auffangen und mit GUICtrlSetBkColor einfärben
- sollen einzelne Zellen unterschiedlich gefärbt werden, schau bitte hier -
misterspeed
Deine Lösung hat einen Haken: Du berücksichtigst nicht, dass die Taskbar 4 mögliche Positionen und unterschiedliche Maße haben kann. Hiermit kannst du Position und Maße abfragen.
-
Habe die Includes und die Schleife hinzugefügt.

-
Da hatte ich ein recht umfangreiches Skript fix und fertig, schön mit Rebar gestaltet. Schicke es meinem Kollegen und der fragt was das soll - nur in einer Ecke irgendwelche Button - sonst nix. (Ich habe Win7, er XP) Das habe ich dann mal in VirtualXP angesehen und tatsächlich: _GUICtrlRebar_AddBand() bleibt wirkungslos und somit landen alle Ctrl der Bänder an Pos 0,0 übereinander. :pinch:
Da Programme aber abwärtskompatibel zu XP sein sollten habe ich mir nun eine Rebar optisch nachgebaut (die Funktionalität ist natürlich nicht dabei). Dazu habe ich einfach Groups missbraucht. Man muss sie etwas vergewaltigen um sie dort anzuzeigen wo man will.
Denn die Group behält Platz für Beschriftung vor - ich möchte aber nur die reine Linie anzeigen. Aber schauts euch einfach an.
Das Skript hier verwendet allerdings Pfade für lokale Icondateien, entweder ihr ersetzt das mit eigenen Pfaden oder kommentiert es aus. Ist für die Rebarsimulation aber nicht wichtig.Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. Spoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <ComboConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>$Gui = GUICreate("PB Log-To-Report", 609, 595)
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0xD3DAED)#Region - PseudoRebar
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateGroup('', 0, -7, 609, 34)
GUICtrlCreateLabel('Log-Datei', 16, 6, 80, 17)
$inLog = GUICtrlCreateInput('', 100, 3, 450, 20)
GUICtrlSendMsg($inLog, 0x1501, 0, " Log-Datei mit Button auswählen")
$btLogOpen = GUICtrlCreateButton('', 571, 2, 22, 22, $BS_ICON)
;~ GUICtrlSetImage(-1, $sPath & "log.ico")
GUICtrlSetTip(-1, "Pfad zur Logdatei auswählen")
GUICtrlCreateGroup("", -99, -99, 1, 1)GUICtrlCreateGroup('', 0, 20, 609, 34)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateLabel('Report-Datei', 16, 33, 80, 17)
$inReport = GUICtrlCreateInput('', 100, 31, 450, 20)
GUICtrlSendMsg($inReport, 0x1501, 0, " Speicherort Report-Datei mit Button auswählen")
$btReport = GUICtrlCreateButton('', 571, 30, 22, 22, $BS_ICON)
;~ GUICtrlSetImage(-1, $sPath & "report.ico")
GUICtrlSetTip(-1, "Speicherort für die Reportdatei festlegen")
GUICtrlCreateGroup("", -99, -99, 1, 1)GUICtrlCreateGroup('', 0, 47, 609, 35)
[/autoit] [autoit][/autoit] [autoit]
GUICtrlCreateLabel("Name Patient", 16, 62, 80, 17)
$inName = GUICtrlCreateInput('', 100, 59, 225, 20)
GUICtrlSendMsg($inName, 0x1501, 0, " optional: Patientenname / Identschlüssel")
GUICtrlCreateLabel("Gerät-SN", 335, 62, 60, 17)
$inGeraet = GUICtrlCreateInput('', 395, 59, 155, 20)
$btConfig = GUICtrlCreateButton('', 571, 58, 22, 22, $BS_ICON)
;~ GUICtrlSetImage(-1, $sPath & "config.ico")
GUICtrlSetTip(-1, "Programm Einstellungen")
GUICtrlCreateGroup("", -99, -99, 1, 1)GUICtrlCreateGroup('', 0, 75, 609, 35)
[/autoit] [autoit][/autoit] [autoit]
$btLogfileEvents = GUICtrlCreateButton("Daten Lesen", 16, 86, 82, 22)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xD3DAED)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Nutzungsdaten aus Log-Datei auslesen")
GUICtrlCreateLabel('Datum von', 110, 90, 60, 17)
$cbFrom = GUICtrlCreateCombo("", 170, 86, 155, 22, BitOR($WS_VSCROLL,$CBS_DROPDOWN,$CBS_AUTOHSCROLL))
GUICtrlCreateLabel('Datum bis', 335, 90, 60, 17)
$cbTo = GUICtrlCreateCombo("", 395, 86, 155, 22, BitOR($WS_VSCROLL,$CBS_DROPDOWN,$CBS_AUTOHSCROLL))
$btHelp = GUICtrlCreateButton('', 571, 86, 22, 22, $BS_ICON)
;~ GUICtrlSetImage(-1, $sPath & "help.ico")
GUICtrlSetTip(-1, "Hilfe")
GUICtrlCreateGroup("", -99, -99, 1, 1)GUICtrlCreateGroup('', 0, 103, 609, 35)
[/autoit] [autoit][/autoit] [autoit]
$btRangeSelect = GUICtrlCreateButton("Zeitraum Übernehmen", 16, 114, 130, 22)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xD3DAED)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Detaildaten aus Von-Bis Zeitraum in Tabelle einlesen")
$btClear = GUICtrlCreateButton("Eingaben Löschen", 195, 114, 130, 22)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xD3DAED)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Alle Eingaben löschen")
GUICtrlCreateLabel('Report', 335, 118, 55, 17)
$btPreviewReport = GUICtrlCreateButton("Vorschau", 395, 114, 90, 22)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xD3DAED)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Report in Vorschau anzeigen")
$btCreateReport = GUICtrlCreateButton("Erstellen", 503, 114, 90, 22)
GUICtrlSetColor(-1, 0x000080)
GUICtrlSetBkColor(-1, 0xD3DAED)
GUICtrlSetState(-1, $GUI_DISABLE)
GUICtrlSetTip(-1, "Report erstellen und im Standard Editor öffnen")
GUICtrlCreateGroup("", -99, -99, 1, 1)
#EndRegion - PseudoRebarGUISetState()
[/autoit] [autoit][/autoit] [autoit]Do
[/autoit]
Until GUIGetMsg() = -3 -
Ich weiß nicht ob es sinnvoll ist, sich mit dieser (zurückgezogenen) Beta auseinanderzusetzen. Im Moment weiß niemand wohin die Reise geht. Ich würde also erstmal abwarten was denn tatsächlich Einzug in die nächste Version hält.
-
Naja so weit ich weis ist autoit nicht multitasking faehig.
Das ist ein Spruch den ich schon von geschätzt hundert Leuten gehört habe. Und nur einer konnte mir eine Anwendung nennen, die ausschließlich mit echtem Multitasking lauffähig war.
Der Begriff Multitasking wird so oft einfach in den Raum geworfen, ohne zu hinterfragen ob man das überhaupt braucht. Insofern ist aus meiner Sicht Multitasking-Fähigkeit das allerletzte Kriterium zur Bewertung.
-
Wirf einfach mal einen Blick in das Skripte-Forum (und probiere auch aus). Was du dort alles findest sollte überzeugend genug sein, dass AutoIt es wert ist die Aufgaben des täglichen Gebrauchs umzusetzen.
Ich habe vorher in anderen Sprachen programmiert, bin dann vor über 7 Jahren zu AutoIt gestoßen und es ist meine große Leidenschaft geworden. Und es gibt wirklich kaum etwas, dass man nicht mit AutoIt realisieren könnte. Auch wenn es mal nicht auf einfachem Weg geht ist gerade das reizvoll herauszufinden wie man es lösen kann. -
Aber bei mir unter WinXP - Klassische Ansicht, da wird der Button beim Klicken rot, dann aber nicht mehr blau. erst wenn ich ein Fenster drüberlege oder die Gui aus dem Desktopbereich und wieder herein bewege isst er wieder blau.
Ich habe das mal in meinem VirtualXP getestet:
Unter XP wird die Rebar gar nicht erstellt! In dem Bsp. sind 3 Button, die werden einfach alle übereinander geschoben (da sie für die Rebar alle x und y =0 haben) und beim Klick wird ein anderer sichtbar. Mal sehen woran das liegt. Ich hatte zumindest erwartet, dass die Funktionen auch unter XP lauffähig sind.Beim ersten Beispiel, wenn man klickt die Maus gedrückt lässt und dann neben dem Button loslässt, dann bleibt der Button optisch 'gedrückt'.
Das ist aber auch gemein von dir aus der Schaltfläche rauszurutschen...

Dann muß man für diesen Fall wohl auch zusätzlich MOUSEMOVE registrieren um das Verlassen des Button ohne UP-Event zu bemerken (oder einfach ein _MouseTrap() auf dem Button :D).Edit: Habs gerade nochmal mit dem Hilfe-Bsp. getestet: XP kann keine Rebar darstellen! - Was ein Schei... :wacko:
-
Hi,
ich habe jetzt eine passable Lösung gefunden um den Klick auf einen Button in einer Rebar optisch zu simulieren. Dazu überschreibe ich während des Events MOUSEDOWN den linken und oberen Seitenrand des Buttons mit der dunklen Farbe (wie rechts/unten). Optisch wirkt es wie ein Versenken des Button.
Das im letzten Bsp. gezeigt Simulieren mit WinMove ist hier schlecht umsetzbar, da die Rebar beim Einfügen von Controls ihre Höhe an diesen ausrichtet. Somit ist nicht genug Platz um das Ctrl um 1 px diagonal zu versetzen.
Da auf einer Rebar die Control nicht fix sind und auch aus dieser herausgezogen werden können, speichere ich die Controlposition beim Erstellen nicht mehr im Array ab, sondern frage diese bei Bedarf immer neu ab.Spoiler anzeigen
[autoit]#include <ButtonConstants.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <Constants.au3>
#include <FontConstants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <GuiReBar.au3>
#include <RebarConstants.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#Region - TimeStamp
; 2013-03-27 11:41:19
#EndRegion - TimeStampOpt('MustDeclareVars', 1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
OnAutoItExitRegister('_OnExit')Global Const $ODA_DRAWENTIRE = 1
[/autoit] [autoit][/autoit] [autoit]
Global Const $ODT_BUTTON = 4Global $nMsg, $hBrush, $hFont, $Gui, $hBtn1, $hBtn2, $hBtn3, $bt1, $bt2, $bt3, $hReBar
[/autoit] [autoit][/autoit] [autoit]
Global $sFont = 'Comic Sans MS', $iHeight = 16, $iWidth = 7, $iWeight = $FW_MEDIUM;$FW_SEMIBOLD;$FW_NORMAL$Gui = GUICreate("Test")
[/autoit] [autoit][/autoit] [autoit]
GUISetBkColor(0xD3DAED)$hBtn1 = _GUICtrlButton_Create($Gui, 'Button-1', 0, 0, 70, 22, BitOR($BS_OWNERDRAW,$BS_NOTIFY))
[/autoit] [autoit][/autoit] [autoit]
$hBtn2 = _GUICtrlButton_Create($Gui, 'Button-2', 0, 0, 70, 22, BitOR($BS_OWNERDRAW,$BS_NOTIFY))
$hBtn3 = _GUICtrlButton_Create($Gui, 'Button-3', 0, 0, 70, 22, BitOR($BS_OWNERDRAW,$BS_NOTIFY))
Global $aBtnInfo[4][5] = [[3], _ ; == [0][0]=Anzahl, [[Handle-Button, Button-BG-Color, Button-Text-Color(-1=schwarz), Top/Left-Border-Color, Right/Bottom-Border-Color]]
[$hBtn1, 0x0000FF, -1, 0xFAF5F2, 0xC0C0C0], _
[$hBtn2, 0x00FF00, 0xFF0000, 0xFAF5F2, 0xC0C0C0], _
[$hBtn3, 0xFF0000, 0xFFFFFF, 0xFAF5F2, 0xC0C0C0]]
; == Man kann das Array auch noch erweitern um Font-Informationen einzeln zu jedem Button zu speichern
$bt1 = GUICtrlCreateDummy()
$bt2 = GUICtrlCreateDummy()
$bt3 = GUICtrlCreateDummy()$hReBar = _GUICtrlRebar_Create($Gui, BitOR($CCS_TOP, $RBS_AUTOSIZE, $RBS_BANDBORDERS))
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GUICtrlRebar_AddBand($hReBar, $hBtn1, 110, 70)
_GUICtrlRebar_AddBand($hReBar, $hBtn2, 110, 70)
_GUICtrlRebar_AddBand($hReBar, $hBtn3, 110, 70)GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
_WinAPI_RedrawWindow($Gui)GUISetState(@SW_SHOW, $Gui)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]While True
[/autoit] [autoit][/autoit] [autoit]
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $GUI_EVENT_PRIMARYDOWN, $GUI_EVENT_PRIMARYUP ; == DOWN- und UP dienen nur zur optischen Darstellung des Buttonklicks
_Event_PrimaryDownUp($nMsg)
Case $bt1
ConsoleWrite('Button-1' & @LF)
Case $bt2
ConsoleWrite('Button-2' & @LF)
Case $bt3
ConsoleWrite('Button-3' & @LF)
EndSwitch
WEndFunc _OnExit()
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_DeleteObject($hBrush)
_WinAPI_DeleteObject($hFont)
EndFunc; == Man könnte sich die Dummy-Ctrls sparen und hier in der "WM_COMMAND"-Func die Befehle der Button ausführen.
[/autoit] [autoit][/autoit] [autoit]
; == Davon ist aber abzuraten! Die Msg-Routinen sollten schnellstmöglich verlassen werden, deshalb besser ein Dummy befeuern
; == und dieses Event in der Standard-Msg-Auswertung abarbeiten.
Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
#forceref $hWnd, $Msg
If BitShift($wParam, 16) <> $BN_CLICKED Then Return $GUI_RUNDEFMSG ; == nur Click soll ausgewertet werden
Local $ID
Switch $lParam ; == Button-Handle auswerten
Case $hBtn1
$ID = $bt1 ; == Dummy-ID zuweisen
Case $hBtn2
$ID = $bt2
Case $hBtn3
$ID = $bt3
EndSwitch
; == Nachricht an gewählte Dummy-ID absetzen
DllCall("user32.dll", "lresult", "SendMessageW", "hwnd", $Gui, "uint", 273, "wparam", $ID, "lparam", 0)
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMANDFunc WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $DRAWITEMSTRUCT = DllStructCreate("uint cType;uint cID;uint itmID;uint itmAction;uint itmState;" & _
"hwnd hItm;hwnd hDC;dword itmRect[4];dword itmData", $lParam)
If DllStructGetData($DRAWITEMSTRUCT, "cType") <> $ODT_BUTTON Then Return $GUI_RUNDEFMSG ; == nur OWNERDRAW-Button
If DllStructGetData($DRAWITEMSTRUCT, "itmAction") <> $ODA_DRAWENTIRE Then Return $GUI_RUNDEFMSG ; == nur Neuzeichnen-EventLocal $hDC = DllStructGetData($DRAWITEMSTRUCT, "hDC")
[/autoit] [autoit][/autoit] [autoit]
Local $hItm = DllStructGetData($DRAWITEMSTRUCT, "hItm")
Local $sText = _GUICtrlButton_GetText($hItm) ; == Text des zu zeichnenden Button abfragen
Local $iColBG, $iColTxt, $iColBorderLT, $iColBorderRB ; == Variablen für Buttonfarben im Array
_GetBtnColor($hItm, $iColBG, $iColTxt, $iColBorderLT, $iColBorderRB) ; == Farben für diesen Button aus Array abfragen
Local $tRECT = DllStructCreate('int;int;int;int;', DllStructGetPtr($DRAWITEMSTRUCT, "itmRect")) ; == Rect des Button_WinAPI_SetBkMode($hDC, $TRANSPARENT)
[/autoit] [autoit][/autoit] [autoit]
$hBrush = _WinAPI_CreateSolidBrush($iColBG)
Local $hBrushOld = _WinAPI_SelectObject($hDC, $hBrush)
_WinAPI_FillRect($hDC, DllStructGetPtr($DRAWITEMSTRUCT, "itmRect"), $hBrush) ; == Button-Hintergrundfarbe zeichnen
Local $iColOld = _WinAPI_SetTextColor($hDC, $iColTxt) ; == Textfarbe anwählen; == Infos für Font könnten auch einzeln für jeden Button im Array hinterlegt werden
[/autoit] [autoit][/autoit] [autoit]
Local $nHeight = $iHeight, $nWidth = $iWidth, $nEscape = 0, $nOrientn = 0, $fnWeight = $iWeight, $bItalic = False, $bUnderline = False
Local $bStrikeout = False, $nCharset = $DEFAULT_CHARSET, $nOutputPrec = $OUT_DEFAULT_PRECIS, $nClipPrec = $CLIP_DEFAULT_PRECIS
Local $nQuality = $DEFAULT_QUALITY, $nPitch = 0, $szFace = $sFont
$hFont = _WinAPI_CreateFont($nHeight, $nWidth, $nEscape, $nOrientn, $fnWeight, $bItalic, $bUnderline, _
$bStrikeout, $nCharset, $nOutputPrec, $nClipPrec, $nQuality, $nPitch, $szFace)
Local $hOldFont = _WinAPI_SelectObject($hDC, $hFont)_WinAPI_DrawText($hDC, $sText, $tRECT, BitOR($DT_CENTER,$DT_VCENTER,$DT_SINGLELINE)) ; == Button-Text schreiben
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_SetTextColor($hDC, $iColOld) ; == Textfarbe zurücksetzen
_WinAPI_DrawButtonRect($hDC, $tRECT, $iColBorderLT, $iColBorderRB, 1) ; == Button-Ränder zeichnen (Left u. Top hell / Right u. Bottom dunkel)
_WinAPI_SelectObject($hDC, $hBrushOld)
_WinAPI_SelectObject($hDC, $hOldFont)Return $GUI_RUNDEFMSG
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>WM_DRAWITEMFunc _Event_PrimaryDownUp($_iEVENT)
[/autoit] [autoit][/autoit] [autoit]
Local $oldMode = Opt('MouseCoordMode', 2), $aMouse = MouseGetPos(), $iColBorderRB
Opt('MouseCoordMode', $oldMode)
Local $hWndBtn = _GetBtnHwndFromMouse($aMouse[0], $aMouse[1], $iColBorderRB)
If $hWndBtn = 0 Then Return
Local $aCtrlPos = ControlGetPos($Gui, '', _WinAPI_GetDlgCtrlID($hWndBtn)) ; == Pos. im Rebar ist variabel, daher immer neu abfragen
Local Static $DC = _WinAPI_GetDC($Gui)
Switch $_iEVENT
Case $GUI_EVENT_PRIMARYUP
_WinAPI_ReleaseDC($Gui, $DC)
Case $GUI_EVENT_PRIMARYDOWN
Local $hPenLT = _WinAPI_CreatePen($PS_SOLID, 1, $iColBorderRB) ; == Farbe von Right/Bottom verwenden
_WinAPI_SelectObject($DC, $hPenLT)
_WinAPI_DrawLine($DC, $aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[0], $aCtrlPos[1]+$aCtrlPos[3]-1) ; == Left
_WinAPI_DrawLine($DC, $aCtrlPos[0], $aCtrlPos[1], $aCtrlPos[0]+$aCtrlPos[2], $aCtrlPos[1]) ; == Top
_WinAPI_DeleteObject($hPenLT)
EndSwitch
EndFunc ;==>_Event_PrimaryDownUpFunc _GetBtnColor($_hWnd, ByRef $_iColBG, ByRef $_iColTxt, ByRef $_iColBorderLT, ByRef $_iColBorderRB)
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $aBtnInfo[0][0]
If $aBtnInfo[$i][0] = $_hWnd Then
$_iColBG = $aBtnInfo[$i][1]
If $aBtnInfo[$i][2] = -1 Then $aBtnInfo[$i][2] = 0x000000
$_iColTxt = $aBtnInfo[$i][2]
$_iColBorderLT = $aBtnInfo[$i][3]
$_iColBorderRB = $aBtnInfo[$i][4]
Return
EndIf
Next
EndFunc ;==>_GetBtnColorFunc _GetBtnHwndFromMouse($_iX, $_iY, ByRef $_iColBorderRB)
[/autoit] [autoit][/autoit] [autoit]
Local $aCtrl
For $i = 1 To $aBtnInfo[0][0]
$aCtrl = ControlGetPos($Gui, '', _WinAPI_GetDlgCtrlID($aBtnInfo[$i][0]))
If ($aCtrl[0] <= $_iX And $_iX <= $aCtrl[2]+$aCtrl[0]) And ($aCtrl[1] <= $_iY And $_iY <= $aCtrl[3]+$aCtrl[1]) Then
$_iColBorderRB = $aBtnInfo[$i][4]
Return $aBtnInfo[$i][0]
EndIf
Next
Return 0
EndFunc ;==>_GetBtnHwndFromMouseFunc _WinAPI_DrawButtonRect(ByRef $_hDC, $_tpRECT, $_iPenColorLT, $_iPenColorRB, $_iPenSize=1)
[/autoit]
Local $tRECT
If IsDllStruct($_tpRECT) Then
$tRECT = $_tpRECT
ElseIf IsPtr($_tpRECT) Then
$tRECT = DllStructCreate('int;int;int;int;', $_tpRECT)
EndIf
Local $hPenLT = _WinAPI_CreatePen($PS_SOLID, $_iPenSize, $_iPenColorLT)
Local $hPenRB = _WinAPI_CreatePen($PS_SOLID, $_iPenSize, $_iPenColorRB)
Local $left = DllStructGetData($tRECT, 1), $top = DllStructGetData($tRECT, 2), $right = DllStructGetData($tRECT, 3), $bottom = DllStructGetData($tRECT, 4)
_WinAPI_SelectObject($_hDC, $hPenLT)
_WinAPI_DrawLine($_hDC, $left, $top, $left, $bottom-$_iPenSize) ; == Left
_WinAPI_DrawLine($_hDC, $left, $top, $right, $top) ; == Top
_WinAPI_SelectObject($_hDC, $hPenRB)
_WinAPI_DrawLine($_hDC, $right-$_iPenSize, $top, $right-$_iPenSize, $bottom-$_iPenSize) ; == Right
_WinAPI_DrawLine($_hDC, $left, $bottom-$_iPenSize, $right-$_iPenSize, $bottom-$_iPenSize) ; == Bottom
_WinAPI_DeleteObject($hPenLT)
_WinAPI_DeleteObject($hPenRB)
EndFunc ;==>_WinAPI_DrawButtonRect