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.
Beiträge von BugFix
-
-
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 -
[autoit]
#include <ButtonConstants.au3>
[/autoit][autoit][/autoit][autoit]
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>$Form1 = GUICreate("Form1", 615, 440, 192, 124)
[/autoit][autoit][/autoit][autoit]
$Button1 = GUICtrlCreateButton("Exit", 496, 384, 81, 33)
$Tab_1 = GUICtrlCreateTab(20,20,450,300)
$Tab_Item_1 = GUICtrlCreateTabItem("TAB 1")
$Tab_Item_2 = GUICtrlCreateTabItem("TAB 2")
$Tab_Item_3 = GUICtrlCreateTabItem("TAB 3")
GUISetState(@SW_SHOW)While 1
[/autoit][autoit][/autoit][autoit]
Switch GUIGetMsg()
Case $tab_1
_TabFunc(GUICtrlRead($tab_1))
Case $Button1, $GUI_EVENT_CLOSE
Exit
EndSwitch
WEndFunc _TabFunc($_Index)
[/autoit]
Msgbox(0,"","Es wurde TabItem-" & $_Index+1 & " angeklickt")
Switch $_Index
Case 0
; Code für TabItem-1 (Index 0)
Case 1
; Code für TabItem-2 (Index 1)
Case 2
; Code für TabItem-3 (Index 2)
EndSwitch
EndFunc -
Einfach mal das Hilfe-Bsp. zu Tab-Item anschauen...

-
Als erstes mag man sich natürlich fragen, wozu man einen Button mit der UDF erstellen sollte. In 99% aller Fälle ist das nicht notwendig und somit sei auch davon abzuraten.

