Neue Version siehe Post #1.
Beiträge von BugFix
-
-
Alles klar, das war der springende Punkt:
Die horizontalen / vertikalen Flags in getrennten Gruppen abfragen.Danke.
-
Bei der Überschrift kann keiner widerstehen - alle gucken rein.

Problem:
Ich schreibe Text mit _WinAPI_DrawText() und kann per Flag die Textausrichtung setzen. Wie üblich können die Werte mit BitOR() kombiniert werden.
Hier die möglichen Werte:Code$DT_BOTTOM = 0x8 $DT_CENTER = 0x1 $DT_LEFT = 0x0 <== wie abfragen? $DT_RIGHT = 0x2 $DT_TOP = 0x0 <== wie abfragen? $DT_VCENTER = 0x4Sowohl LEFT, als auch TOP haben den Wert "0". Erstaunlicherweise ergibt die Kombination aus LEFT und TOP zwar weiterhin nur 1-mal "0" aber der Text wird richtig positioniert.
In einer Funktion versuche ich die Ausrichtung auszulesen. Nur: Wie soll man mit BitAND() "0" abfragen - und: Welches "0" wäre das dann - LEFT oder TOP?Hier mal das Skript, vllt. hat jemand eine zündende Idee.
Spoiler anzeigen
[autoit]#include <WinAPI.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <WindowsConstants.au3>
#include <FontConstants.au3>Global $Gui, $Button, $tRECT, $hBrush = _WinAPI_CreateSolidBrush(0x000000)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Global $hFont, $hOldFont, $hDC, $sText = "VCenter+HCenter", $iAlignment = BitOR($DT_CENTER,$DT_VCENTER)$tRECT = DllStructCreate($tagRect)
[/autoit] [autoit][/autoit] [autoit]
DllStructSetData($tRECT, "Left", 100)
DllStructSetData($tRECT, "Top", 80)
DllStructSetData($tRECT, "Right", 250)
DllStructSetData($tRECT, "Bottom", 130)$Gui = GUICreate('Test')
[/autoit] [autoit][/autoit] [autoit]
$Button = GUICtrlCreateButton('Weiter', 125, 160, 80, 20)$hDC = _WinAPI_GetDC($Gui)
[/autoit] [autoit][/autoit] [autoit]
$hFont = _WinAPI_CreateFont(20, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
$OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, 'Arial')
$hOldFont = _WinAPI_SelectObject($hDC, $hFont)_WinAPI_SetTextColor($hDC, 0x0000FF)
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_SetBkColor($hDC, 0x000000)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)GUISetState()
[/autoit] [autoit][/autoit] [autoit]_WinAPI_DrawText($hDC, $sText, $tRECT, BitOR($DT_NOCLIP,$DT_SINGLELINE,$iAlignment))
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_FrameRect($hDC, DllStructGetPtr($tRECT), $hBrush)$counter = 0
[/autoit] [autoit][/autoit] [autoit]
While 1
Switch GUIGetMsg()
Case -3
_Exit()
Case $Button
$counter += 1
If $counter = 9 Then $counter = 0
Switch $counter
Case 0
$sText = 'VCenter+HCenter'
_AlignmentSet(-1)
ConsoleWrite('Ausrichtung: ' & $iAlignment & ': ' & _AlignmentGetAsStr($iAlignment) & @CRLF)
Case 1
$sText = 'Top+Left'
_AlignmentSet(BitOR($DT_TOP,$DT_LEFT))
ConsoleWrite('Ausrichtung: ' & $iAlignment & ': ' & _AlignmentGetAsStr($iAlignment) & @CRLF)
Case 2
$sText = 'Top+HCenter'
_AlignmentSet(BitOR($DT_TOP,$DT_CENTER))
ConsoleWrite('Ausrichtung: ' & $iAlignment & ': ' & _AlignmentGetAsStr($iAlignment) & @CRLF)
Case 3
$sText = 'Top+Right'
_AlignmentSet(BitOR($DT_TOP,$DT_RIGHT))
ConsoleWrite('Ausrichtung: ' & $iAlignment & ': ' & _AlignmentGetAsStr($iAlignment) & @CRLF)
Case 4
$sText = 'Left+VCenter'
_AlignmentSet(BitOR($DT_LEFT,$DT_VCENTER))
ConsoleWrite('Ausrichtung: ' & $iAlignment & ': ' & _AlignmentGetAsStr($iAlignment) & @CRLF)
Case 5
$sText = 'Right+VCenter'
_AlignmentSet(BitOR($DT_RIGHT,$DT_VCENTER))
ConsoleWrite('Ausrichtung: ' & $iAlignment & ': ' & _AlignmentGetAsStr($iAlignment) & @CRLF)
Case 6
$sText = 'Bottom+Left'
_AlignmentSet(BitOR($DT_BOTTOM,$DT_LEFT))
ConsoleWrite('Ausrichtung: ' & $iAlignment & ': ' & _AlignmentGetAsStr($iAlignment) & @CRLF)
Case 7
$sText = 'Bottom+HCenter'
_AlignmentSet(BitOR($DT_BOTTOM,$DT_CENTER))
ConsoleWrite('Ausrichtung: ' & $iAlignment & ': ' & _AlignmentGetAsStr($iAlignment) & @CRLF)
Case 8
$sText = 'Bottom+Right'
_AlignmentSet(BitOR($DT_BOTTOM,$DT_RIGHT))
ConsoleWrite('Ausrichtung: ' & $iAlignment & ': ' & _AlignmentGetAsStr($iAlignment) & @CRLF)
EndSwitch
EndSwitch
WEndFunc _Exit()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_WinAPI_SelectObject($hDC, $hOldFont)
_WinAPI_DeleteObject($hFont)
_WinAPI_ReleaseDC(0, $hDC)
_WinAPI_InvalidateRect(0, 0)
$tRECT = 0
Exit
EndFunc ;==>_Exit;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; mgl. Werte: $DT_BOTTOM, $DT_CENTER, $DT_LEFT, $DT_RIGHT, $DT_TOP, $DT_VCENTER
; -1/Default = BitOR($DT_CENTER,$DT_VCENTER)
;==================================================================================================
Func _AlignmentSet($Alignment=-1)
If IsKeyword($Alignment) Or $Alignment < 0 Then $Alignment = BitOR($DT_CENTER,$DT_VCENTER)
$iAlignment = $Alignment
_WinAPI_RedrawWindow($Gui, $tRECT)
_WinAPI_DrawText($hDC, $sText, $tRECT, BitOR($DT_NOCLIP,$DT_SINGLELINE,$iAlignment))
_WinAPI_FrameRect($hDC, DllStructGetPtr($tRECT), $hBrush)
EndFuncFunc _AlignmentGetAsStr($iAlignment)
[/autoit]
Local $sAlignment = ''
If BitAND($iAlignment, $DT_BOTTOM) Then $sAlignment &= '$DT_BOTTOM '
If BitAND($iAlignment, $DT_CENTER) Then $sAlignment &= '$DT_CENTER '
If BitAND($iAlignment, $DT_LEFT) Then $sAlignment &= '$DT_LEFT '
If BitAND($iAlignment, $DT_RIGHT) Then $sAlignment &= '$DT_RIGHT '
If BitAND($iAlignment, $DT_TOP) Then $sAlignment &= '$DT_TOP '
If BitAND($iAlignment, $DT_VCENTER) Then $sAlignment &= '$DT_VCENTER '
Return StringTrimRight($sAlignment, 1)
EndFunc -
Aber Wieso?
Dass einige Funktionen auch mit der ID funktionieren solltest du einfach ignorieren und dir angewöhnen für die UDF immer das Handle zu nehmen. Bei vielen Funktionen ist das Handle zwingend erforderlich und somit sinnvoll dieses immer zu verwenden, da es mit allen Funktionen funktioniert. -
Vermutlich hast du nicht die SciTE-Vollversion. Lade und installiere die Version: http://www.autoitscript.com/cgi-bin/getfil…iTE4AutoIt3.exe
Dann findest du auch die angesprochenen Einstellfenster.
-
also das ich jetz sagma mal n bild mit nem stopzeichen drauf hab
und dan das bild in den button zeichne
geht das?Eine Bitte: Groß-/Kleinschreibung beachten. Es ist echt anstrengend solchen Text zu lesen.

