"DrawButton" - Rect als Button

    • Offizieller Beitrag

    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
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include <FontConstants.au3>

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

    #region - "Button"-Funktionen
    ;==================================================================================================
    ; 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
    #endregion

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

    Func __RGB2BGR($iColor)
    Local $sH = Hex($iColor,6)
    Return '0x' & StringRight($sH, 2) & StringMid($sH,3,2) & StringLeft($sH, 2)
    EndFunc ;==>__RGB2BGR

    [/autoit]
    Beispiel
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>
    #include "DrawButton.au3"

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

    Local $iBorderH = _WinAPI_GetSystemMetrics(6)
    Local $imgW = 248, $imgH = 281
    Local $mPos, $old
    Local $guiMain, $btn

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

    $guiMain = GUICreate('Test', $imgW, $imgH, -1, -1)
    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)

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

    GUIRegisterMsg($WM_MOVE, '_WM_MOVE')

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

    _DrawButton_Draw($btn)

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

    $zaehler = 0
    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
    WEnd

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

    Func _WM_MOVE()
    _DrawButton_Draw($btn)
    EndFunc

    [/autoit]

    Edit:
    - 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.
    autoit.de/wcf/attachment/10508/

    • Offizieller Beitrag

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

    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.

  • Zitat

    Wenn du ein Bild auf dem Button möchtest kannst du doch einen Button mit $BS_ICON oder $BS_BITMAP -Style erstellen.


    Das weiß ich
    Nur will ich keinen "echten" Button sondern einen transparenten
    z.B. für rund ausgeschnittene Bilder
    damit da kein Rahmen drum ist