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

Beiträge von Trolleule1337

  • OnEventMode - GUI anhalten bis GUI geschlossen wird

    • Trolleule1337
    • 31. Oktober 2014 um 00:25

    Danke Jungs, diese Interrupting a running function https://www.autoitscript.com/wiki/Interrupt…unning_function und Managing Multiple GUIs https://www.autoitscript.com/wiki/Managing_Multiple_GUIs Geschichte kann je nach Situation echt kompliziert werden. Habe zum Glück zu meiner Situation eine passende Lösung gefunden, inspiriert habe ich mich dabei an _ArrayDisplay().

    [autoit]

    #include-once

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

    Func SuccessesErrorsGUI($gui, $oErrorList, $oSuccessList)

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

    #Region - Take Screenshot
    _GDIPlus_Startup()
    Local $hBmp = _ScreenCapture_CaptureWnd("", $gui, 0, 0, -1, -1, False) ; create screenshot of gui without cursor
    Local $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
    Local $iX = _GDIPlus_ImageGetWidth($hBitmap)
    Local $iY = _GDIPlus_ImageGetHeight($hBitmap)
    Local $hResizedBitmap = _GDIPlus_ImageResize($hBitmap, $iX-($iX*0.65), $iY-($iX*0.65))

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

    ; release data
    _GDIPlus_BitmapDispose($hBitmap)
    _WinAPI_DeleteObject($hBmp)
    #EndRegion - Take Screenshot

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

    Local $hGUI = GUICreate("Show Successes/Errors", 240, 130 ,-1, -1) ; will create a dialog box that when displayed is centered
    Local $oSuccessesErrors = ObjCreate("Scripting.Dictionary")
    $oSuccessesErrors.add("bExpand", False)
    $oSuccessesErrors.add("hBitmap", $hResizedBitmap)
    Local $oCoord = _Coord_GetDimensions($hGUI, 0, True) ; get proper coordinates
    Opt("GUICoordMode", 1) ; absolute position
    Local $idSuccessButton = GUICtrlCreateButton("Successes", $oCoord("g1_left"), 10, 180, 50, $BS_COMMANDLINK)
    _GUICtrlButton_SetImage(_GUIGetLastCtrlID(), "ieframe.dll", 38, False)
    _GUICtrlButton_SetNote(_GUIGetLastCtrlID(), "Count: " & $oSuccessList.Count)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    Opt("GUICoordMode", 2) ; relative to cell mode
    Local $idErrorButton = GUICtrlCreateButton("Errors", -1, 10, 180, 50, $BS_COMMANDLINK)
    _GUICtrlButton_SetImage(_GUIGetLastCtrlID(), "imageres.dll", 93, False)
    _GUICtrlButton_SetNote(_GUIGetLastCtrlID(), "Count: " & $oErrorList.Count)
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    GUISetState(@SW_SHOW)

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

    ; switch to GetMessage mode
    Local $iOnEventMode = Opt("GUIOnEventMode", 0)
    Local $iMsg, $oSuccessesErrorsList

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

    $oSuccessesErrors.add("idPrevButton", 0)
    $oSuccessesErrors.add("idNextButton", 0)
    $oSuccessesErrors.add("idEdit", 0)
    $oSuccessesErrors.add("sText", 0)

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

    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case $idSuccessButton
    $oSuccessesErrorsList = $oSuccessList
    $oSuccessesErrors("sText") = "Successes"
    ResizeGUI($oSuccessesErrors)
    Case $idErrorButton
    $oSuccessesErrorsList = $oErrorList
    $oSuccessesErrors("sText") = "Errors"
    ResizeGUI($oSuccessesErrors)
    Case $oSuccessesErrors("idPrevButton")
    If IsHWnd(GUICtrlGetHandle($oSuccessesErrors("idPrevButton"))) Then ToggleMsg($oSuccessesErrors, $oSuccessesErrorsList, -1)
    Case $oSuccessesErrors("idNextButton")
    If IsHWnd(GUICtrlGetHandle($oSuccessesErrors("idNextButton"))) Then ToggleMsg($oSuccessesErrors, $oSuccessesErrorsList, 1)
    Case -3
    ExitLoop
    EndSwitch
    WEnd

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

    ; clear up
    GUIDelete($hGUI)
    Opt("GUIOnEventMode", $iOnEventMode) ; reset original GUI mode
    EndFunc

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

    Func ResizeGUI(ByRef $oSuccessesErrors)
    If $oSuccessesErrors("bExpand") = False Then ExpandGUI($oSuccessesErrors, Ptr($oSuccessesErrors("hBitmap"))) ; expand GUI first time
    $oSuccessesErrors("bExpand") = True
    #Region - Reset toggle data
    _Dict_UpdateSetKey($oSuccessesErrors, "iIndex", 0)
    _Dict_UpdateSetKey($oSuccessesErrors, "iLastDirection", 0)
    #EndRegion - Reset toggle data
    GUICtrlSetData($oSuccessesErrors("idGroup"), $oSuccessesErrors("sText")) ; update group text
    GUICtrlSetData($oSuccessesErrors("idEdit"), "") ; reset edit text
    EndFunc

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

    Func ExpandGUI(ByRef $oSuccessesErrors, $hBitmap)
    WinMove("", "", Default, Default, 430, 500)
    Local $iTHICKFRAME = 7 ; border of thickframe
    Local $oCoord = _Coord_GetDimensions(WinGetHandle("", ""), 0, True) ; get proper coordinates of resized window
    $oSuccessesErrors.add("idGroup", GUICtrlCreateGroup("", -1, 50, $oCoord("g1_width"), $oCoord("GuiClient_height")-50*2-10-10-50-$oCoord("ctrl_s2")*2-35))
    Local $aPos = ControlGetPos("", "", _GUIGetLastCtrlID())
    $oSuccessesErrors("idPrevButton") = GUICtrlCreateButton("", -1, $oCoord("ctrl_s2"), 35, 35, $BS_COMMANDLINK)
    _GUICtrlButton_SetImage(_GUIGetLastCtrlID(), "wmploc.dll", 201)
    $oSuccessesErrors("idNextButton") = GUICtrlCreateButton("", $oCoord("g1_width")-35*2, -1, 35, 35, $BS_COMMANDLINK)
    _GUICtrlButton_SetImage(_GUIGetLastCtrlID(), "wmploc.dll", 200)
    Opt("GUICoordMode", 1) ; absolute position
    Local $iWidth = _GDIPlus_ImageGetWidth($hBitmap) ; get new width
    Local $iHeight = _GDIPlus_ImageGetHeight($hBitmap) ; get new height
    Local $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmap) ; convert bitmap object to bitmap handle
    Local $idPic = GUICtrlCreatePic("", $oCoord("g1_width")+$oCoord("g1_left")-$iWidth-$iTHICKFRAME*2, 10, $iWidth, $iHeight, $WS_THICKFRAME)
    GUICtrlSendMsg(-1, $STM_SETIMAGE, $IMAGE_BITMAP, $hBmp)
    $oSuccessesErrors("idEdit") = GUICtrlCreateEdit("", $oCoord("g2_left"), $aPos[1]+$oCoord("g1_top"), $oCoord("g1_width")-$oCoord("g2_left"), $aPos[3]-$oCoord("g1_top")*2, _
    BitOR($ES_WANTRETURN,$WS_BORDER))

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

    ; release data
    _GDIPlus_BitmapDispose($hBitmap)
    _WinAPI_DeleteObject($hBmp)
    _GDIPlus_Shutdown()
    EndFunc

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

    Func ToggleMsg(Byref $oSuccessesErrors, $oSuccessesErrorsList, $iDirection)
    If $oSuccessesErrors("iLastDirection") = $iDirection And $oSuccessesErrors("iIndex")+$iDirection >= $oSuccessesErrorsList.Count Then Return ; if out of index
    If $oSuccessesErrors("iIndex")+$iDirection < 0 Then Return
    If $oSuccessesErrors("iLastDirection") <> 0 Then $oSuccessesErrors("iIndex")+=$iDirection ; chnage index second time
    GUICtrlSetData($oSuccessesErrors("idEdit"), $oSuccessesErrorsList.Item($oSuccessesErrors("iIndex"))) ; override message with new message
    $oSuccessesErrors("iLastDirection") = $iDirection
    EndFunc

    [/autoit]

    Schickes GUI, was in einer OnEvent Funktion aufgerufen (hier nicht mit aufgeführt) wird und auf Interaktion wartet. Wird die GUI geschlossen werden die restlichen Befehle in der Funktion abgearbeitet. Außerhalb der GUI ist der OnEventMode nach wie vor aktiv.

    @Matricus Die GUI vorher zu laden halte ich für ineffizient. (Offtopic) Ich denke dabei gerade an eine javascript library, die ich in meine Seite einbinden möchte, die aber nur an bestimmten Stellen eingebunden werden sollen und nicht bei jedem Seitenaufruf -> ineffizient. :huh:

  • OnEventMode - GUI anhalten bis GUI geschlossen wird

    • Trolleule1337
    • 30. Oktober 2014 um 03:55

    Grüßt euch erstmal,

    ich hab hier ein Skript was erstmal nichts spannendes macht außer 2 GUIs anzuzeigen. Jetzt habe ich das Problem, dass wenn ich in Zeile 51 ankomme, er sofort nachdem er mit gui2() durch ist, die nachfolgenden Befehle abarbeitet, also hier die MessageBox. Mal angenommen ich möchte mein gui2() solange pausieren, bis es geschlossen wird, aber trotzdem die Möglichkeit haben, meine registrierten Funktionen in gui2 zu benutzen und das danach (nachdem gui2 geschlossen wurde) erst die MessageBox und nachfolgende Befehle ausgeführt werden. Wie könnte man das realisieren?

    [autoit]

    #include <GUIConstantsEx.au3>

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

    Opt("GUIOnEventMode", 1)

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

    Global $hGUI1, $hGUI2 = 9999, $hButton1, $hButton2, $hButton3 = 9999 ; Predeclare the variables with dummy values to prevent firing the Case statements

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

    gui1()

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

    Func gui1()
    $hGUI1 = GUICreate("Gui 1", 200, 200, 100, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close") ; Call a common GUI close function
    $hButton1 = GUICtrlCreateButton("Msgbox 1", 10, 10, 80, 30)
    GUICtrlSetOnEvent(-1, "On_Button") ; Call a common button function
    $hButton2 = GUICtrlCreateButton("Show Gui 2", 10, 60, 80, 30)
    GUICtrlSetOnEvent(-1, "On_Button") ; Call a common button function
    GUISetState()

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

    While 1
    Sleep(10)
    WEnd
    EndFunc ;==>gui1

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

    Func gui2()
    $hGUI2 = GUICreate("Gui 2", 200, 200, 350, 350, -1, -1, $hGUI1)
    GUISetOnEvent($GUI_EVENT_CLOSE, "On_Close") ; Call a common GUI close function
    $hButton3 = GUICtrlCreateButton("MsgBox 2", 10, 10, 80, 30)
    GUICtrlSetOnEvent(-1, "On_Button") ; Call a common button function
    GUISetState()

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

    ;~ While 1
    ;~ Sleep(10)
    ;~ WEnd
    EndFunc ;==>gui2

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

    Func On_Close()
    Switch @GUI_WINHANDLE ; See which GUI sent the CLOSE message
    Case $hGUI1
    Exit ; If it was this GUI - we exit <<<<<<<<<<<<<<<
    Case $hGUI2
    GUIDelete($hGUI2) ; If it was this GUI - we just delete the GUI <<<<<<<<<<<<<<<
    GUICtrlSetState($hButton2, $GUI_ENABLE)
    EndSwitch
    EndFunc

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

    Func On_Button()
    Switch @GUI_CTRLID ; See which button sent the message
    Case $hButton1
    MessageBox(1) ; We can call a function with parameters here <<<<<<<<<<<<<<<<<<<
    Case $hButton2
    GUICtrlSetState($hButton2, $GUI_DISABLE)
    gui2()
    ; hier pausieren, bis gui2() geschlossen wurde, aber es muss möglich sein die registrierten Funktionen in gui2 zu benutzen
    ;~ While 1
    ;~ Sleep(10)
    ;~ WEnd
    MsgBox(0, "sfdsf", "sdfsfd") ; hier weiter machen, nachdem gui2 nicht mehr benötigt wird (geschlossen wurde)
    Case $hButton3
    MessageBox(2) ; We can call a function with parameters here <<<<<<<<<<<<<<<<<<<
    EndSwitch
    EndFunc

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

    Func MessageBox($iIndex)
    MsgBox("", "MsgBox " & $iIndex, "Test from Gui " & $iIndex)
    EndFunc

    [/autoit]
  • Abgerundetes Rechteck mit _WINAPI_RoundRect()

    • Trolleule1337
    • 25. Oktober 2014 um 23:56

    Danke für die Mühen UEZ!!, es macht was es soll, aber genau genommen ist es nicht transparent, du hast als Füllfarbe die GUI Farbe genommen. Ich habe immer noch nicht rausgefunden wie man Bitmaps transparent macht sofern das überhaupt möglich ist. Ich belasse es dabei und bedanke mich herzlich!

  • Abgerundetes Rechteck mit _WINAPI_RoundRect()

    • Trolleule1337
    • 25. Oktober 2014 um 03:42

    Die Variante ist nicht schlecht, vor allem weil man kein WM_PAINT registrieren muss, vielen Dank.

    Habe mich jetzt in eine weitere Variante verbissen, die ich unbedingt zum laufen bringen möchte, aber komme nicht weiter. Hier erstelle ich mit _WinAPI_CreateDIBSection() das bitmap handle. Jetzt muss nur noch irgendwas mit alpha channel gemacht werden, damit das bitmap transparent ist, aber ich verzweifel an der sache. Kannst du mal bitte drüber schauen, skript ist vom _WinAPI_CreateDIBSection() example aus der Hilfe.

    [autoit]

    #include <APIGdiConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WinAPIGdi.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPI.au3>
    #include <WindowsConstants.au3>

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

    ; Create 32 bits-per-pixel device-independent bitmap (DIB) that use a mask
    Local $tBIV5HDR = DllStructCreate($tagBITMAPV5HEADER)

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

    DllStructSetData($tBIV5HDR, 'bV5Size', DllStructGetSize($tBIV5HDR))
    DllStructSetData($tBIV5HDR, 'bV5Width', 100)
    DllStructSetData($tBIV5HDR, 'bV5Height', 100)
    DllStructSetData($tBIV5HDR, 'bV5Planes', 1)
    DllStructSetData($tBIV5HDR, 'bV5BitCount', 32)
    DllStructSetData($tBIV5HDR, 'biCompression', $BI_BITFIELDS)
    DllStructSetData($tBIV5HDR, 'bV5SizeImage', 0)
    DllStructSetData($tBIV5HDR, 'bV5XPelsPerMeter', 0)
    DllStructSetData($tBIV5HDR, 'bV5YPelsPerMeter', 0)
    DllStructSetData($tBIV5HDR, 'bV5ClrUsed', 0)
    DllStructSetData($tBIV5HDR, 'bV5ClrImportant', 0)
    ;~ DllStructSetData($tBIV5HDR, 'bV5RedMask', 0x00FF0000)
    ;~ DllStructSetData($tBIV5HDR, 'bV5GreenMask', 0x0000FF00)
    ;~ DllStructSetData($tBIV5HDR, 'bV5BlueMask', 0x000000FF)
    DllStructSetData($tBIV5HDR, 'bV5AlphaMask', 0xFF000000)
    DllStructSetData($tBIV5HDR, 'bV5CSType', 0)
    DllStructSetData($tBIV5HDR, 'bV5Endpoints', 0, 1)
    DllStructSetData($tBIV5HDR, 'bV5Endpoints', 0, 2)
    DllStructSetData($tBIV5HDR, 'bV5Endpoints', 0, 3)
    DllStructSetData($tBIV5HDR, 'bV5GammaRed', 0)
    DllStructSetData($tBIV5HDR, 'bV5GammaGreen', 0)
    DllStructSetData($tBIV5HDR, 'bV5GammaBlue', 0)
    DllStructSetData($tBIV5HDR, 'bV5Intent', 0)
    DllStructSetData($tBIV5HDR, 'bV5ProfileData', 0)
    DllStructSetData($tBIV5HDR, 'bV5ProfileSize', 0)
    DllStructSetData($tBIV5HDR, 'bV5Reserved', 0)

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

    ; Create GUI
    Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), 256, 256)
    Local $idPic = GUICtrlCreatePic('', 0, 0, 80, 80)
    Local $hPic = GUICtrlGetHandle($idPic)

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

    $g_hDC = _WinAPI_GetDC($hForm)
    $g_hDC_Backbuffer = _WinAPI_CreateCompatibleDC($g_hDC)

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

    Local $pBits
    Local $hBitmap = _WinAPI_CreateDIBSection(0, $tBIV5HDR, $DIB_RGB_COLORS, $pBits)

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

    ;~ ; Fill bitmap green with variable alpha channel
    Local $tBits = DllStructCreate('dword[65536]', $pBits)
    For $y = 0 To 99
    For $x = 1 To 100
    DllStructSetData($tBits, 1, BitOR(0xFF000000, BitShift($y, -32)), $x + (100 * $y))
    Next
    Next

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

    Local $hSv = _WinAPI_SelectObject($g_hDC_Backbuffer, $hBitmap)

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

    $hbrush = _WinAPI_CreateSolidBrush(0xF0CAA6)
    Local $test = _WinAPI_SelectObject($g_hDC_Backbuffer, $hbrush)
    $tRECT = _WinAPI_CreateRect(0, 0, 80, 80)
    _WinAPI_RoundRect($g_hDC_Backbuffer, $tRECT, 20, 20)

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

    _WinAPI_DeleteObject($test)
    _WinAPI_ReleaseDC($hForm, $g_hDC)
    _WinAPI_DeleteDC($g_hDC_Backbuffer)

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

    ; Set bitmap to control
    _SendMessage($hPic, $STM_SETIMAGE, 0, $hBitmap)
    Local $hObj = _SendMessage($hPic, $STM_GETIMAGE)
    If $hObj <> $hBitmap Then
    _WinAPI_DeleteObject($hBitmap)
    EndIf

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

    ; Set background color to green and show GUI
    ;~ GUISetBkColor(0x0000FF)
    GUISetState(@SW_SHOW)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit]
  • Abgerundetes Rechteck mit _WINAPI_RoundRect()

    • Trolleule1337
    • 24. Oktober 2014 um 18:50

    Hi,
    ich habe das Beispiel aus der Hilfe für _WINAPI_RoundRect() verwendet und es aufs nötigste gekürzt (möchte lediglich ein Rechteck mit runden Ecken und in Farbe), verstehe aber nicht wieso ich Zeile 15, 16 benötige, damit er das Rechteck anzeigt. Der Teil mit dem Merge Bitmap ebenfalls. Kann das jemand bitte mal umschreiben, dass ich nur das gerundete Rechteck habe und es dann dem Pic Control zuweisen kann?


    [autoit]

    #include <APIGdiConstants.au3>
    #include <FontConstants.au3>
    #include <StaticConstants.au3>
    #include <WinAPIGdi.au3>
    #include <WindowsConstants.au3>

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

    ; Create GUI
    Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'), 400, 400)
    Local $idPic = GUICtrlCreatePic('', 0, 0, 60, 60)
    Local $hPic = GUICtrlGetHandle($idPic)

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

    ; Create bitmap
    Local $hDev = _WinAPI_GetDC($hPic)
    Local $hDC = _WinAPI_CreateCompatibleDC($hDev)
    Local $hSource = _WinAPI_CreateCompatibleBitmapEx($hDev, 400, 400, _WinAPI_SwitchColor(_WinAPI_GetSysColor($COLOR_3DFACE)))
    Local $hSv = _WinAPI_SelectObject($hDC, $hSource)

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

    ; Draw objects
    Local $hOldBrush = _WinAPI_SelectObject($hDC, _WinAPI_GetStockObject($DC_BRUSH))
    Local $hOldPen = _WinAPI_SelectObject($hDC, _WinAPI_GetStockObject($DC_PEN))
    _WinAPI_SetDCBrushColor($hDC, 0x990404)
    _WinAPI_SetDCPenColor($hDC, 0x990404)
    $tRECT = _WinAPI_CreateRect(0, 0, 140, 90)
    _WinAPI_OffsetRect($tRECT, 220, 279)
    _WinAPI_RoundRect($hDC, $tRECT, 20, 20)

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

    ; Merge bitmap
    Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDev, 400, 400)
    $hBrush = _WinAPI_SelectObject($hDC, $hOldBrush)
    _WinAPI_DeleteObject($hBrush)
    Local $hPen = _WinAPI_SelectObject($hDC, $hOldPen)
    _WinAPI_DeleteObject($hPen)
    _WinAPI_SelectObject($hDC, $hBitmap)
    _WinAPI_DrawBitmap($hDC, 0, 0, $hSource, $MERGECOPY)
    _WinAPI_ReleaseDC($hPic, $hDev)
    _WinAPI_SelectObject($hDC, $hSv)
    _WinAPI_DeleteObject($hSource)
    _WinAPI_DeleteDC($hDC)

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

    ; Set bitmap to control
    _SendMessage($hPic, $STM_SETIMAGE, 0, $hBitmap)
    $hObj = _SendMessage($hPic, $STM_GETIMAGE)
    If $hObj <> $hBitmap Then
    _WinAPI_DeleteObject($hBitmap)
    EndIf

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

    GUISetState(@SW_SHOW)

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

    Do
    Until GUIGetMsg() = -3

    [/autoit]
  • GUIOnEventMode verursacht CPU Last 25% -> Bug?

    • Trolleule1337
    • 13. Oktober 2014 um 09:24

    Ach sorry, ich bin immer so vergesslich...

    So sieht meine Schleife aus:

    [autoit]

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit]

    Wenn ich mich richtig informiert habe, sollte eigentlich bereits das GUIGetMsg() für einen break sorgen, nicht?

  • GUIOnEventMode verursacht CPU Last 25% -> Bug?

    • Trolleule1337
    • 13. Oktober 2014 um 02:02

    Hi,
    ich weiß ja das sich ein Skript in einer ständigen loop befindet um das Beenden des Skripts zu verhindern, aber ist oben genanntes normal -> ist mir heute zum ersten mal aufgefallen, obwohl ich jeden Tag mit AutoIT arbeite

  • WM_PAINT friert ListView ein

    • Trolleule1337
    • 10. Oktober 2014 um 16:23

    Aus irgendeinem Grund wird kein WM_DRAWITEM message mehr gesendet, wenn WM_NOTIFY und WM_DRAWITEM aktiv sind. Wenn ich die Spaltenbreite ändere, löscht er die Items und anschließend wird kein WM_DRAWITEM mehr gesendet, da ja kein Item mehr vorhanden ist.

    Die Ursache versteh ich nun, aber ich finde keine Lösung... ?(

  • WM_PAINT friert ListView ein

    • Trolleule1337
    • 10. Oktober 2014 um 01:59

    Ich hab etwas am ListView Progress Beispiel von rasim rumgebastelt, schaffe es aber nicht, das Ganze im Ownerdraw Modus zum laufen zu bringen. Das Script scheint robust zu sein, stürzt nie ab, wird aber nun durch das setzen des Ownerdraw style nicht mehr korrekt gezeichnet, genauso wie die Controls.

    Du sagtest du schaust dir das morgen mal an, darauf würde ich gerne zurück kommen. Im Anhang das Script zum testen. Kommentiere mal GUIRegisterMsg($WM_DRAWITEM, "WM_DRAWITEM") aus und du siehst wie flüssig, das Ganze läuft und dann aktiviere es wieder, ich weiß echt nicht weiter ?(

    Dateien

    ListView_Progress_ohneProc.au3 8,47 kB – 378 Downloads Example.au3 2,72 kB – 384 Downloads
  • WM_PAINT friert ListView ein

    • Trolleule1337
    • 9. Oktober 2014 um 22:49

    Der Thread war mir bekannt, das Beispiel habe ich damals als Basis benutzt. Hab mir das Beispiel aber gerade nochmal gründlich angeguckt und sehe, dass ich damals einige wichtige Codeabschnitte ausgelassen habe.

    Er benutzt als Trigger das WM_NOTIFY event und die Notifications $HDN_ITEMCHANGED, $HDN_ITEMCHANGEDW, $LVN_ENDSCROLL, um die Controls zu verschieben, so habe ich das aktuell im Einsatz. Bei mir bin ich aber an einem Punkt angelangt, wo AUtoIT anfängt langsam zu werden und zu ruckeln, da ich viele extra Controls im ListView habe und daher kam der Gedanke, das Ganze mal zu optimieren und zwar mit WM_PAINT als trigger.

    Bin gerade aber auf eine interessante Entdeckung gestoßen und werde an der alten Methode mit WM_NOTIFY weiter basteln. Ich meld mich, wenn ich mit dem testen fertig bin. Danke für die Anregung :thumbup:

  • WM_PAINT friert ListView ein

    • Trolleule1337
    • 9. Oktober 2014 um 19:26

    Ich benutze Windows 7 SP1 x86. Sorry ich vergaß zu erwähen, dass die GUI einfriert, sobald ich das ListView fordere, also scrolle oder die Spaltenbreite verändere. Der Plan ist es ja später, dass sich die Controls automatisch verschieben, sobald man scrollt oder die Splatenbreite verändert.

    Schau dir mal den Original Code in C# an, ich habe das event genauso abgefangen wie er, aber egal was ich anstelle, die GUI friert ein. Die Datei befindet sich im Anhang, schau dir den Teil an wo der Autor die Prozedur overrided.

    Dateien

    ListViewEx.txt 7,33 kB – 447 Downloads
  • WM_PAINT friert ListView ein

    • Trolleule1337
    • 9. Oktober 2014 um 17:57

    Hi,
    ich habe die Window Prozedur von meinem ListView Control abgeleitet um das WM_PAINT event abzufangen um dort dann eine Positionsberechnung+Verschieben von Controls durchzuführen. Allerdings friert die GUI bereits bei einem einfachen Aufruf von _GUICtrlListView_GetItemRectEx($hWnd, $i, $LVIR_BOUNDS) ein. Der Code Auszug enthält nur das nötigste und trotzdem friert mir die GUI ein, hat jemand eine Idee woran das liegt? Durch Minimieren taut es übrigens wieder auf.

    Die Idee habe ich von hier:
    Embedding Controls in a ListView


    [autoit]

    #include <GuiListView.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

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

    Global Const $ODT_LISTVIEW = 102
    Global Const $ODA_DRAWENTIRE = 0x1
    Global Const $ODA_SELECT = 0x2
    Global Const $ODA_FOCUS = 0x4
    Global Const $ODS_SELECTED = 0x0001

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

    Global $GUI_main = GUICreate("", 600, 800, -1, -1, -1, $WS_EX_ACCEPTFILES)
    Global $hGUI_tab_listview[2][10]
    $hGUI_tab_listview[0][0] = GUICtrlCreateListView("", 10, 10, 580, 780, _
    BitOR($LVS_REPORT, $LVS_SHOWSELALWAYS), _
    BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_GRIDLINES)) ; + $LVS_EX_CHECKBOXES + $LVS_SINGLESEL
    _GUICtrlListView_AddColumn(-1, "Name")
    _GUICtrlListView_AddColumn(-1, "Count")
    _GUICtrlListView_AddColumn(-1, "Test")
    _GUICtrlListView_AddColumn(-1, "Gih")

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

    For $i = 0 To 10 ; populate the listview for testing purposes
    _GUICtrlListView_AddItem(-1, "test " & $i)
    _GUICtrlListView_AddSubItem(-1, $i, $i, 1)
    _GUICtrlListView_AddSubItem(-1, $i, $i, 2)
    _GUICtrlListView_AddSubItem(-1, $i, $i, 3)
    Next

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

    Global $lv = GUICtrlGetHandle($hGUI_tab_listview[0][0])
    Global $g_hDll = DllCallbackRegister('Proc', 'ptr', 'hwnd;uint;wparam;lparam')
    Global $g_hProc1 = _WinAPI_SetWindowLong($lv, $GWL_WNDPROC, DllCallbackGetPtr($g_hDll))

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

    GUISetState(@SW_SHOW)
    While 1
    Sleep(100)
    WEnd

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

    Exit
    _WinAPI_SetWindowLong($lv, $GWL_WNDPROC, $g_hProc1)
    DllCallbackFree($g_hDll)

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

    Func Proc($hWnd, $iMsg, $wParam, $lParam)
    Switch $iMsg
    Case $WM_PAINT
    ;~ ConsoleWrite("$WM_PAINT" & @CRLF)
    _WinAPI_CallWindowProc($g_hProc1, $hWnd, $iMsg, $wParam, $lParam)
    ;~ _WinAPI_DefWindowProc($hWnd, $iMsg, $wParam, $lParam)

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

    For $i = 0 To _GUICtrlListView_GetItemCount($hWnd)-1
    Local $struct = _GUICtrlListView_GetItemRectEx($hWnd, $i, $LVIR_BOUNDS)
    ConsoleWrite("$i: " & $i & @CRLF)
    ;~ __MoveControl($oExtCtrls, $hWnd, $i) ; move extended controls
    Next
    ;~ EndIf
    EndSwitch
    Return _WinAPI_CallWindowProc($g_hProc1, $hWnd, $iMsg, $wParam, $lParam)
    EndFunc ;==>_WinProc

    [/autoit]
  • GUICtrlCreateGraphic und GUICoordMode relativ funktioniert nicht (bug?)

    • Trolleule1337
    • 6. Oktober 2014 um 00:21

    Wenn GUICtrlGraphics kein Control ist, sollte es auch nicht unter "GUI Control creation" gelistet sein. Andernfalls sollte das vom Entwickler nachgebessert werden, wird wohl nicht unmöglich sein. Im engl. Forum wurde das Problem angesprochen (siehe Link #1 Post) aber ergebnislos. Wo könnte ich das melden bzw. meinen Vorschlag vorbringen?

  • GUICtrlCreateGraphic und GUICoordMode relativ funktioniert nicht (bug?)

    • Trolleule1337
    • 5. Oktober 2014 um 18:27

    Ich finde das sollte mal untersucht/ gemeldet werden!

  • GUICtrlCreateGraphic und GUICoordMode relativ funktioniert nicht (bug?)

    • Trolleule1337
    • 27. September 2014 um 02:47

    Hi,
    scheint ein Bug zu sein?

    http://www.autoitscript.com/forum/topic/70…t-guicoordmode/

    Edit: Verstecken mit GUICtrlSetState lässt es sich auch nicht!

  • HTML ähnliche Horizontale Linie (hr) erstellen

    • Trolleule1337
    • 20. September 2014 um 03:50

    Hi,
    ist es möglich eine Horizontale Linie (hr in html) + Label zu erstellen und dieses Control dann so zu benutzen, dass man es einem parent zuweisen kann? Die hr möchte ich gerne so gestalten (siehe Anhang). Ein solches Gebilde benötigt mind. 2 verschieden controls, also kommt die Frage auf, ob man controls gruppieren kann, sodass ein handle entsteht und dieses auch einem parent handle zugeordnet werden kann, wie z.B. bei _GUICtrlListView_Create:

    Zitat

    _GUICtrlListView_Create ( $hWnd, ....)
    $hWnd - Handle to parent or owner window

    Bilder

    • hr.png
      • 1,5 kB
      • 414 × 23
  • _GUICtrlEdit_Create sendet keine Message Codes

    • Trolleule1337
    • 13. August 2014 um 23:44

    Hi,
    ich hab ein Edit Control mit _GUICtrlEdit_Create erstellt, als parent handle, habe ich allerdings statt einer Form ein handle zu einem ListView Control reingegeben. Jedes andere Edit Control sendet Codes, die ich in WM_COMMAND abfangen kann, außer die, die als parent handle kein Form handle haben.

    Soll das so sein und ist es möglich, das diese Controls Message Codes senden?

  • _WinAPI_SetWindowSubclass und additional/reference data

    • Trolleule1337
    • 12. August 2014 um 23:37

    ok besseres Beispiel:

    [autoit]

    #include <GuiComboBox.au3>
    #include <GuiListView.au3>
    #include <GuiEdit.au3>
    #include <WindowsConstants.au3>
    #include <WinAPI.au3>
    #include <WinAPIShellEx.au3>

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

    $hHandle = DllCallbackGetPtr(DllCallbackRegister('MY_SUBCLASSPROC', 'LRESULT', 'HWND;UINT;WPARAM;LPARAM;UINT_PTR;DWORD_PTR'))
    $hHandle2 = DllCallbackGetPtr(DllCallbackRegister('MY_SUBCLASSPROC2', 'LRESULT', 'HWND;UINT;WPARAM;LPARAM;UINT_PTR;DWORD_PTR'))

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

    GUI()
    Func GUI()
    Global $gui = GUICreate('Subclass Test - Phoenix XL', 450, 500)
    Global $hListView = _GUICtrlListView_Create($gui, "", 2, 2, 394, 268)
    Global $hEdit = _GUICtrlEdit_Create($hListView, 'Hello world!', 10, 45, 250, 25, BitOR($WS_TABSTOP, $WS_CHILD, $WS_VISIBLE, $ES_LEFT, $ES_AUTOHSCROLL, $ES_NOHIDESEL), $WS_EX_CLIENTEDGE)
    Global $hCombo = _GUICtrlComboBox_Create($hListView, "test", 10, 10, 50, 25)
    _GUICtrlComboBox_AddDir($hCombo, "", $DDL_DRIVES, False)

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

    ;~ $struct = Test() ; Wenn ich den unteren Befehlsblock in dieser Funktion ausführen lasse, dann lässt sich der Inhalt des structures nicht mehr auslesen, aber warum?

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

    ; so funktioniert es
    Local $struct = DllStructCreate("wchar[5];wchar[5];wchar[5];wchar[5]")
    DllStructSetData($struct, 1, "test")
    DllStructSetData($struct, 2, "sack")
    DllStructSetData($struct, 3, "nege")
    DllStructSetData($struct, 4, "puff")
    _Winapi_SetWindowSubclass($hEdit, $hHandle, 0, DllStructGetPtr($struct))

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

    GUISetState()

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

    While (True)
    Switch (GUIGetMsg())
    Case -3 ;GUI_EVENT_CLOSE
    ExitLoop
    EndSwitch
    WEnd

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

    _WinAPI_RemoveWindowSubclass($hEdit, $hHandle, 0)
    _WinAPI_RemoveWindowSubclass($hCombo, $hHandle2, 1)

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

    Exit

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

    EndFunc

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

    Func Test()
    Local $struct = DllStructCreate("wchar[5];wchar[5];wchar[5];wchar[5]")
    DllStructSetData($struct, 1, "test")
    DllStructSetData($struct, 2, "sack")
    DllStructSetData($struct, 3, "nege")
    DllStructSetData($struct, 4, "puff")
    _Winapi_SetWindowSubclass($hEdit, $hHandle, 0, DllStructGetPtr($struct))
    EndFunc

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

    Func MY_SUBCLASSPROC($hWnd, $uMsg, $wParam, $lParam, $uIdSubclass, $dwRefData)
    If $uMsg = $WM_LBUTTONDOWN Then
    ConsoleWrite(VarGetType($dwRefData) & " data: " & $dwRefData & @CRLF)

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

    ConsoleWrite("pointer:" & Ptr($dwRefData) & @CRLF)

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

    Local $struct1 = DllStructCreate("wchar[5];wchar[5];wchar[5];wchar[5]", Ptr($dwRefData))
    ConsoleWrite("data1: " & DllStructGetData($struct1, 1) & @CRLF)
    ConsoleWrite("data2: " & DllStructGetData($struct1, 2) & @CRLF)
    ConsoleWrite("data3: " & DllStructGetData($struct1, 3) & @CRLF)
    ConsoleWrite("data4: " & DllStructGetData($struct1, 4) & @CRLF)

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

    _Winapi_SetWindowSubclass($hCombo, $hHandle2, 1, DllStructGetPtr($struct1))
    Return 0
    EndIf
    Return _Winapi_DefSubclassProc($hWnd, $uMsg, $wParam, $lParam)
    EndFunc

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

    Func MY_SUBCLASSPROC2($hWnd, $uMsg, $wParam, $lParam, $uIdSubclass, $dwRefData)

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

    If $uMsg = $WM_LBUTTONDOWN Then

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

    Local $struct1 = DllStructCreate("wchar[5];wchar[5];wchar[5];wchar[5]", Ptr($dwRefData))
    ConsoleWrite("data1: " & DllStructGetData($struct1, 1) & @CRLF)
    ConsoleWrite("data2: " & DllStructGetData($struct1, 2) & @CRLF)
    ConsoleWrite("data3: " & DllStructGetData($struct1, 3) & @CRLF)
    ConsoleWrite("data4: " & DllStructGetData($struct1, 4) & @CRLF)

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

    EndIf
    Return _Winapi_DefSubclassProc($hWnd, $uMsg, $wParam, $lParam)
    EndFunc

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

    Wenn ich Zeile 25 bis 30 auskommentiere und stattdessen in der Funktion Test() ausführe, kann ich den Inhalt in den subclasses nicht mehr auslesen, wenn ich den Befehlsblock innerhabl der Funktion GUI() lasse, klappt es. Hat jemand eine Idee warum das so ist?

  • _WinAPI_SetWindowSubclass und additional/reference data

    • Trolleule1337
    • 10. August 2014 um 18:42

    Wenn ich nach Zeile 30

    Zitat

    Global $test = $struct


    einfüge, funktioniert es. Hat jemand dazu eine Idee?

  • _WinAPI_SetWindowSubclass und additional/reference data

    • Trolleule1337
    • 10. August 2014 um 04:01

    Grüßt euch erstmal,
    ich möchte mit _WinAPI_SetWindowSubclass ( $hWnd, $pSubclassProc, $ID [, $pData = 0] ) ein structure übergeben. Komischerweise kann ich den Inhalt nur korrekt auslesen, wenn

    Zitat

    $iMsg = 135 And $iwParam = 0 And $ilParam = 0


    ist. Wenn ich das COnsoleWrite außerhalb der Abfrage setze, liest er komische ASCII Zeichen oder so aus. Außerdem stürzt er ab, sobald ich mit dem Cursor ins ComboBox Feld komme. Hat jemand eine Idee, wieso ich nur mit diesen bestimmten Bedingungen das structure korrekt auslesen kann?

    [autoit]

    #include <WinAPIShellEx.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiComboBox.au3>

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

    OnAutoItExitRegister('OnAutoItExit')

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

    ; Create GUI
    Local $hForm = GUICreate('Test ' & StringReplace(@ScriptName, '.au3', '()'))
    Local $hCombo = _GUICtrlComboBox_Create($hForm, "", 2, 2, 396, 296)

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

    ; Register DLL callback that will be used as window subclass procedure
    Local $hDll = DllCallbackRegister('_SubclassProc', 'lresult', 'hwnd;uint;wparam;lparam;uint_ptr;dword_ptr')
    Local $pDll = DllCallbackGetPtr($hDll)
    Local $hDll2 = DllCallbackRegister('_SubclassProc2', 'lresult', 'hwnd;uint;wparam;lparam;uint_ptr;dword_ptr')
    Local $pDll2 = DllCallbackGetPtr($hDll2)

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

    ; Install window subclass callback
    _WinAPI_SetWindowSubclass($hForm, $pDll, 1000, 0)

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

    GUISetState(@SW_SHOW)

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

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

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

    Func _SubclassProc($hWnd, $iMsg, $iwParam, $ilParam, $ID, $pData)
    #forceref $ID, $pData

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

    Local $Array[3] = ["test", "hallo", "gih"]
    Local $struct = _WinAPI_ArrayToStruct($Array)
    _WinAPI_SetWindowSubclass($hCombo, $pDll2, 1001, DllStructGetPtr($struct))

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

    Return _WinAPI_DefSubclassProc($hWnd, $iMsg, $iwParam, $ilParam)
    EndFunc ;==>_SubclassProc

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

    Func _SubclassProc2($hWnd, $iMsg, $iwParam, $ilParam, $ID, $pData)
    #forceref $ID, $pData

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

    If $iMsg = 135 And $iwParam = 0 And $ilParam = 0 Then
    Local $struct1 = DllStructCreate("wchar[5];wchar[6];wchar[4];wchar[1]", Ptr($pData))
    ConsoleWrite("$iMsg: " & $iMsg & " $iwParam: " & $iwParam & " $ilParam: " & $ilParam & " data1: " & DllStructGetData($struct1, 1) & " data2: " & DllStructGetData($struct1, 2) & " data3: " & DllStructGetData($struct1, 3) & @CRLF)
    EndIf
    Return _WinAPI_DefSubclassProc($hWnd, $iMsg, $iwParam, $ilParam)
    EndFunc ;==>_SubclassProc

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

    Func OnAutoItExit()
    _WinAPI_RemoveWindowSubclass($hForm, $pDll, 1000)
    _WinAPI_RemoveWindowSubclass($hCombo, $pDll2, 1001)
    DllCallbackFree($hDll)
    DllCallbackFree($hDll2)
    EndFunc ;==>OnAutoItExit

    [/autoit]

    Edit: Klappt auch mit

    Zitat

    $iMsg: 132 $iwParam: 0 $ilParam: 21627917 data1: test data2: hallo data3: gih


    Irgendwas stimmt da nicht...

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™