Wenn du ein Bild auf dem Button möchtest kannst du doch einen Button mit $BS_ICON oder $BS_BITMAP -Style erstellen.
Diese Funktion hier dient dazu z.B. auf einem Bild einen Button zu erstellen, der voll-transparent ist. -
geht das auch mit bild?
Ähm.. Das Beispiel ist doch mit Verwendung eines Bildes. Oder was meinst du? -
Sicher schon öfter in dieser oder anderer Form genutzt habe ich es mal in eine UDF gepackt.
Einen "Pseudo-Button" den man auf jede Oberfläche transparent aufzeichnet (nur Rahmen und Schrift). Ganz praktisch um auf einem Picture-Hintergrund eine dezente Schaltfläche unterzubringen.
Falls die Bemerkung kommt: "...das könnte man doch auch mit GDI+ machen..."
Klar könnte man das, aber mit WinAPI läßt es sich leichter realisieren .
Funktionen
[autoit]#include-once
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <FontConstants.au3>#region - "Button"-Funktionen
[/autoit] [autoit][/autoit] [autoit]
;==================================================================================================
; Funktion: _DrawButton_Create($hGui, $text, $left ,$top ,$width ,$height)
; Beschreibung: Zeichnet einen "Pseudo-Button"
; Rückgabewert: Array-Variable mit Control-Daten
; Erfordernisse: #include <FontConstants.au3>, <Winapi.au3>
;==================================================================================================
Func _DrawButton_Create($hGui, $text, $left ,$top ,$width ,$height=20)
Enum $tRECT, $hDC, $hBrush, $hFont, $btnText, $hWnd, $size, $weight, $attrib, $font, $colT, $colB, $alignment
Local $aBtn[13], $L = $left, $T = $top, $R = $L + $width, $B = $T + $height
$aBtn[$btnText] = $text
$aBtn[$hWnd] = $hGUI
$aBtn[$tRECT] = DllStructCreate('int;int;int;int;')
$aBtn[$size] = 14
$aBtn[$weight] = 400
$aBtn[$attrib] = 0
$aBtn[$font] = "Arial"
$aBtn[$colT] = 0x000000
$aBtn[$colB] = 0x000000
$aBtn[$alignment] = BitOR($DT_CENTER,$DT_VCENTER)
DllCall("user32", 'long', 'SetRect', 'ptr', DllStructGetPtr($aBtn[$tRECT]), 'long', $L, 'long', $T, 'long', $R, 'long', $B)
$aBtn[$hDC] = _WinAPI_GetDC($hGui)
$aBtn[$hBrush] = _WinAPI_CreateSolidBrush(0x000000)
$aBtn[$hFont] = _WinAPI_CreateFont(14, 0, 0, 0, 400, False, False, False, $DEFAULT_CHARSET, _
$OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, "Arial")
_WinAPI_SetTextColor($aBtn[$hDC], 0x000000)
_WinAPI_SetBkColor($aBtn[$hDC], 0xFFFFFF)
_WinAPI_SelectObject($aBtn[$hDC], $hFont)
_WinAPI_SetBkMode($aBtn[$hDC], $TRANSPARENT)
_DrawButton_AlignmentSet($aBtn)
Return $aBtn
EndFunc ;==>_DrawButton_Create;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Funktion: _DrawButton_SetStyle($aButton, $size, $weight, $attribute, $fontname, $colText, $colBorder)
; Beschreibung: Setzt Textattribute und Farben des Button
; Bemerkung: Für alle Parameter gilt:
; Zum Setzen der Standardwerte "Default" übergeben
; Um einen/mehrere Parameter NICHT zu verändern "-1" übergeben
;==================================================================================================
Func _DrawButton_SetStyle(ByRef $aButton, $size=14, $weight=400, $attribute=0, $fontname="Arial", $colText=0x000000, $colBorder=0x000000)
Local $aAttrib[3] = [False,False,False] ; italic:2 underlined:4 strike:8
; === mit "Default" alles auf Standard zurücksetzen
If IsKeyword($size) Then
$attribute = 14
EndIf
If IsKeyword($weight) Then
$attribute = 400
EndIf
If IsKeyword($attribute) Then
$attribute = 0
EndIf
If IsKeyword($fontname) Then
$fontname = "Arial"
EndIf
If IsKeyword($colText) Then
$colText = 0x000000
EndIf
If IsKeyword($colBorder) Then
$colBorder = 0x000000
EndIf
; === bei "-1" keine Änderung
If $size > -1 Then $aButton[6] = $size
If $weight > -1 Then $aButton[7] = $weight
If $attribute > -1 Then
For $i = 1 To 3
If BitAND($attribute, 2^$i) Then
$aAttrib[$i-1] = True
Else
$aAttrib[$i-1] = False
EndIf
Next
$aButton[8] = $attribute
EndIf
If $fontname > -1 Then $aButton[9] = $fontname
If $colText > -1 Then $aButton[10] = $colText
If $colBorder > -1 Then
_WinAPI_DeleteObject($aButton[2])
$aButton[2] = _WinAPI_CreateSolidBrush(__RGB2BGR($colBorder))
$aButton[11] = $colBorder
EndIf
$aButton[3] = _WinAPI_CreateFont($aButton[6], 0, 0, 0, $aButton[7], $aAttrib[0], $aAttrib[1], $aAttrib[2], $DEFAULT_CHARSET, _
$OUT_DEFAULT_PRECIS, $CLIP_DEFAULT_PRECIS, $DEFAULT_QUALITY, 0, $aButton[9])
_WinAPI_SetTextColor($aButton[1], __RGB2BGR($aButton[10]))
_WinAPI_SelectObject($aButton[1], $aButton[3])
_WinAPI_SetBkMode($aButton[1], $TRANSPARENT)
_WinAPI_RedrawWindow($aButton[5], $aButton[0])
_DrawButton_Draw($aButton)
EndFunc ;==>_DrawButton_SetStyle;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Funktion: _DrawButton_SetText($aButton, $sText)
; Beschreibung: Setzt den Text des Button neu
;==================================================================================================
Func _DrawButton_SetText(ByRef $aButton, $sText)
$aButton[4] = $sText
_WinAPI_RedrawWindow($aButton[5], $aButton[0])
_DrawButton_Draw($aButton)
EndFunc ;==>_DrawButton_SetText;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Funktion: _DrawButton_AlignmentSet(ByRef $aButton, $Alignment)
; Beschreibung: Setzt die Textausrichtung, Kombinationen mit BitOR()
; mgl. Werte: $DT_BOTTOM, $DT_CENTER, $DT_LEFT, $DT_RIGHT, $DT_TOP, $DT_VCENTER
; -1/Default = BitOR($DT_CENTER,$DT_VCENTER)
;==================================================================================================
Func _DrawButton_AlignmentSet(ByRef $aButton, $Alignment=-1)
If IsKeyword($Alignment) Or $Alignment < 0 Then $Alignment = BitOR($DT_CENTER,$DT_VCENTER)
$aButton[12] = $Alignment
_WinAPI_RedrawWindow($aButton[5], $aButton[0])
_DrawButton_Draw($aButton)
EndFunc ;==>_DrawButton_AlignmentSet;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Funktion: _DrawButton_AlignmentGet($aButton, $bRetAsStr)
; Beschreibung: Gibt die Textausrichtung zurück, False(Standard) = numerisch, True = als String
; Idee: [user='200143']progandy[/user]
;==================================================================================================
Func _DrawButton_AlignmentGet($aButton, $bRetAsStr=False)
Local $sAlignment = ''
Select
Case BitAND($aButton[12], $DT_BOTTOM) = $DT_BOTTOM
$sAlignment &= '$DT_BOTTOM '
Case BitAND($aButton[12], $DT_VCENTER) = $DT_VCENTER
$sAlignment &= '$DT_VCENTER '
Case Else
$sAlignment &= '$DT_TOP '
EndSelect
Select
Case BitAND($aButton[12], $DT_CENTER) = $DT_CENTER
$sAlignment &= '$DT_CENTER '
Case BitAND($aButton[12], $DT_RIGHT) = $DT_RIGHT
$sAlignment &= '$DT_RIGHT '
Case Else
$sAlignment &= '$DT_LEFT '
EndSelect
If $bRetAsStr Then Return StringTrimRight($sAlignment, 1)
Return $aButton[12]
EndFunc ;==>_DrawButton_AlignmentGet;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Funktion: _DrawButton_Draw($aButton)
; Beschreibung: Zeichnet den Button
; Bemerkung: Um den Button sichtbar zu machen muß die Funktion aufgerufen werden:
; - erstmalig nach GUISetState()
; - nach jeder Fensterbewegung (GUIRegisterMsg($WM_MOVE) erforderlich)
; - nach den Events: $GUI_EVENT_RESTORE, $GUI_EVENT_MAXIMIZE
;==================================================================================================
Func _DrawButton_Draw($aButton)
_WinAPI_FrameRect($aButton[1], DllStructGetPtr($aButton[0]), $aButton[2])
_WinAPI_DrawText($aButton[1], $aButton[4], $aButton[0], BitOR($DT_NOCLIP,$DT_SINGLELINE,$aButton[12]))
EndFunc ;==>_DrawButton_Draw;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Funktion: _DrawButton_Release($aButton)
; Beschreibung: Ressourcen freigeben am Programmende
;==================================================================================================
Func _DrawButton_Release($aButton)
_WinAPI_DeleteObject($aButton[2])
_WinAPI_ReleaseDC($aButton[5], $aButton[1])
_WinAPI_DeleteObject($aButton[3])
_WinAPI_ReleaseDC(0, $aButton[1])
_WinAPI_InvalidateRect(0, 0)
EndFunc ;==>_DrawButton_Release;==================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Funktion: _DrawButton_Clicked($aButton)
; Beschreibung: Überprüft ob Mausklick auf den Button erfolgte
; Rückgabewert: True - Klick auf Buttonfläche
; False - Klick außerhalb
; Bemerkung: Die Funktion muß einem Maus-Ereignis zugeordnet werden (z.B. $GUI_EVENT_PRIMARYDOWN)
;==================================================================================================
Func _DrawButton_Clicked($aButton)
Local $iBar = _WinAPI_GetSystemMetrics(4)
Local $iBorderH = _WinAPI_GetSystemMetrics(6)
Local $iBorderB = _WinAPI_GetSystemMetrics(32)
Local $old = Opt('MouseCoordMode', 0)
Local $mPos = MouseGetPos()
Opt('MouseCoordMode', $old)
$mPos[0] -= $iBorderB/2
$mPos[1] -= $iBar + 2*$iBorderH
Local $ret = DllCall("user32.dll", "bool", "PtInRect", "ptr", DllStructGetPtr($aButton[0]), "long", $mPos[0], "long", $mPos[1])
If $ret[0] > 0 Then Return True
Return False
EndFunc ;==>_DrawButton_Clicked
#endregionFunc __RGB2BGR($iColor)
[/autoit]
Local $sH = Hex($iColor,6)
Return '0x' & StringRight($sH, 2) & StringMid($sH,3,2) & StringLeft($sH, 2)
EndFunc ;==>__RGB2BGRBeispiel
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include "DrawButton.au3"Local $iBorderH = _WinAPI_GetSystemMetrics(6)
[/autoit] [autoit][/autoit] [autoit]
Local $imgW = 248, $imgH = 281
Local $mPos, $old
Local $guiMain, $btn$guiMain = GUICreate('Test', $imgW, $imgH, -1, -1)
[/autoit] [autoit][/autoit] [autoit]
If @OSVersion = "WIN_XP" Then
GUICtrlCreatePic(@SystemDir & '\oobe\images\wpakey.jpg', $iBorderH, $iBorderH, $imgW, $imgH)
GUICtrlSetState(-1, $GUI_DISABLE)
Else
GUISetBkColor(0x0000FF)
EndIf
$btn = _DrawButton_Create($guiMain, "Pseudo-Button",60 ,130 ,120)
_DrawButton_SetStyle($btn, 16, 400, 1, "Comic Sans MS", 0xFFFF00, 0xFF00F7)
GUISetState(@SW_SHOW, $guiMain)GUIRegisterMsg($WM_MOVE, '_WM_MOVE')
[/autoit] [autoit][/autoit] [autoit]_DrawButton_Draw($btn)
[/autoit] [autoit][/autoit] [autoit]$zaehler = 0
[/autoit] [autoit][/autoit] [autoit]
While True
Switch GUIGetMsg ()
Case $GUI_EVENT_PRIMARYDOWN
If _DrawButton_Clicked($btn) Then
$zaehler += 1
Switch $zaehler
Case 1
_DrawButton_SetText($btn, 'Text ist neu')
Case 2
_DrawButton_SetText($btn, 'fett')
_DrawButton_SetStyle($btn, 16, 600, -1, -1, -1, -1)
Case 3
_DrawButton_SetText($btn, 'kursiv')
_DrawButton_SetStyle($btn, 16, 400, 2, -1, -1, -1)
Case 4
_DrawButton_SetText($btn, 'kursiv+fett')
_DrawButton_SetStyle($btn, 16, 600, 2, -1, -1, -1)
Case 5
_DrawButton_SetText($btn, 'unterstrichen')
_DrawButton_SetStyle($btn, 16, 400, 4, -1, -1, -1)
Case 6
_DrawButton_SetText($btn, 'durchgestrichen')
_DrawButton_SetStyle($btn, 16, 400, 8, -1, -1, -1)
Case 7
_DrawButton_SetText($btn, 'unter+durch')
_DrawButton_SetStyle($btn, 16, 400, 12, -1, -1, -1)
Case 8
_DrawButton_SetText($btn, 'kursiv+unter+durch')
_DrawButton_SetStyle($btn, 16, 400, 14, -1, -1, -1)
Case 9
_DrawButton_SetText($btn, 'Farben, Font')
_DrawButton_SetStyle($btn, 16, 400, -1, "Times New Roman", 0xF99922, 0xFFFFFF)
Case 10
_DrawButton_SetText($btn, 'Standard')
_DrawButton_SetStyle($btn, Default, Default, Default, Default, Default, Default)
ConsoleWrite('Ausrichtung: ' & _DrawButton_AlignmentGet($btn) & ': ' & _DrawButton_AlignmentGet($btn, True) & @CRLF)
Case 11
_DrawButton_SetText($btn, 'Top+HCenter')
_DrawButton_AlignmentSet($btn, BitOR($DT_TOP,$DT_CENTER))
ConsoleWrite('Ausrichtung: ' & _DrawButton_AlignmentGet($btn) & ': ' & _DrawButton_AlignmentGet($btn, True) & @CRLF)
Case 12
_DrawButton_SetText($btn, 'Left+VCenter')
_DrawButton_AlignmentSet($btn, BitOR($DT_LEFT,$DT_VCENTER))
ConsoleWrite('Ausrichtung: ' & _DrawButton_AlignmentGet($btn) & ': ' & _DrawButton_AlignmentGet($btn, True) & @CRLF)
Case 13
_DrawButton_SetText($btn, 'Right+VCenter')
_DrawButton_AlignmentSet($btn, BitOR($DT_RIGHT,$DT_VCENTER))
ConsoleWrite('Ausrichtung: ' & _DrawButton_AlignmentGet($btn) & ': ' & _DrawButton_AlignmentGet($btn, True) & @CRLF)
Case 14
_DrawButton_SetText($btn, 'Bottom+HCenter')
_DrawButton_AlignmentSet($btn, BitOR($DT_BOTTOM,$DT_CENTER))
ConsoleWrite('Ausrichtung: ' & _DrawButton_AlignmentGet($btn) & ': ' & _DrawButton_AlignmentGet($btn, True) & @CRLF)
Case 15
_DrawButton_SetText($btn, 'Top+Left')
_DrawButton_AlignmentSet($btn, BitOR($DT_TOP,$DT_LEFT))
ConsoleWrite('Ausrichtung: ' & _DrawButton_AlignmentGet($btn) & ': ' & _DrawButton_AlignmentGet($btn, True) & @CRLF)
Case 16
_DrawButton_SetText($btn, 'Bottom+Right')
_DrawButton_AlignmentSet($btn, BitOR($DT_BOTTOM,$DT_RIGHT))
ConsoleWrite('Ausrichtung: ' & _DrawButton_AlignmentGet($btn) & ': ' & _DrawButton_AlignmentGet($btn, True) & @CRLF)
Case Else
MsgBox(0, 'Button', 'Klick')
EndSwitch
EndIf
Case $GUI_EVENT_RESTORE, $GUI_EVENT_MAXIMIZE
_DrawButton_Draw($btn)
Case -3
Exit
EndSwitch
WEndFunc _WM_MOVE()
[/autoit]
_DrawButton_Draw($btn)
EndFuncEdit:
- Erweitert um 2 Funktionen. Textausrichtung im Button kann gesetzt und abgefragt werden.
- Flag $DT_NOCLIP hinzugefügt (beschleunigt den Vorgang)Edit:
Hier mal ein Bild, wie es aussieht.
Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist. -
Folgendes sollte man so nicht in einer externen Funktion machen:
[autoit]Opt("GUIOnEventMode", 1) ; Zum OnEvent-Mode wechseln
[/autoit]
Opt("MouseCoordMode", 2) ; relative Mauskoordinaten zur AnwendungsflächeDamit kannst du dem Benutzer deiner Funktion das Skript zerschießen.
[autoit]
Gehe immer davon aus, dass der Nutzer eine andere Option verwendet und diese zwingend notwendig für sein Programm ist.
Das realisierst du so:Local $optOld1, $optOld2
[/autoit][autoit][/autoit][autoit]; === vor Skriptzeile, dass diese Option erfordert:
[/autoit][autoit][/autoit][autoit]
$optOld1 = Opt("GUIOnEventMode", 1) ; Zum OnEvent-Mode wechseln
; Code mit dieser Option
; ...
; === Zurücksetzen zur vorherigen Option:
Opt("GUIOnEventMode", $optOld1); === identisch für zweite Option
[/autoit][autoit][/autoit][autoit]; === vor Skriptzeile, dass diese Option erfordert:
[/autoit]
$optOld2 = Opt("MouseCoordMode", 2) ; relative Mauskoordinaten zur Anwendungsfläche
; Code mit dieser Option
; ...
; === Zurücksetzen zur vorherigen Option:
Opt("MouseCoordMode", $optOld2) -
wie bekomm ich nicht die Spalte, sondern nur ein bestimmtes Feld (Zeile 3 Spalte 5) farbig?
Schau dir doch mal mein Beispiel ab Zeile 53 an. Dort erfolgt die Zuordnung.
Was du beachten mußt:
Nach dem Setzen einer Farbe für ein Item wird dieser Farbwert für alle weiteren Item verwendet. Du mußt deshalb den Else-Zweig verwenden um den nicht betroffenen Elementen weiß als Hintergrund zu verpassen.Und wie du siehst, ist es nicht auf ein gaaanz simples Skript zu reduzieren. Eh du ewig probierst - verwende doch die UDF.