Aber es gibt halt den Fall, dass man z.B. auf einer Rebar einen Button platzieren möchte. Das geht ausschließlich über die Button-UDF (ebenso wie alle Buttontypen wie Radio/Checkbox, Edit und Combo). Das in der Hilfe angeführte Bsp. zur Rebar ist definitiv falsch. Holt man sich, wie dort gezeigt, die Handle von nativ erstellten Ctrl um diese im Rebar einzubetten, werden sie zwar angezeigt, tummeln sich aber alle nach HIDE/SHOW od. MIN/MAX an der Pos. 0,0 übereinander.
Mit den per UDF erstellten Ctrl funktioniert alles wie gewollt.
Aber:
Wie sieht es aus mit Einfärben eines Button? Einfach ID rausfischen mit _WinAPI_GetDlgCtrlID() und auf diese native Colorfunktionen anwenden führt zu nichts.
Hier mal ein Bsp. wie sich das Lösen läßt. Der Style $BS_OWNERDRAW ist dafür erforderlich. Das führt aber auch dazu, dass der Button sich nicht mehr "normal" verhält. Das optische Anklicken habe ich im Bsp. simuliert, kann aber leider auf einer Rebar nicht verwendet werden.
Um ein 3-Dimensionales Aussehen zu erzeugen muss man den linken und oberen Rand hell, den rechten und unteren Rand dunkel färben. Alle wichtigen Details sind im Code kommentiert.Spoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
#include <ButtonConstants.au3>
#include <FontConstants.au3>
#include <GuiButton.au3>
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>Opt('MustDeclareVars', 1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
OnAutoItExitRegister('_OnExit')Global Const $ODA_DRAWENTIRE = 1
[/autoit] [autoit][/autoit] [autoit]
Global Const $ODT_BUTTON = 4Global $hBrush, $hFont, $Gui, $hBtn1, $hBtn2, $bt1, $bt2
[/autoit] [autoit][/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', 20, 20, 70, 22, BitOR($BS_OWNERDRAW,$BS_NOTIFY))
[/autoit] [autoit][/autoit] [autoit]
$hBtn2 = _GUICtrlButton_Create($Gui, 'Button-2', 20, 50, 70, 22, BitOR($BS_OWNERDRAW,$BS_NOTIFY))
Global $aBtnInfo[3][6] = [[2], _ ; == [0][0]=Anzahl, [[Handle-Button, Button-BG-Color, Button-Text-Color(-1=schwarz), Top/Left-Border-Color, Right/Bottom-Border-Color, ArrayPos(rel. in Client)]]
[$hBtn1, 0x00FFFF, 0xFF0000, 0xFAF5F2, 0xC0C0C0, ControlGetPos($Gui, '', _WinAPI_GetDlgCtrlID($hBtn1))], _
[$hBtn2, 0xFF00FF, -1, 0xFAF5F2, 0xC0C0C0, ControlGetPos($Gui, '', _WinAPI_GetDlgCtrlID($hBtn2))]]
; == Man kann das Array auch noch erweitern um Font-Informationen einzeln zu jedem Button zu speichern$bt1 = GUICtrlCreateDummy()
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$bt2 = GUICtrlCreateDummy()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]
Switch GUIGetMsg()
Case -3
Exit
Case $GUI_EVENT_PRIMARYDOWN ; == DOWN- und UP dienen nur zur optischen Darstellung des Buttonklicks
_Event_PrimaryDownUp(1)
Case $GUI_EVENT_PRIMARYUP
_Event_PrimaryDownUp(0)
Case $bt1
ConsoleWrite('Button-1' & @LF)
Case $bt2
ConsoleWrite('Button-2' & @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
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, $iIndex ; == Variablen für Buttonfarben u. Index im Array
_GetBtnColor($hItm, $iColBG, $iColTxt, $iColBorderLT, $iColBorderRB, $iIndex) ; == 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($_iDown)
[/autoit] [autoit][/autoit] [autoit]
Local $oldMode = Opt('MouseCoordMode', 2), $aSize[4], $aMouse = MouseGetPos()
Local $hWndBtn = _GetBtnHwndFromMouse($aMouse[0], $aMouse[1], $aSize)
Opt('MouseCoordMode', $oldMode)
If $hWndBtn = 0 Then Return
Switch $_iDown
Case 0
ControlMove($Gui, '', _WinAPI_GetDlgCtrlID($hWndBtn), $aSize[0]-1, $aSize[1]-1)
Case 1
ControlMove($Gui, '', _WinAPI_GetDlgCtrlID($hWndBtn), $aSize[0]+1, $aSize[1]+1)
EndSwitch
EndFunc ;==>_Event_PrimaryDownUpFunc _GetBtnColor($_hWnd, ByRef $_iColBG, ByRef $_iColTxt, ByRef $_iColBorderLT, ByRef $_iColBorderRB, ByRef $_iIndex)
[/autoit] [autoit][/autoit] [autoit]
For $i = 1 To $aBtnInfo[0][0]
If $aBtnInfo[$i][0] = $_hWnd Then
$_iColBG = $aBtnInfo[$i][1]
$_iColTxt = $aBtnInfo[$i][2]
If $aBtnInfo[$i][2] = -1 Then $aBtnInfo[$i][2] = 0x000000
$_iColBorderLT = $aBtnInfo[$i][3]
$_iColBorderRB = $aBtnInfo[$i][4]
$_iIndex = $aBtnInfo[$i][5]
Return
EndIf
Next
EndFunc ;==>_GetBtnColorFunc _GetBtnHwndFromMouse($_iX, $_iY, ByRef $_aSize)
[/autoit] [autoit][/autoit] [autoit]
Local $aCtrl
For $i = 1 To $aBtnInfo[0][0]
$aCtrl = $aBtnInfo[$i][5]
If ($aCtrl[0] <= $_iX And $_iX <= $aCtrl[2]+$aCtrl[0]) And ($aCtrl[1] <= $_iY And $_iY <= $aCtrl[3]+$aCtrl[1]) Then
$_aSize = $aCtrl
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 -
Was macht denn dieses Forum so einzigartig? Nun, unter anderem die Tatsache, dass es hier fast ausschließlich um AutoIt geht. Somit haben wir einen gemeinsamen Nenner für alle User. Der “Geist“ des Forums, der hier im Laufe der Jahre herangewachsen ist, verbindet dies zu einem untrennbaren Ganzen. So etwas kann man nicht mal eben kopieren. Zumal ich überzeugt bin, dass die persönlichen Macken der User (meine eingeschlossen)
ein nicht unerheblicher Grund für die Besonderheit unseres Forums sind.
Insofern denke ich nicht, dass eine AutoIt-Sparte innerhalb eines anderen Forums genauso erfolgreich sein könnte. -
Eine Brute-Force Attacke um die Lösung herauszufinden zeugt von geistiger Armut und widerspricht mit Sicherheit nicht nur unseren Forenregeln.
Thema wird nicht freigegeben!
-
"Like"-Button automatisiert anzuklicken widerspricht garantiert den Regeln aller Seitenanbieter.
Somit gebe ich dieses Thema nicht zur Hilfe frei, sondern aktiviere es nur, damit du diese Info auch realisierst. -
Oh Mist, immer diese fehlerhaften Beschreibungen. In der Hilfe steht, dass Height=Höhe des Controls ist und nicht der Listbox. Denn deren Werte kann ich ja mit anderen Funktionen munter einstellen.
Was solls - Danke dir. -
Hi,
ich muß für eine Anwendung leider auf die Erstellung einer Combobox über die Funktion _GuiCtrlComboBoxEx_Create() zurückgreifen. Nur damit kann eine Combo auf einer Rebar angezeigt werden (und verschwindet nicht nach minimieren/wiederherstellen).
[autoit]
Leider ist es mir nicht möglich mehrere Item in der Box anzuzeigen. Standardstyle ist $CBS_DROPDOWN + $WS_VSCROLL. Obwohl die Funktion ..._AddString() die Indizes der neu erstellten Item zurückgibt sind diese nicht sichtbar. Die Liste der ComboBox lässt sich nicht ausklappen. Die Funktion _GUICtrlComboBoxEx_SetCurSel() wählt den gewünschten Wert aus, was beweist, dass die Werte in der Liste sind.
Wo liegt da der Hund begraben?
#include <Constants.au3>
[/autoit][autoit][/autoit][autoit]
#include <GuiComboBoxEx.au3>$Gui = GUICreate("Test")
[/autoit][autoit][/autoit][autoit]
$hCombo = _GUICtrlComboBoxEx_Create($Gui, '', 0, 0, 200, 20)$sCombo = "01.02.2012|02.02.2012|03.02.2012|05.02.2012|06.02.2012|08.02.2012|09.02.2012"
[/autoit][autoit][/autoit][autoit]
_GuiComboSetData($hCombo, $sCombo, "08.02.2012")GUISetState()
[/autoit][autoit][/autoit][autoit]Do
[/autoit][autoit][/autoit][autoit][/autoit][autoit]
Until GUIGetMsg() = -3Func _GuiComboSetData($_hCombo, $_sItemString, $_sVisibleItem)
[/autoit]
If StringLeft($_sItemString, 1) = '|' Then
_GUICtrlComboBoxEx_ResetContent($_hCombo)
$_sItemString = StringTrimLeft($_sItemString, 1)
EndIf
Local $aItem = StringSplit($_sItemString, '|'), $index, $iTop = -1
For $i = 1 To $aItem[0]
$index = _GUICtrlComboBoxEx_AddString($_hCombo, $aItem[$i])
;~ ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $index = ' & $index & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
If $iTop <> -1 Then ContinueLoop
If $aItem[$i] = $_sVisibleItem Then $iTop = $index
Next
_GUICtrlComboBoxEx_SetCurSel($_hCombo, $iTop)
EndFunc -
Bitte setz das Thema auf "gelöst" (im Startpost Präfix editieren).
-
Deine Lösung war das, was ich meinte: Collection erstellen und nach dem Ziel iterieren.
Der Coder sollte Tags für "name" vergeben, dann hättest du nur noch 2..3 Zeilen Code.
-
Wie kommt ihr drauf, das es seine Seite ist?
Öhhhm...
Stimmt, hat er ja geschrieben.
Aber wer um Himmels Willen schreibt solch einen Müll von html-Code? " " zeugt von der Unfähigkeit sich bestehenden html-Normen zu unterwerfen. Sowas gehört einfach in keinen Code. -
Du solltest deine Webseite auf jeden Fall umarbeiten. Da du mit den _IE-Funktionen arbeiten möchtest wirst du mit dem aktuellen Inhalt das Problem haben, dass die Inhalte vom InternetExplorer geblockt werden, selbst wenn der User alle Sicherheitsschranken auf minimal stellt.
Du solltest deshalb auf eine Browserunabhängige Lösung umstellen. Bin da nicht der Experte, aber über ein php-Skript sollte sich dein Vorhaben besser regeln lassen. -
Hier herrscht keine Zensur, sondern es gelten Forenregeln, gegen die du damit verstoßen hast.
Also mäßige dich oder (was ich im Moment als besser erachte) verlaß freiwillig dieses Forum. Auf deine Gesellschaft legen wir keinen gesteigerten Wert.
Sorry, wenn ich so direkt bin - aber Diplomatie liegt mir nicht. -
Letzter Aufruf!
Entferne sofort die Links aus deiner Signatur, anderenfalls wird dein Account gesperrt!
-
Guckst du hier: Farbraumrechner
-
Unten Rechts ist nicht zu empfehlen da einei Antivieren programme "Avast Glaub" und Avira sowieso Unten rechts ihre "Mitteilungs Boxen" hat
[OT]
Wie kommt ihr eigentlich darauf, dass man die Taskbar unten hat? Bei mir ist sie entweder links oder oben - je nach Monitorgröße (Widescreen-links, sonst oben).
[/OT] -
Kann man das auch so umschreiben, dass ich das gleiche Ergebnis auch mit einem einfachen Linksklick erreichen kann?
[autoit]
Steht doch alles in der Hilfe (UDF _GUICtrlListview_Create )
Dort findest du in der $iCode-Auswertung etwa dieses:Case $NM_CLICK ; Sent by a list-view control when the user clicks an item with the left mouse button
[/autoit]
Local $tInfo = DllStructCreate($tagNMITEMACTIVATE, $ilParam)
Local $aInfo[12] = [$hWndFrom, _
$iIDFrom, _
$iCode, _
DllStructGetData($tInfo, "Index"), _
DllStructGetData($tInfo, "SubItem"), _
DllStructGetData($tInfo, "NewState"), _
DllStructGetData($tInfo, "OldState"), _
DllStructGetData($tInfo, "Changed"), _
DllStructGetData($tInfo, "ActionX"), _
DllStructGetData($tInfo, "ActionY"), _
DllStructGetData($tInfo, "lParam"), _
DllStructGetData($tInfo, "KeyFlags")]