- 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
#include-once
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>
#include <FontConstants.au3>
#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
;==================================================================================================
; 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
;==================================================================================================
; 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
;==================================================================================================
; 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
;==================================================================================================
; 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
;==================================================================================================
; 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
;==================================================================================================
; 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
;==================================================================================================
; 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
Func __RGB2BGR($iColor)
Local $sH = Hex($iColor,6)
Return '0x' & StringRight($sH, 2) & StringMid($sH,3,2) & StringLeft($sH, 2)
EndFunc ;==>__RGB2BGR
Beispiel
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include "DrawButton.au3"
Local $iBorderH = _WinAPI_GetSystemMetrics(6)
Local $imgW = 248, $imgH = 281
Local $mPos, $old
Local $guiMain, $btn
$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)
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
Func _WM_MOVE()
_DrawButton_Draw($btn)
EndFunc
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/