-
SetPanelCharacterSet in cvirte.dll nicht gefunden <- ? ??
Wie soll eine Funktion verwendet werden, die es in der DLL gar nicht gibt?
Hier die Funcs aus der DLL:
init_NICard
read_NICard
shutdown_NICard
write_NICard_bitÜbrigens scheint die DLL buggy zu sein. Dependency Walker gibt einige Fehlermeldungen beim Öffnen.
-
Guckst du:
[autoit]$gui = GUICreate('Uhr')
[/autoit][autoit][/autoit][autoit]
$avi = GUICtrlCreateAvi(@WindowsDir & '\clock.avi', 1, 40, 40)
GUISetState()Sleep(1000)
[/autoit][autoit][/autoit][autoit]
GUICtrlSetState($avi, 1)Do
[/autoit]
Until GUIGetMsg() = -3Sprenger120: Wieso sind AVI's das letzte? Etwas sehr pauschale Verunglimpfung. Man muß nur gewisse Regeln beachten.
-
Dann müsste ich die Veränderung doch der entsprechenden Struktur mitteilen - nur wie?
[autoit]
Ja deshalb hatte ich in meiner Funktion ein Array erstellt, dass die Items führt, die zu färben sind und die zu verwendende Farbe.
In der NOTIFY-Funktion hast du ja das Switch-Konstrukt, das du auf mehrer Listview erweitern kanns:Switch $hWndFrom
[/autoit][autoit][/autoit][autoit]
Case $hListView1Case $hListView2
[/autoit][autoit][/autoit][autoit]Case $hListView3
[/autoit]Somit mußt du aber in deinem Array neben Item, SubItem und Farbe auch das Listview-Handle führen. ( $aLV[n][4] )
Der Vorgang (innerhalb WM_NOTIFY-Funktion) ist immer identisch:
- Handle = gesuchtes LV-Handle
- Ereignis VOR Zeichnen Item/SubItem
- Index Item/SubItem aus LV-Struktur auslesen
- Prüfen ob Index/SubIndex in Array enthalten - JA: Werte in Struktur setzenZitat2. Geht das Ganze aufgrund 1. auch ohne WM_Notify, also direkt im Script-Ablauf?
Definitiv: Nein
SubItems lassen sich nur per OWNERDRAW zeichnen. Nur kpl. Items kannst du wie bekannt einfärben. -
Bitte heflt, damit man Edit&Input unterscheiden kann
Das ist beides CLASS:EDIT, somit kannst du sie auf diese Weise nicht unterscheiden. -
Gibts da nen DLLCall oder an welcher Stelle des BugFix-Codes genau wird das Subitem gefärbt? Ich seh da immer nur nen Schwung DllStructGetData, aber keinen DLLCall, bei welchem das ganze wieder an das ListView übergeben wird.
Nein, einen Dll-Call gibt es nicht. Es werden Strukturen verwendet und die Daten dadrin verändert.
Wenn du eine fixe Anzahl an Elementen hast und nur Hintergrundfarben setzen möchtest geht das mit deutlich weniger Aufwand.
Ich mach dir mal ein kleines Bsp. und stelle es rein.Edit: Und hier das Bsp.:
Spoiler anzeigen
[autoit]#include <GUIConstantsEx.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GuiListView.au3>
#include <ListViewConstants.au3>
#include <StructureConstants.au3>
#include <WindowsConstants.au3>$GUI = GUICreate("Listview Farbig", 800, 300)
[/autoit] [autoit][/autoit] [autoit]
$cListView = GUICtrlCreateListView("", 2, 2, 796, 294, -1, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT))
$hListView = GUICtrlGetHandle($cListView)
For $i = 1 To 31
_GUICtrlListView_InsertColumn($hListView, $i-1, $i, 25)
Next
For $i = 0 To 21 ; alle Item/SubItem erstellen
_GUICtrlListView_AddItem($hListView, "", $i)
For $j = 0 To 30
_GUICtrlListView_AddSubItem ($hListView, $i, "", $j)
Next
NextGUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
[/autoit] [autoit][/autoit] [autoit]
GUISetState()While True
[/autoit] [autoit][/autoit] [autoit]
$msg = GUIGetMsg()
Switch $msg
Case -3
ExitLoop
EndSwitch
WEnd
ExitFunc WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $hWndFrom, $iIDFrom, $iCode, $tNMHDR
$tNMHDR = DllStructCreate($tagNMHDR, $lParam)
$hWndFrom = HWnd(DllStructGetData($tNMHDR, "hWndFrom"))
$iIDFrom = DllStructGetData($tNMHDR, "IDFrom")
$iCode = DllStructGetData($tNMHDR, "Code")
Switch $hWndFrom
Case $hListView
Switch $iCode
Case $NM_CUSTOMDRAW
Local $tCustDraw = DllStructCreate($tagNMLVCUSTOMDRAW, $lParam)
Local $iDrawStage, $iItem, $iSubitem, $hDC, $tRect
$iDrawStage = DllStructGetData($tCustDraw, 'dwDrawStage')
Switch $iDrawStage
Case $CDDS_ITEMPREPAINT
Return $CDRF_NOTIFYSUBITEMDRAW
Case BitOR($CDDS_ITEMPREPAINT, $CDDS_SUBITEM)
; Item/SubItem das aktuell gezeichnet werden soll ermitteln
$iItem = DllStructGetData($tCustDraw, 'dwItemSpec')
$iSubitem = DllStructGetData($tCustDraw, 'iSubItem')
; bei fixer Zuordnung z.B. so
Switch $iItem ; Zeilenwahl
Case 0, 5, 10, 15, 20 ; in 5-Zeilenabstand die Zeile rot
DllStructSetData($tCustDraw, 'clrTextBk', RGB2BGR(0xFF0000))
Case Else ; alle anderen weiß
DllStructSetData($tCustDraw, 'clrTextBk', RGB2BGR(0xFFFFFF))
EndSwitch
Switch $iSubitem
Case 5, 6, 12, 13, 19, 20, 26, 27 ; jede 6./7. Spalte blau
DllStructSetData($tCustDraw, 'clrTextBk', RGB2BGR(0x0000FF))
EndSwitch
Return $CDRF_NEWFONT
EndSwitch
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFYFunc RGB2BGR($iColor)
[/autoit]
Local $sH = Hex($iColor,6)
Return '0x' & StringRight($sH, 2) & StringMid($sH,3,2) & StringLeft($sH, 2)
EndFunc -
-
-
müsste das nicht ein vergleichsoperator sein "=="?
In AutoIt ist "=" Zuweisungsoperator und Vergleichsoperator.
Nur füe Stringvergleiche ist für sensitive Prüfung "==" erforderlich. -
Einfach Ereignis "PRIMARYDOWN" nutzen und prüfen ob Cursor über Input:
Spoiler anzeigen
[autoit]#include <GUIConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
Opt("GUIOnEventMode", 1)
$hGUI = GUICreate("Beispiel", 190, 25)
$hInput = GUICtrlCreateInput("Klicken damit eine MsgBox erscheint!", 3, 3, 185)
GUISetOnEvent(-3, "_Exit")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, '_MouseDown')
GUISetState()
ControlSend($hGui, '', $hInput, "{CTRLDOWN}{HOME}{CTRLUP}")While 1
[/autoit] [autoit][/autoit] [autoit]
Sleep(100)
WEndFunc _Exit()
[/autoit] [autoit][/autoit] [autoit]
GUIDelete()
Exit
EndFuncFunc _MouseDown()
[/autoit]
$cursor = GUIGetCursorInfo($hGui)
If $cursor[4] = $hInput Then MsgBox(0, '', 'Und hier die MessageBox!')
EndFunc -
Das Problem hat folgende Ursache:
Wenn in deinem Listview Daten sind sieht das etwa so aus
LV-Index0 | WertA | SubA
LV-Index1 | WertB | SubB
LV-Index2 | WertC | SubC
LV-Index3 | WertD | SubDNehmen wir an, WertCC wird eingefügt (und einsortiert), dann sieht es so aus:
LV-Index0 | WertA | SubA
LV-Index1 | WertB | SubB
LV-Index2 | WertC | SubC
LV-Index3 | WertCC | SubCC
LV-Index4 | WertD | SubDDa die Icons/Images aber dem LV-Index zugeordnet sind, stimmt nun die Zuordnung nicht mehr.
Ich speichere den Index aus der Imageliste einfach mit _GUICtrlListView_SetItemParam() im Item selbst. Somit kann ich bei jeder Änderung aus dem Item selbst den Image-Index auslesen und das Image erneut setzen.