1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. BugFix

Beiträge von BugFix

  • Hintergrundbild zu 50% transparent / Texte + Buttons sollen aber zu 100% angezeigt werden

    • BugFix
    • 1. April 2013 um 15:35

    Warum soll das Bild halbtransparent sein, wenn es nichts gibt auf das die Transparenz wirkt? Dann kannst du doch einfach ein "blasses" Bild nehmen und hast denselben Effekt?

  • Funktionen werden zu Objekten - Das OCFGV-Paradigma - Eigene Objekte in 2 Zeilen

    • BugFix
    • 1. April 2013 um 12:42
    [autoit]

    Func __o_StartUp($hG)
    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)
    EndFunc

    [/autoit]

    Na, die 3 Globalen Variablen hast du doch bereits am Skriptanfang deklariert! Hier dann nur den Wert zuweisen, ohne "Global". ;)

  • Funktionen werden zu Objekten - Das OCFGV-Paradigma - Eigene Objekte in 2 Zeilen

    • BugFix
    • 1. April 2013 um 12:26
    [autoit]

    Global $aParameters[2]

    [/autoit]


    Was soll das bedeuten? Wieso deklariesrst du in jeder Zeile ein neues Array??
    du bekommst einmal das ArrayParameters und mußt dessen Item in deine Funktionen einsetzen. Returns mußt du in neuen Variablen auffangen.

  • Funktionen werden zu Objekten - Das OCFGV-Paradigma - Eigene Objekte in 2 Zeilen

    • BugFix
    • 1. April 2013 um 12:06

    Du mußt innerhalb der Funktionen die Parameter erst auslesen mit _Parameters, die werden nicht direkt übernommen.

    Bsp.:

    [autoit]


    Func __o_Test($hWnd, $sText, $iIndex)
    Local $aParam = _($OBJECTVARIABLE.Test_Parameters)
    _GUICtrlListBox_InsertString($aParam[1], $aParam[2], $aParam[3])
    EndFunc

    [/autoit]
  • AutoIt-Object -- Parameter einer Methode als ByRef

    • BugFix
    • 1. April 2013 um 11:09

    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:
    ; 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.

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $oTest = _CreateObjFunc('Test')

    [/autoit] [autoit][/autoit] [autoit]

    $a1 = 5
    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

    [/autoit] [autoit][/autoit] [autoit]

    ;------------------------------------- OBJECT ------------------------------------------------------
    Func _CreateObjFunc($_sName)
    Local $oSelf = _AutoItObject_Create()
    _AutoItObject_AddMethod($oSelf, 'Meth', "_Meth")
    Return $oSelf
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _Meth(ByRef $oSelf, ByRef $A, $B=1, $C=1)
    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
    ;---------------------------------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func _SomeFunc(ByRef $A, $B=1, $C=1)
    $A += $B + $C
    Return $A
    EndFunc

    [/autoit]
  • Excel - verbundene Zellen und mehr :-)

    • BugFix
    • 30. März 2013 um 11:05
    Zitat von Torni

    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".

  • GUICtrlSetOnEvent <- event abfangen im neu ersteller GUI

    • BugFix
    • 30. März 2013 um 11:00
    Zitat von minx

    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) :rofl: -- Denn genau das ist die logische Konsequenz deiner Aussage in Bezug auf das gezeigte Skript. :P

  • Globale Variablen vermeiden

    • BugFix
    • 30. März 2013 um 10:25

    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
    _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)

    [/autoit] [autoit][/autoit] [autoit]

    Func _A($a, $b)
    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
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _B($a, $b)
    Local $Summe = _ManageVars('Summe')
    If @error Then
    _ManageVars('Summe', False, $a - $b)
    Else
    _ManageVars('Summe', False, $Summe + ($a - $b))
    EndIf
    EndFunc

    [/autoit] [autoit][/autoit] [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

    [/autoit]
  • GUICtrlSetOnEvent <- event abfangen im neu ersteller GUI

    • BugFix
    • 30. März 2013 um 09:34
    Zitat von minx

    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 Hilfe

    A 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


    Folgende Situation im Hauptskript ist vom Namensraum daher absolut identisch:

    [autoit]


    $Variable1 = "Wert"
    Global $Variable2 = "Wert"

    [/autoit]

    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. ;)

  • [Mini-Tutorial] BitOR und Konsorten.

    • BugFix
    • 30. März 2013 um 09:07

    Bit-Tutorial ^^

  • ListView - SubItem einzeln färben/formatieren, Finale Version! (v1.3)

    • BugFix
    • 29. März 2013 um 18:32

    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.

  • zeile in einer selbsterstellten tabelle färben

    • BugFix
    • 29. März 2013 um 17:10

    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

  • Explorer zweimal öffnen und je links und rechts zur Hälfte anordnen

    • BugFix
    • 29. März 2013 um 14:12

    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. ;)

  • Pseudo-Rebar (da AutoIt mit XP keine Rebar kann)

    • BugFix
    • 29. März 2013 um 13:13

    Habe die Includes und die Schleife hinzugefügt. ;)

  • Pseudo-Rebar (da AutoIt mit XP keine Rebar kann)

    • BugFix
    • 29. März 2013 um 11:55

    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. :D 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>
    #include <ComboConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $Gui = GUICreate("PB Log-To-Report", 609, 595)
    GUISetBkColor(0xD3DAED)

    [/autoit] [autoit][/autoit] [autoit]

    #Region - PseudoRebar
    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)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateGroup('', 0, 20, 609, 34)
    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)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateGroup('', 0, 47, 609, 35)
    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)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateGroup('', 0, 75, 609, 35)
    $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)

    [/autoit] [autoit][/autoit] [autoit]

    GUICtrlCreateGroup('', 0, 103, 609, 35)
    $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 - PseudoRebar

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Until GUIGetMsg() = -3

    [/autoit]

    Dateien

    RebarImitation.png 10,44 kB – 0 Downloads
  • [3.3.9.5] Fragen zu Strukturen

    • BugFix
    • 28. März 2013 um 18:01

    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.

  • Anfangen mit der Sprache AutoIt

    • BugFix
    • 28. März 2013 um 09:36
    Zitat von Midakox3

    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. :D
    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. ;)

  • Anfangen mit der Sprache AutoIt

    • BugFix
    • 27. März 2013 um 21:49

    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.

  • Bsp.: Mit Button-UDF erstellten Button einfärben

    • BugFix
    • 27. März 2013 um 12:54
    Zitat von funkey

    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.

    Zitat von funkey

    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... :D
    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:

  • Bsp.: Mit Button-UDF erstellten Button einfärben

    • BugFix
    • 27. März 2013 um 11:46

    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. :D
    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>
    #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 - TimeStamp

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Opt('MustDeclareVars', 1)
    OnAutoItExitRegister('_OnExit')

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global Const $ODA_DRAWENTIRE = 1
    Global Const $ODT_BUTTON = 4

    [/autoit] [autoit][/autoit] [autoit]

    Global $nMsg, $hBrush, $hFont, $Gui, $hBtn1, $hBtn2, $hBtn3, $bt1, $bt2, $bt3, $hReBar
    Global $sFont = 'Comic Sans MS', $iHeight = 16, $iWidth = 7, $iWeight = $FW_MEDIUM;$FW_SEMIBOLD;$FW_NORMAL

    [/autoit] [autoit][/autoit] [autoit]

    $Gui = GUICreate("Test")
    GUISetBkColor(0xD3DAED)

    [/autoit] [autoit][/autoit] [autoit]

    $hBtn1 = _GUICtrlButton_Create($Gui, 'Button-1', 0, 0, 70, 22, BitOR($BS_OWNERDRAW,$BS_NOTIFY))
    $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()

    [/autoit] [autoit][/autoit] [autoit]

    $hReBar = _GUICtrlRebar_Create($Gui, BitOR($CCS_TOP, $RBS_AUTOSIZE, $RBS_BANDBORDERS))
    _GUICtrlRebar_AddBand($hReBar, $hBtn1, 110, 70)
    _GUICtrlRebar_AddBand($hReBar, $hBtn2, 110, 70)
    _GUICtrlRebar_AddBand($hReBar, $hBtn3, 110, 70)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")
    GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM")
    _WinAPI_RedrawWindow($Gui)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW, $Gui)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While True
    $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
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _OnExit()
    _WinAPI_DeleteObject($hBrush)
    _WinAPI_DeleteObject($hFont)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; == Man könnte sich die Dummy-Ctrls sparen und hier in der "WM_COMMAND"-Func die Befehle der Button ausführen.
    ; == 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_COMMAND

    [/autoit] [autoit][/autoit] [autoit]

    Func WM_DRAWITEM($hWnd, $Msg, $wParam, $lParam)
    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-Event

    [/autoit] [autoit][/autoit] [autoit]

    Local $hDC = DllStructGetData($DRAWITEMSTRUCT, "hDC")
    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

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SetBkMode($hDC, $TRANSPARENT)
    $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

    [/autoit] [autoit][/autoit] [autoit]

    ; == Infos für Font könnten auch einzeln für jeden Button im Array hinterlegt werden
    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)

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_DrawText($hDC, $sText, $tRECT, BitOR($DT_CENTER,$DT_VCENTER,$DT_SINGLELINE)) ; == Button-Text schreiben
    _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)

    [/autoit] [autoit][/autoit] [autoit]

    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_DRAWITEM

    [/autoit] [autoit][/autoit] [autoit]

    Func _Event_PrimaryDownUp($_iEVENT)
    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_PrimaryDownUp

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetBtnColor($_hWnd, ByRef $_iColBG, ByRef $_iColTxt, ByRef $_iColBorderLT, ByRef $_iColBorderRB)
    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 ;==>_GetBtnColor

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetBtnHwndFromMouse($_iX, $_iY, ByRef $_iColBorderRB)
    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 ;==>_GetBtnHwndFromMouse

    [/autoit] [autoit][/autoit] [autoit]

    Func _WinAPI_DrawButtonRect(ByRef $_hDC, $_tpRECT, $_iPenColorLT, $_iPenColorRB, $_iPenSize=1)
    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

    [/autoit]

    Dateien

    ButtonColored_OnRebar.au3 9,15 kB – 267 Downloads

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™