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

Beiträge von name22

  • Mousehook - Daten asynchron verarbeiten

    • name22
    • 18. November 2012 um 16:00

    Ich habe ein Problem mit einem Script (bzw. 2 Scripts) die eine Desktop-Lupe auf dem Bildschirm anzeigen. Das wird über einen MouseHook gemacht, der eine Callback Funktion immer dann aufruft wenn die Maus bewegt wird. Dann muss die GUI aktualisiert werden um den neuen Bildschirmausschnitt anzuzeigen.

    Wie die Überschrift schon sagt, versuche ich nun eine Möglichkeit zu finden die Daten, die bei jedem Aufruf der Callback Funktion verarbeitet werden müssen, entweder asynchron (parallel) oder zeitversetzt (möglichst einfach) zu verarbeiten. Das muss ich unbedingt so machen, weil die Verarbeitung in meinem Fall recht lange dauert. Es soll nämlich ein Bildschirmausschnitt in eine sich bewegende GUI kopiert werden (wie eine Bildschirmlupe).
    Die Callback Funktion des Hooks muss aber so schnell wie möglich mit Return beendet werden, da sonst die Maus für das gesamte System extrem langsam wird (Windows löst den Hook auf wenn die Funktion nicht nach einer bestimmten Zeit beendet wird).

    Also habe ich versucht mit diversen Timern (einmaliges AdlibRegister, QueueTimer, _Timer_SetTimer) aus der Callback Funktion die zweite Funktion die den grafischen Teil ausführen soll zeitverzögert aufzurufen (damit die andere Funktionn davor beendet wird). Leider waren die Resultate nicht sonderlich beeindruckend und AutoIt ist mir mehrmals mit seltsamen Fehlermeldungen abgeschmiert (AutoIt scheint mehrere DllCallbacks nicht zu mögen).
    Nach einigem Experimentieren habe ich schließlich 2 Scripte geschrieben. Das erste Script überwacht mit dem Hook die Maus und sendet über eine Unique Windows Message die Mausposition an das Fenster des zweiten Scripts. Im zweiten Script ist die Hauptfunktion mit der gleichen Windows Message registriert und erhält die Daten bei jedem Aufruf.

    So funktioniert das Ganze nun zwar, aber das ist mir eigentlich viel zu umständlich das mit 2 Scripten zu machen (und dann auch noch so kompliziert)...
    Daher lautet nun meine Frage: Geht das nicht auch einfacher? ^^

    Edit: Beide Scripte müssen ins gleiche Verzeichnis und TimerSlave.au3 muss zuerst gestartet werden.

  • Bildgröße laufend an GUI anpassen

    • name22
    • 18. November 2012 um 01:21

    Registriere die Nachricht doch einfach erst sobald du sie brauchst... Aber wenn du es überprüfen willst, geht das mit dem $hWnd Parameter der OnEraseBkGnd Funktion. Der enthält immer das Handle zu dem Fenster von dem die Nachricht kommt.

  • Bildgröße laufend an GUI anpassen

    • name22
    • 18. November 2012 um 00:49

    Die Funktion OnEraseBkGnd wird für jedes Fenster aufgerufen, dessen Hintergrund neu gemalt werden soll (WM_ERASEBKGND Message). Dann wird der Hintergrund dieses Fensters durch den Inhalt der Bitmap $hBmp ersetzt. Und was ist bei deinem Script in $hBmp? ;)
    Außerdem brauchst du das doch sowieso erst für das andere Fenster, weil du den Hintergrund der Lupe sowieso ständig mit einem Screenshot übermalst (das wäre sonst doppelt gemoppelt ^^).

  • Bildgröße laufend an GUI anpassen

    • name22
    • 17. November 2012 um 23:11

    Und die Screenshots sollen mit der Lupe ausgewählt werden um sie dann in der saklierbaren GUI anzuzeigen? Wie genau sollen die ausgewählt werden, nur der Bereich der in dem Lupenfenster angezeigt wird?

  • Bildgröße laufend an GUI anpassen

    • name22
    • 17. November 2012 um 22:40

    Tweaky Uff.. Du hast da was größeres vor, oder? Könntest du mir vielleicht erklären wie genau du dir das vorstellst? UEZ hat zwar schon festgestellt, dass alle Wege nach Rom führen, aber nicht alle Wege liefern ein gutes Endprodukt. Wenn du wir hier Schrittweise vorankriechen dann dauert das länger und es muss eine Menge korrigiert werden...

    Zitat

    Teilweise verstehe ich das Skript.
    Ich habe zum testen :!: alles rausgeschmissen was nichts mit dem Fehler zu tun hat.
    Ich wollte es einfacher machen, damit man den Fehler besser finden kann.

    Ach so ^^. Wusste ich ja nicht, sorry.

  • Bildgröße laufend an GUI anpassen

    • name22
    • 17. November 2012 um 21:41

    Das liegt daran, dass du das Script umgebaut hast, ohne es komplett zu verstehen.. Im Grunde brauchst du diesen Teil des Scripts gar nicht mehr wenn du das so machst...
    Von dem Teil der am meisten Probleme bereitet hat, WM_SIZING etc., sehe ich auch nichts mehr. Wie wäre es wenn du uns sagst, was du konkret vorhast? Eine Bildschirmlupe habe ich mal aus Langeweile geschrieben, das ist kein großes Problem, aber es kann ja keiner wissen, dass du das willst.
    Wie wäre es denn mit diesem Script als Basis für dein Vorhaben? Das dürfte wesentlich sauberer und performanter sein als der Flickenteppich der in diesem Thread entstanden ist.

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>
    #include <Constants.au3>
    #include <GUIConstants.au3>
    #include <WindowsConstants.au3>

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

    ; -Author: name22 (http://www.autoit.de)

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

    Opt("GUIOnEventMode")

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

    Global Const $iFlag = BitOR($SWP_NOSIZE, $SWP_NOZORDER), $tagMSLLHOOKSTRUCT = $tagPOINT & ";dword mouseData;dword flags;dword time;ulong_ptr dwExtraInfo"
    Global $hWnd_Magnifier, $hWnd_Desktop, $hDC_Window, $hDC_Desktop
    Global $hDll_GDI32 = DllOpen("gdi32.dll"), $hDll_User32 = DllOpen("user32.dll")

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

    Global $iGUIWidth = 100
    Global $iGUIHeight = 100
    Global $iCaptureWidth = 50
    Global $iCaptureHeight = 50

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

    $hWnd_Magnifier = GUICreate("", $iGUIWidth, $iGUIHeight, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)
    GUISetState()

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

    $hWnd_Desktop = _WinAPI_GetDesktopWindow()
    $hDC_Window = _WinAPI_GetDC($hWnd_Magnifier)
    $hDC_Desktop = _WinAPI_GetDC($hWnd_Desktop)
    DllCall($hDll_GDI32, "INT", "SetStretchBltMode", "HANDLE", $hDC_Window, "INT", 3)

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

    $hMouseProc = DllCallbackRegister("_MouseProc", "int", "int;ptr;ptr")
    $hMouseHook = _WinAPI_SetWindowsHookEx($WH_MOUSE_LL, DllCallbackGetPtr($hMouseProc), _WinAPI_GetModuleHandle(0), 0)

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

    OnAutoItExitRegister("_Shutdown")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    HotKeySet("{ESC}", "_Exit")

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

    _ReDraw(_WinAPI_GetMousePosX(), _WinAPI_GetMousePosY())

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

    While Sleep(1000)
    WEnd

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

    Func _MouseProc($nCode, $wParam, $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam)

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

    Local $iEvent = BitAND($wParam, 0xFFFF)
    If $iEvent = $WM_MOUSEMOVE Then
    Local $tMHook = DllStructCreate($tagMSLLHOOKSTRUCT, $lParam)
    _ReDraw(DllStructGetData($tMHook, "X"), DllStructGetData($tMHook, "Y"))
    EndIf

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

    Return _WinAPI_CallNextHookEx($hMouseHook, $nCode, $wParam, $lParam)
    EndFunc

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

    Func _ReDraw($iX_Mouse, $iY_Mouse)
    Local $iX_MouseTmp = $iX_Mouse
    Local $iY_MouseTmp = $iY_Mouse
    If $iX_MouseTmp < 0 Then $iX_MouseTmp = 0
    If $iX_MouseTmp > 1920 - $iGUIWidth - $iCaptureWidth / 2 - 2 Then $iX_MouseTmp = 1920 - $iGUIWidth - $iCaptureWidth / 2 - 2
    If $iY_MouseTmp < 0 Then $iY_MouseTmp = 0
    If $iY_MouseTmp > 1080 - $iGUIHeight - $iCaptureHeight / 2 - 2 Then $iY_MouseTmp = 1080 - $iGUIHeight - $iCaptureHeight / 2 - 2
    DllCall($hDll_User32, "BOOL", "SetWindowPos", "HWND", $hWnd_Magnifier, "HWND", 0, "INT", $iX_MouseTmp + $iCaptureWidth / 2 + 2, "INT", $iY_MouseTmp + $iCaptureHeight / 2 + 2, "INT", 0, "INT", 0, "UINT", $iFlag)
    DllCall($hDll_GDI32, "INT", "StretchBlt", "HWND", $hDC_Window, "INT", 0, "INT", 0, "INT", $iGUIWidth, "INT", $iGUIHeight, "HWND", $hDC_Desktop, "INT", $iX_Mouse - $iCaptureWidth / 2, "INT", $iY_Mouse - $iCaptureHeight / 2, "INT", $iCaptureWidth, "INT", $iCaptureHeight, "DWORD", $SRCCOPY)
    EndFunc ;==>_ReDraw

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

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

    Func _Shutdown()
    _WinAPI_UnhookWindowsHookEx($hMouseHook)
    DllCallbackFree($hMouseProc)
    _WinAPI_ReleaseDC($hWnd_Magnifier, $hDC_Window)
    _WinAPI_ReleaseDC($hWnd_Desktop, $hDC_Desktop)
    DllClose($hDll_GDI32)
    DllClose($hDll_User32)
    EndFunc

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _WinAPI_StretchBlt
    ; Description....: Copies a bitmap from a source rectangle into a destination rectangle, stretching or compressing the bitmap
    ; to fit the dimensions of the destination rectangle, if necessary.
    ; Syntax.........: _WinAPI_StretchBlt ( $hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop )
    ; Parameters.....: $hDestDC - Handle to the destination device context.
    ; $iXDest - The x-coordinate, in logical units, of the upper-left corner of the destination rectangle.
    ; $iYDest - The y-coordinate, in logical units, of the upper-left corner of the destination rectangle.
    ; $iWidthDest - The width, in logical units, of the destination rectangle.
    ; $iHeightDest - The height, in logical units, of the destination rectangle.
    ; $hSrcDC - Handle to the source device context.
    ; $iXSrc - The x-coordinate, in logical units, of the upper-left corner of the source rectangle.
    ; $iYSrc - The y-coordinate, in logical units, of the upper-left corner of the source rectangle.
    ; $iWidthSrc - The width, in logical units, of the source rectangle.
    ; $iHeightSrc - The height, in logical units, of the source rectangle.
    ; $iRop - The raster-operation code. These codes define how the color data for the source rectangle is
    ; to be combined with the color data for the destination rectangle to achieve the final color.
    ; This parameter must be 0 or one of the following values.
    ;
    ; $BLACKNESS
    ; $CAPTUREBLT
    ; $DSTINVERT
    ; $MERGECOPY
    ; $MERGEPAINT
    ; $NOMIRRORBITMAP
    ; $NOTSRCCOPY
    ; $NOTSRCERASE
    ; $PATCOPY
    ; $PATINVERT
    ; $PATPAINT
    ; $SRCAND
    ; $SRCCOPY
    ; $SRCERASE
    ; $SRCINVERT
    ; $SRCPAINT
    ; $WHITENESS
    ;
    ; Return values..: Success - 1.
    ; Failure - 0 and sets the @error flag to non-zero.
    ; Author.........: Yashied
    ; Modified.......:
    ; Remarks........: The system stretches or compresses the bitmap according to the stretching mode currently set in the
    ; destination device context.
    ; Related........:
    ; Link...........: @@MsdnLink@@ StretchBlt
    ; Example........: Yes
    ; ===============================================================================================================================

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

    Func _WinAPI_StretchBlt($hDestDC, $iXDest, $iYDest, $iWidthDest, $iHeightDest, $hSrcDC, $iXSrc, $iYSrc, $iWidthSrc, $iHeightSrc, $iRop)

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

    Local $Ret = DllCall('gdi32.dll', 'int', 'StretchBlt', 'hwnd', $hDestDC, 'int', $iXDest, 'int', $iYDest, 'int', $iWidthDest, 'int', $iHeightDest, 'hwnd', $hSrcDC, 'int', $iXSrc, 'int', $iYSrc, 'int', $iWidthSrc, 'int', $iHeightSrc, 'dword', $iRop)

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

    If (@error) Or (Not $Ret[0]) Then
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>_WinAPI_StretchBlt

    [/autoit]


    Ich habe damals einen Hook auf die Maus gesetzt um wirklich bei jeder Bewegung das Fenster zu aktualisieren. Mittlerweile bin ich mir nicht mehr so sicher, ob das eine gute Idee war (Mousehooks können nämlich die Mausbewegung verlangsamen wenn die Callback Funktion zu lange dauert).

  • index.html mit autoit starten

    • name22
    • 16. November 2012 um 20:21
    Zitat

    ja aber will das ganze mal als programm machen also die user sollen sich da nicht erst die datei aussuchen müssen die index.html soll auf Doppelklick gleich öffnen


    Wie bitte? Sag mal, weißt du was Beispiel heißt? Ich habe dir ein kurzes Script geschrieben, welches die Funktion demonstriert die du suchst. Wenn du willst, dass wir dir dein Programm fertigschreiben, dann mach einen Thread in Programmieranfragen auf. Ich lass mich doch hier nicht auf den Arm nehmen...
    Bis jetzt hast du ja noch nicht einmal versucht aus meinem Script etwas anderes zu machen. Du kannst genauso gut bei IENavigate statt dem Pfad den ich über FileOpenDialog abfrage, deinen eigenen in Form eines Strings (z.B: "C\Test\index.htm") angeben.

  • index.html mit autoit starten

    • name22
    • 16. November 2012 um 19:48

    Du musst zuerst eine Datei auswählen, dazu ist dieser Dialog da! :pinch:
    Was hätte ich da denn sonst einbauen sollen? Eine Funktion die auf magische Weise die HTML Datei auf deinem PC findest, die du dir gerade vorstellst?

  • index.html mit autoit starten

    • name22
    • 16. November 2012 um 19:39

    Das geht mit einem eingebetteten IE Object. Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>
    #include <IE.au3>

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

    $sPath_File = FileOpenDialog("Open HTML File", "", "HTML (*.htm;*.html)")
    If @error Then Exit

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

    $oIE = _IECreateEmbedded()

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

    $hWnd = GUICreate("Test", 400, 400)
    $cObject_IE = GUICtrlCreateObj($oIE, 0, 0, 400, 400)
    GUISetState()

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

    _IENavigate($oIE, $sPath_File)

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

    While True
    Switch GUIGetMsg()
    Case $GUI_EVENT_CLOSE
    Exit
    EndSwitch
    WEnd

    [/autoit]
  • index.html mit autoit starten

    • name22
    • 16. November 2012 um 19:29

    Dann gib den Pfad der html Datei bei ShellExecute an.

  • index.html mit autoit starten

    • name22
    • 16. November 2012 um 19:13

    Einen Link als exe öffnen? :huh: Ich bin mir nicht sicher ob ich dir folgen kann, aber du kannst ja mal folgendes versuchen:

    [autoit]

    ShellExecute("http://www.aquasoft.de/discmenu_home.as")

    [/autoit]
  • Bildgröße laufend an GUI anpassen

    • name22
    • 16. November 2012 um 18:43

    Das ist vielleicht ne schwere Geburt... Jetzt aber:

    Spoiler anzeigen
    [autoit]

    #region ;************ Includes ************
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ScreenCapture.au3>
    #include <Constants.au3>
    #include <SendMessage.au3>
    #endregion ;************ Includes ************

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

    Global $iGUI_WidthInitial = 800, $iMinWidth = 200, $iMinHeight, $iMaxWidth = 1300, $iMaxHeight, $fRatio_Image, $fRatio_GUI
    Global $hBmp, $hDC_Mem
    Global $sPath_ImageInitial = FileOpenDialog("Bild auswählen", "", "Images (*.jpeg;*.jpg;*.png;*.bmp)")

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

    Opt("GUIOnEventMode", 1) ; 0=ausgeschaltet, 1=OnEvent Modus aktiviert

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

    Global Const $BITMAP = "LONG bmType;LONG bmWidth;LONG bmHeight;LONG bmWidthBytes;WORD bmPlanes;WORD bmBitsPixel;PTR bmBits;"
    Global Const $HWND_DESKTOP = _WinAPI_GetDesktopWindow()

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

    $hDC = _WinAPI_GetDC($HWND_DESKTOP)
    $hDC_Mem = _WinAPI_CreateCompatibleDC($hDC)
    _WinAPI_ReleaseDC($HWND_DESKTOP, $hDC)

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

    GUIRegisterMsg($WM_ERASEBKGND, "OnEraseBkGnd")
    GUIRegisterMsg($WM_SIZING, "WM_SIZING")
    GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")

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

    Global $hWnd = GUICreate("Test", 0, 0, -1, -1, $WS_OVERLAPPEDWINDOW)
    GUISetState()

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_beenden")

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

    _GDIPlus_Startup()
    _LoadImage($sPath_ImageInitial)

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

    ;Schleife
    While Sleep(1000)
    WEnd

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

    Func _LoadImage($sPath_Image)
    Local $tRect = DllStructCreate($tagRECT)
    Local $tBM = DllStructCreate($BITMAP)
    Local $hImage = _GDIPlus_ImageLoadFromFile($sPath_Image)

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

    If $hBmp Then _WinAPI_DeleteObject($hBmp)

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

    $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage, 0)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_GetObject($hBmp, DllStructGetSize($tBM), DllStructGetPtr($tBM))
    $fRatio_Image = DllStructGetData($tBM, "bmWidth") / DllStructGetData($tBM, "bmHeight")

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

    DllStructSetData($tRect, "Left", 0)
    DllStructSetData($tRect, "Top", 0)
    DllStructSetData($tRect, "Right", $iGUI_WidthInitial)
    DllStructSetData($tRect, "Bottom", $iGUI_WidthInitial / $fRatio_Image)

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

    _WinAPI_AdjustWindowRectEx($tRect, _WinAPI_GetWindowLong($hWnd, $GWL_STYLE), _WinAPI_GetWindowLong($hWnd, $GWL_EXSTYLE))
    $iWidth = DllStructGetData($tRect, "Right") - DllStructGetData($tRect, "Left")
    $iHeight = DllStructGetData($tRect, "Bottom") - DllStructGetData($tRect, "Top")
    $iX = @DesktopWidth / 2 - $iWidth / 2
    $iY = @DesktopHeight / 2 - $iHeight / 2
    $fRatio_GUI = $iWidth / $iHeight

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

    $iMinHeight = $iMinWidth / $fRatio_GUI ;min. Höhe anhand der min. Breite und des Seitenverhältnisse berechnen
    $iMaxHeight = $iMaxWidth / $fRatio_GUI ;max. Höhe anhand der max. Breite und des Seitenverhältnisse berechnen
    If $iMaxHeight > @DesktopHeight Then ;max. Höhe größer als der Bildschirm >>> neue max. Breite ermitteln
    $iMaxHeight = @DesktopHeight
    $iMaxWidth = $iMaxHeight * $fRatio_GUI
    EndIf
    _WinAPI_SetWindowPos($hWnd, 0, $iX, $iY, $iWidth, $iHeight, $SWP_NOZORDER)
    EndFunc ;==>_LoadImage

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

    Func OnEraseBkGnd($hWnd, $message, $wParam, $lParam)
    Local $rcClient
    Local $hObjOld
    Local $rcRight, $rcBottom
    Local $bmWidth, $bmHeight
    Local $bm = DllStructCreate($BITMAP)

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

    If (Not $hBmp) Then Return 1

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

    ; get the window's client area
    $rcClient = _WinAPI_GetClientRect($hWnd)

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

    $rcRight = DllStructGetData($rcClient, "Right")
    $rcBottom = DllStructGetData($rcClient, "Bottom")

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

    ; get the bitmap dimensions
    _WinAPI_GetObject($hBmp, DllStructGetSize($bm), DllStructGetPtr($bm))

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

    ; select the bitmap into the memory DC
    $hObjOld = _WinAPI_SelectObject($hDC_Mem, $hBmp)

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

    $bmWidth = DllStructGetData($bm, "bmWidth")
    $bmHeight = DllStructGetData($bm, "bmHeight")

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

    DllCall("gdi32.dll", "INT", "SetStretchBltMode", "HANDLE", $wParam, "INT", 4)

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

    StretchBlt($wParam, 0, 0, $rcRight, $rcBottom, $hDC_Mem, 0, 0, $bmWidth, $bmHeight, $SRCCOPY)

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

    _WinAPI_SelectObject($hDC_Mem, $hObjOld)

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

    Return 1
    EndFunc ;==>OnEraseBkGnd

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

    Func StretchBlt($hDCDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hDCSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $dwRop)
    Local $aRes = DllCall("gdi32.dll", "BOOL", "StretchBlt", "HANDLE", $hDCDest, "INT", $nXOriginDest, "INT", $nYOriginDest, "INT", $nWidthDest, "INT", $nHeightDest, "HANDLE", $hDCSrc, "INT", $nXOriginSrc, "INT", $nYOriginSrc, "INT", $nWidthSrc, "INT", $nHeightSrc, "DWORD", $dwRop)
    Return $aRes[0]
    EndFunc ;==>StretchBlt

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

    Func WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
    Local $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 7, $iMinWidth) ; min X
    DllStructSetData($minmaxinfo, 8, $iMinHeight) ; min Y
    DllStructSetData($minmaxinfo, 9, $iMaxWidth) ; max X
    DllStructSetData($minmaxinfo, 10, $iMaxHeight) ; max Y
    Return "GUI_RUNDEFMSG"
    EndFunc ;==>WM_GETMINMAXINFO

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

    Func WM_SIZING($hWnd, $iMsg, $wParam, $lParam)
    Local $tRect_Cur = DllStructCreate("int[4]", $lParam)
    Local $left = DllStructGetData($tRect_Cur, 1, 1)
    Local $top = DllStructGetData($tRect_Cur, 1, 2)
    Local $right = DllStructGetData($tRect_Cur, 1, 3)
    Local $bottom = DllStructGetData($tRect_Cur, 1, 4)

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

    Switch $wParam ;drag side or corner
    Case 1, 2, 4, 7
    Local $iNewY = Int(($right - $left) / $fRatio_GUI)
    DllStructSetData($tRect_Cur, 1, $top + $iNewY, 4)
    Case Else
    Local $iNewX = Int(($bottom - $top) * $fRatio_GUI)
    DllStructSetData($tRect_Cur, 1, $left + $iNewX, 3)
    EndSwitch

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

    Return "GUI_RUNDEFMSG"
    EndFunc ;==>WM_SIZING

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

    Func _beenden()
    ; free resources
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_DeleteDC($hDC_Mem)

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

    _GDIPlus_Shutdown()

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

    Exit
    EndFunc ;==>_beenden

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _WinAPI_AdjustWindowRectEx
    ; Description....: Calculates the required size of the window rectangle, based on the desired size of the client rectangle.
    ; Syntax.........: _WinAPI_AdjustWindowRectEx ( ByRef $tRECT, $iStyle [, $iExStyle [, $fMenu] )
    ; Parameters.....: $tRECT - $tagRECT structure that contains the coordinates of the desired client area.
    ; $iStyle - The window style of the window whose required size is to be calculated. Note that you cannot
    ; specify the $WS_OVERLAPPED style.
    ; $iExStyle - The extended window style of the window whose required size is to be calculated.
    ; $fMenu - Specifies whether the window has a menu, valid values:
    ; |TRUE - The window has a menu, valid values:
    ; |FALSE - The window does not has a menu. (Default)
    ; Return values..: Success - 1.
    ; Failure - 0 and sets the @error flag to non-zero.
    ; Author.........: Yashied
    ; Modified.......:
    ; Remarks........: None
    ; Related........:
    ; Link...........: @@MsdnLink@@ AdjustWindowRectEx
    ; Example........: Yes
    ; ===============================================================================================================================

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

    Func _WinAPI_AdjustWindowRectEx(ByRef $tRect, $iStyle, $iExStyle = 0, $fMenu = 0)

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

    Local $Ret = DllCall('user32.dll', 'int', 'AdjustWindowRectEx', 'ptr', DllStructGetPtr($tRect), 'dword', $iStyle, 'int', $fMenu, 'dword', $iExStyle)

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

    If (@error) Or (Not $Ret[0]) Then
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>_WinAPI_AdjustWindowRectEx

    [/autoit]


    Ich komme weder mit den schwachsinnigen Fensterkoordinaten, noch mit AdjustWindowRectEx klar... ^^

  • Button mit 2 Funktionen

    • name22
    • 16. November 2012 um 18:28

    Ach so ist das gemeint. ^^
    Hier noch ein Beispiel mit OnEventMode und einer, für diese Situation besser geeigneten, statischen Variable:

    Spoiler anzeigen
    [autoit]

    #include <GUIConstants.au3>

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

    Opt("GUIOnEventMode", 1)

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

    $hWnd = GUICreate("Example", 200, 50)
    $cButton = GUICtrlCreateButton("Enter Pass", 60, 12, 80, 25)
    GUISetState()

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")
    GUICtrlSetOnEvent($cButton, "_Button")

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

    While Sleep(1000)
    WEnd

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

    Func _Button()
    Local Static $iMode = 0
    If $iMode > 3 Then $iMode = 0
    Switch $iMode
    Case 0
    $sPass = InputBox("Password", "Pass:", "Pass")
    If Not $sPass == "Pass" Then Return
    GUICtrlSetData($cButton, "Function 1")
    Case 1
    MsgBox(64, "Mode: " & $iMode, "Switching to next mode.")
    GUICtrlSetData($cButton, "Function 2")
    Case 2
    MsgBox(64, "Mode: " & $iMode, "Switching to next mode.")
    GUICtrlSetData($cButton, "Function 3")
    Case 3
    MsgBox(64, "Mode: " & $iMode, "Switching to next mode.")
    GUICtrlSetData($cButton, "Enter Pass")
    EndSwitch
    $iMode += 1
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]
  • Bildgröße laufend an GUI anpassen

    • name22
    • 16. November 2012 um 18:12

    Du musst das nicht über Dateien machen. Ich schreib dir das mal kurz um.

    Spoiler anzeigen
    [autoit]

    #region ;************ Includes ************
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ScreenCapture.au3>
    #include <Constants.au3>
    #include <SendMessage.au3>
    #endregion ;************ Includes ************

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

    Global $iGUI_WidthInitial = 800, $iMinWidth = 200, $iMinHeight, $iMaxWidth = 1300, $iMaxHeight, $fRatio_Image, $fRatio_GUI
    Global $hBmp, $hDC_Mem
    Global $sPath_ImageInitial = FileOpenDialog("Bild auswählen", "", "Images (*.jpeg;*.jpg;*.png;*.bmp)")

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

    Opt("GUIOnEventMode", 1) ; 0=ausgeschaltet, 1=OnEvent Modus aktiviert

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

    Global Const $BITMAP = "LONG bmType;LONG bmWidth;LONG bmHeight;LONG bmWidthBytes;WORD bmPlanes;WORD bmBitsPixel;PTR bmBits;"
    Global Const $HWND_DESKTOP = _WinAPI_GetDesktopWindow()

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

    $hDC = _WinAPI_GetDC($HWND_DESKTOP)
    $hDC_Mem = _WinAPI_CreateCompatibleDC($hDC)
    _WinAPI_ReleaseDC($HWND_DESKTOP, $hDC)

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

    GUIRegisterMsg($WM_ERASEBKGND, "OnEraseBkGnd")
    GUIRegisterMsg($WM_SIZING, "WM_SIZING")
    GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")

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

    Global $hWnd = GUICreate("Test", 0, 0, -1, -1, $WS_OVERLAPPEDWINDOW)
    GUISetState()

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_beenden")

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

    _GDIPlus_Startup()
    _LoadImage($sPath_ImageInitial)

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

    ;Schleife
    While Sleep(1000)
    WEnd

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

    Func _LoadImage($sPath_Image)
    Local $tRect = DllStructCreate($tagRECT)
    Local $tBM = DllStructCreate($BITMAP)
    Local $hImage = _GDIPlus_ImageLoadFromFile($sPath_Image)

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

    If $hBmp Then _WinAPI_DeleteObject($hBmp)

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

    $hBmp = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage, 0)
    _GDIPlus_ImageDispose($hImage)
    _WinAPI_GetObject($hBmp, DllStructGetSize($tBM), DllStructGetPtr($tBM))
    $fRatio_Image = DllStructGetData($tBM, "bmWidth") / DllStructGetData($tBM, "bmHeight")

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

    DllStructSetData($tRect, "Left", 0)
    DllStructSetData($tRect, "Top", 0)
    DllStructSetData($tRect, "Right", $iGUI_WidthInitial)
    DllStructSetData($tRect, "Bottom", $iGUI_WidthInitial / $fRatio_Image)

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

    _WinAPI_AdjustWindowRectEx($tRect, BitXOR(_WinAPI_GetWindowLong($hWnd, $GWL_STYLE), $WS_OVERLAPPEDWINDOW), _WinAPI_GetWindowLong($hWnd, $GWL_EXSTYLE))
    $iWidth = DllStructGetData($tRect, "Right") - DllStructGetData($tRect, "Left")
    $iHeight = DllStructGetData($tRect, "Bottom") - DllStructGetData($tRect, "Top")
    $iX = @DesktopWidth / 2 - $iWidth / 2
    $iY = @DesktopHeight / 2 - $iHeight / 2
    $fRatio_GUI = $iWidth / $iHeight

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

    $iMinHeight = $iMinWidth / $fRatio_GUI ;min. Höhe anhand der min. Breite und des Seitenverhältnisse berechnen
    $iMaxHeight = $iMaxWidth / $fRatio_GUI ;max. Höhe anhand der max. Breite und des Seitenverhältnisse berechnen
    If $iMaxHeight > @DesktopHeight Then ;max. Höhe größer als der Bildschirm >>> neue max. Breite ermitteln
    $iMaxHeight = @DesktopHeight
    $iMaxWidth = $iMaxHeight * $fRatio_GUI
    EndIf
    _WinAPI_SetWindowPos($hWnd, 0, $iX, $iY, $iWidth, $iHeight, $SWP_NOZORDER)
    EndFunc ;==>_LoadImage

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

    Func OnEraseBkGnd($hWnd, $message, $wParam, $lParam)
    Local $rcClient
    Local $hObjOld
    Local $rcRight, $rcBottom
    Local $bmWidth, $bmHeight
    Local $bm = DllStructCreate($BITMAP)

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

    If (Not $hBmp) Then Return 1

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

    ; get the window's client area
    $rcClient = _WinAPI_GetClientRect($hWnd)

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

    $rcRight = DllStructGetData($rcClient, "Right")
    $rcBottom = DllStructGetData($rcClient, "Bottom")

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

    ; get the bitmap dimensions
    _WinAPI_GetObject($hBmp, DllStructGetSize($bm), DllStructGetPtr($bm))

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

    ; select the bitmap into the memory DC
    $hObjOld = _WinAPI_SelectObject($hDC_Mem, $hBmp)

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

    $bmWidth = DllStructGetData($bm, "bmWidth")
    $bmHeight = DllStructGetData($bm, "bmHeight")

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

    DllCall("gdi32.dll", "INT", "SetStretchBltMode", "HANDLE", $wParam, "INT", 4)

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

    StretchBlt($wParam, 0, 0, $rcRight, $rcBottom, $hDC_Mem, 0, 0, $bmWidth, $bmHeight, $SRCCOPY)

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

    _WinAPI_SelectObject($hDC_Mem, $hObjOld)

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

    Return 1
    EndFunc ;==>OnEraseBkGnd

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

    Func StretchBlt($hDCDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hDCSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $dwRop)
    Local $aRes = DllCall("gdi32.dll", "BOOL", "StretchBlt", "HANDLE", $hDCDest, "INT", $nXOriginDest, "INT", $nYOriginDest, "INT", $nWidthDest, "INT", $nHeightDest, "HANDLE", $hDCSrc, "INT", $nXOriginSrc, "INT", $nYOriginSrc, "INT", $nWidthSrc, "INT", $nHeightSrc, "DWORD", $dwRop)
    Return $aRes[0]
    EndFunc ;==>StretchBlt

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

    Func WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
    Local $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 7, $iMinWidth) ; min X
    DllStructSetData($minmaxinfo, 8, $iMinHeight) ; min Y
    DllStructSetData($minmaxinfo, 9, $iMaxWidth) ; max X
    DllStructSetData($minmaxinfo, 10, $iMaxHeight) ; max Y
    Return "GUI_RUNDEFMSG"
    EndFunc ;==>WM_GETMINMAXINFO

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

    Func WM_SIZING($hWnd, $iMsg, $wParam, $lParam)
    Local $tRect_Cur = DllStructCreate("int[4]", $lParam)
    Local $left = DllStructGetData($tRect_Cur, 1, 1)
    Local $top = DllStructGetData($tRect_Cur, 1, 2)
    Local $right = DllStructGetData($tRect_Cur, 1, 3)
    Local $bottom = DllStructGetData($tRect_Cur, 1, 4)

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

    Switch $wParam ;drag side or corner
    Case 1, 2, 4, 7
    Local $iNewY = Int(($right - $left) / $fRatio_GUI)
    DllStructSetData($tRect_Cur, 1, $top + $iNewY, 4)
    Case Else
    Local $iNewX = Int(($bottom - $top) * $fRatio_GUI)
    DllStructSetData($tRect_Cur, 1, $left + $iNewX, 3)
    EndSwitch

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

    Return "GUI_RUNDEFMSG"
    EndFunc ;==>WM_SIZING

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

    Func _beenden()
    ; free resources
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_DeleteDC($hDC_Mem)

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

    _GDIPlus_Shutdown()

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

    Exit
    EndFunc ;==>_beenden

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _WinAPI_AdjustWindowRectEx
    ; Description....: Calculates the required size of the window rectangle, based on the desired size of the client rectangle.
    ; Syntax.........: _WinAPI_AdjustWindowRectEx ( ByRef $tRECT, $iStyle [, $iExStyle [, $fMenu] )
    ; Parameters.....: $tRECT - $tagRECT structure that contains the coordinates of the desired client area.
    ; $iStyle - The window style of the window whose required size is to be calculated. Note that you cannot
    ; specify the $WS_OVERLAPPED style.
    ; $iExStyle - The extended window style of the window whose required size is to be calculated.
    ; $fMenu - Specifies whether the window has a menu, valid values:
    ; |TRUE - The window has a menu, valid values:
    ; |FALSE - The window does not has a menu. (Default)
    ; Return values..: Success - 1.
    ; Failure - 0 and sets the @error flag to non-zero.
    ; Author.........: Yashied
    ; Modified.......:
    ; Remarks........: None
    ; Related........:
    ; Link...........: @@MsdnLink@@ AdjustWindowRectEx
    ; Example........: Yes
    ; ===============================================================================================================================

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

    Func _WinAPI_AdjustWindowRectEx(ByRef $tRect, $iStyle, $iExStyle = 0, $fMenu = 0)

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

    Local $Ret = DllCall('user32.dll', 'int', 'AdjustWindowRectEx', 'ptr', DllStructGetPtr($tRect), 'dword', $iStyle, 'int', $fMenu, 'dword', $iExStyle)

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

    If (@error) Or (Not $Ret[0]) Then
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>_WinAPI_AdjustWindowRectEx

    [/autoit]


    Jetzt wird es über GDI+ geladen und dann wird im Speicher aus der GDI+ Bitmap eine mit GDI kompatible Bitmap erzeugt.

  • Bildgröße laufend an GUI anpassen

    • name22
    • 16. November 2012 um 17:30

    Sorry wenn das so ein langwieriger Prozess ist, aber das Script ist mittlerweile ein ziemlich unübersichtlicher Flickenteppich aus 3 komplett verschiedenen Coding-Stilen ^^.
    Ich habe mal das eingebaut von dem ich glaube, dass du es eingebaut haben willst. Du kannst jetzt über die Funktion _LoadImage eine beliebige Bitmap am Scriptanfang (oder irgendwann im Scriptverlauf) laden und auch danach durch eine andere ersetzen.

    Spoiler anzeigen
    [autoit]

    #region ;************ Includes ************
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include <ScreenCapture.au3>
    #include <Constants.au3>
    #include <SendMessage.au3>
    #endregion ;************ Includes ************

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

    Global $iGUI_WidthInitial = 800, $iMinWidth = 200, $iMinHeight, $iMaxWidth = 1300, $iMaxHeight, $fRatio_Image, $fRatio_GUI
    Global $hBmp, $hDC_Mem
    Global $sPath_ImageInitial = FileOpenDialog("Bild auswählen", "", "Bitmap (*.bmp)")

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

    Opt("GUIOnEventMode", 1) ; 0=ausgeschaltet, 1=OnEvent Modus aktiviert

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

    Global Const $BITMAP = "LONG bmType;LONG bmWidth;LONG bmHeight;LONG bmWidthBytes;WORD bmPlanes;WORD bmBitsPixel;PTR bmBits;"
    Global Const $HWND_DESKTOP = _WinAPI_GetDesktopWindow()

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

    $hDC = _WinAPI_GetDC($HWND_DESKTOP)
    $hDC_Mem = _WinAPI_CreateCompatibleDC($hDC)
    _WinAPI_ReleaseDC($HWND_DESKTOP, $hDC)

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

    GUIRegisterMsg($WM_ERASEBKGND, "OnEraseBkGnd")
    GUIRegisterMsg($WM_SIZING, "WM_SIZING")
    GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")

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

    Global $hWnd = GUICreate("Test", 0, 0, -1, -1, $WS_OVERLAPPEDWINDOW)
    GUISetState()

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

    _LoadImage($sPath_ImageInitial)

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

    GUISetOnEvent($GUI_EVENT_CLOSE, "_beenden")

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

    ;Schleife
    While Sleep(1000)
    WEnd

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

    Func _LoadImage($sPath_Image)
    Local $tRect = DllStructCreate($tagRECT)
    Local $tBM = DllStructCreate($BITMAP)

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

    If $hBmp Then _WinAPI_DeleteObject($hBmp)

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

    $hBmp = _WinAPI_LoadImage(0, $sPath_Image, $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE)
    _WinAPI_GetObject($hBmp, DllStructGetSize($tBM), DllStructGetPtr($tBM))
    $fRatio_Image = DllStructGetData($tBM, "bmWidth") / DllStructGetData($tBM, "bmHeight")

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

    DllStructSetData($tRect, "Left", 0)
    DllStructSetData($tRect, "Top", 0)
    DllStructSetData($tRect, "Right", $iGUI_WidthInitial)
    DllStructSetData($tRect, "Bottom", $iGUI_WidthInitial / $fRatio_Image)

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

    _WinAPI_AdjustWindowRectEx($tRect, BitXOR(_WinAPI_GetWindowLong($hWnd, $GWL_STYLE), $WS_OVERLAPPEDWINDOW), _WinAPI_GetWindowLong($hWnd, $GWL_EXSTYLE))
    $iWidth = DllStructGetData($tRect, "Right") - DllStructGetData($tRect, "Left")
    $iHeight = DllStructGetData($tRect, "Bottom") - DllStructGetData($tRect, "Top")
    $iX = @DesktopWidth / 2 - $iWidth / 2
    $iY = @DesktopHeight / 2 - $iHeight / 2
    $fRatio_GUI = $iWidth / $iHeight

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

    $iMinHeight = $iMinWidth / $fRatio_GUI ;min. Höhe anhand der min. Breite und des Seitenverhältnisse berechnen
    $iMaxHeight = $iMaxWidth / $fRatio_GUI ;max. Höhe anhand der max. Breite und des Seitenverhältnisse berechnen
    If $iMaxHeight > @DesktopHeight Then ;max. Höhe größer als der Bildschirm >>> neue max. Breite ermitteln
    $iMaxHeight = @DesktopHeight
    $iMaxWidth = $iMaxHeight * $fRatio_GUI
    EndIf
    _WinAPI_SetWindowPos($hWnd, 0, $iX, $iY, $iWidth, $iHeight, $SWP_NOZORDER)
    EndFunc ;==>_LoadImage

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

    Func OnEraseBkGnd($hWnd, $message, $wParam, $lParam)
    Local $rcClient
    Local $hObjOld
    Local $rcRight, $rcBottom
    Local $bmWidth, $bmHeight
    Local $bm = DllStructCreate($BITMAP)

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

    If (Not $hBmp) Then Return 1

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

    ; get the window's client area
    $rcClient = _WinAPI_GetClientRect($hWnd)

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

    $rcRight = DllStructGetData($rcClient, "Right")
    $rcBottom = DllStructGetData($rcClient, "Bottom")

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

    ; get the bitmap dimensions
    _WinAPI_GetObject($hBmp, DllStructGetSize($bm), DllStructGetPtr($bm))

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

    ; select the bitmap into the memory DC
    $hObjOld = _WinAPI_SelectObject($hDC_Mem, $hBmp)

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

    $bmWidth = DllStructGetData($bm, "bmWidth")
    $bmHeight = DllStructGetData($bm, "bmHeight")

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

    DllCall("gdi32.dll", "INT", "SetStretchBltMode", "HANDLE", $wParam, "INT", 4)

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

    StretchBlt($wParam, 0, 0, $rcRight, $rcBottom, $hDC_Mem, 0, 0, $bmWidth, $bmHeight, $SRCCOPY)

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

    _WinAPI_SelectObject($hDC_Mem, $hObjOld)

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

    Return 1
    EndFunc ;==>OnEraseBkGnd

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

    Func StretchBlt($hDCDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hDCSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $dwRop)
    Local $aRes = DllCall("gdi32.dll", "BOOL", "StretchBlt", "HANDLE", $hDCDest, "INT", $nXOriginDest, "INT", $nYOriginDest, "INT", $nWidthDest, "INT", $nHeightDest, "HANDLE", $hDCSrc, "INT", $nXOriginSrc, "INT", $nYOriginSrc, "INT", $nWidthSrc, "INT", $nHeightSrc, "DWORD", $dwRop)
    Return $aRes[0]
    EndFunc ;==>StretchBlt

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

    Func WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
    Local $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
    DllStructSetData($minmaxinfo, 7, $iMinWidth) ; min X
    DllStructSetData($minmaxinfo, 8, $iMinHeight) ; min Y
    DllStructSetData($minmaxinfo, 9, $iMaxWidth) ; max X
    DllStructSetData($minmaxinfo, 10, $iMaxHeight) ; max Y
    Return "GUI_RUNDEFMSG"
    EndFunc ;==>WM_GETMINMAXINFO

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

    Func WM_SIZING($hWnd, $iMsg, $wParam, $lParam)
    Local $tRect_Cur = DllStructCreate("int[4]", $lParam)
    Local $left = DllStructGetData($tRect_Cur, 1, 1)
    Local $top = DllStructGetData($tRect_Cur, 1, 2)
    Local $right = DllStructGetData($tRect_Cur, 1, 3)
    Local $bottom = DllStructGetData($tRect_Cur, 1, 4)

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

    Switch $wParam ;drag side or corner
    Case 1, 2, 4, 7
    Local $iNewY = Int(($right - $left) / $fRatio_GUI)
    DllStructSetData($tRect_Cur, 1, $top + $iNewY, 4)
    Case Else
    Local $iNewX = Int(($bottom - $top) * $fRatio_GUI)
    DllStructSetData($tRect_Cur, 1, $left + $iNewX, 3)
    EndSwitch

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

    Return "GUI_RUNDEFMSG"
    EndFunc ;==>WM_SIZING

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

    Func _beenden()
    ; free resources
    _WinAPI_DeleteObject($hBmp)
    _WinAPI_DeleteDC($hDC_Mem)

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

    Exit
    EndFunc ;==>_beenden

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _WinAPI_AdjustWindowRectEx
    ; Description....: Calculates the required size of the window rectangle, based on the desired size of the client rectangle.
    ; Syntax.........: _WinAPI_AdjustWindowRectEx ( ByRef $tRECT, $iStyle [, $iExStyle [, $fMenu] )
    ; Parameters.....: $tRECT - $tagRECT structure that contains the coordinates of the desired client area.
    ; $iStyle - The window style of the window whose required size is to be calculated. Note that you cannot
    ; specify the $WS_OVERLAPPED style.
    ; $iExStyle - The extended window style of the window whose required size is to be calculated.
    ; $fMenu - Specifies whether the window has a menu, valid values:
    ; |TRUE - The window has a menu, valid values:
    ; |FALSE - The window does not has a menu. (Default)
    ; Return values..: Success - 1.
    ; Failure - 0 and sets the @error flag to non-zero.
    ; Author.........: Yashied
    ; Modified.......:
    ; Remarks........: None
    ; Related........:
    ; Link...........: @@MsdnLink@@ AdjustWindowRectEx
    ; Example........: Yes
    ; ===============================================================================================================================

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

    Func _WinAPI_AdjustWindowRectEx(ByRef $tRect, $iStyle, $iExStyle = 0, $fMenu = 0)

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

    Local $Ret = DllCall('user32.dll', 'int', 'AdjustWindowRectEx', 'ptr', DllStructGetPtr($tRect), 'dword', $iStyle, 'int', $fMenu, 'dword', $iExStyle)

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

    If (@error) Or (Not $Ret[0]) Then
    Return SetError(1, 0, 0)
    EndIf
    Return 1
    EndFunc ;==>_WinAPI_AdjustWindowRectEx

    [/autoit]
  • Button mit 2 Funktionen

    • name22
    • 16. November 2012 um 17:25

    Ja. Das hast du doch auch schon gemacht wenn ich das richtig verstehe? Wie willst du die beiden zusätzlichen Funktionen nach der Passwortabfrage denn aufrufen? Sollen die nacheinander per Knopfdruck betätigt werden oder wie?

  • Youtube Video in GUI einbinden.

    • name22
    • 16. November 2012 um 17:21

    Wenn ich mir das so überlege bin ich mir gar nicht mehr sicher ob Youtube da jetzt was dagegen hat oder nicht...
    @hauke Das Einbetten per bereitgestelltem HTML Code ist eine von Youtube ausdrücklich zur Verfügung gestellte Möglichkeit diese Videos abzuspielen und ist somit laut Nutzungsbedingungen erlaubt.

    Wenn Captcha einfach das Video in einer HTML Seite einbettet und dann diese Seite in seiner GUI anzeigt, sollte es keine Probleme geben. Ich mache mir nur Gedanken falls das eine Art Youtube Ersatz werden soll. Dann würden die Youtube-Dienste (nach Videos suchen etc.) benutzt werden, ohne dass das Youtube Logo irgendwo zu sehen ist. Manche Anbieter mögen sowas auch nicht. Ich bin aber kein Experte, solange also niemand mit mehr Ahnung sagt, dass das nicht in Ordnung ist habe ich nichts dagegen. :S

  • Youtube Video in GUI einbinden.

    • name22
    • 16. November 2012 um 16:46

    @Captcha Bitte hör auf alles in fettgedruckten Buchstaben zu schreiben. :rolleyes:

    Zitat von Captcha

    Aber ich möchte ja das nur das video zu sehen ist , und nicht die ganze page :S

    Das will Youtube aber nicht. Sie verabscheuen das sogar so sehr, dass sie das in ähnlicher Form 6 mal wiederholen. Sobald ein Script gegen die Nutzungsbedingungen oder AGB eines Dienstes verstößt, verstößt es auch gegen unsere Forenregeln.

    Bitte lesen
    Zitat von Youtube - Nutzungsbedingungen

    [...]Sie erklären sich damit einverstanden, nicht einen Teil oder Teile der Webseite über irgendein Medium zu vertreiben, ohne dass YouTube dies zuvor schriftlich autorisiert hat. Dies bezieht sich auch – nicht aber ausschließlich – auf jegliche Nutzerübermittlung (wie unten definiert);
    Sie erklären sich damit einverstanden, keinen Teil der Webseite oder irgendeinen der Dienste zu verändern oder zu modifizieren (einschließlich – nicht aber beschränkt auf – den YouTube-Player und seine zugehörigen Technologien);
    Sie erklären sich damit einverstanden, auf Nutzerübermittlungen (wie unten definiert) oder andere auf der Webseite verfügbar gemachte Inhalte (einschließlich YouTube-Inhalte wie unten definiert) nicht über irgendwelche andere Technologien oder Mittel als die Video-Wiedergabeseiten der Webseite selbst, den YouTube-Player oder solche anderen Mittel zuzugreifen, die YouTube ausdrücklich für diesen Zweck bestimmt;
    Sie erklären sich damit einverstanden, keine sicherheitsbezogenen Funktionen der Webseite oder solche Funktionen zu umgehen (oder dies zu versuchen), auszuschalten oder in sonstiger Weise zu beeinträchtigen, welche (i) die Nutzung oder Vervielfältigung von Nutzerübermittlungen oder YouTube-Inhalten verhindern oder beschränken oder (ii) Beschränkungen der Nutzbarkeit der Webseite oder der über die Webseite zugänglichen Inhalte sicherstellen;[...]

  • Button mit 2 Funktionen

    • name22
    • 16. November 2012 um 15:20

    Wann sollen diese Funktionen denn ausgeführt werden? Ich verstehe nicht ganz wie du dir das vorstellst..

  • Micha

    • name22
    • 15. November 2012 um 18:45

    Herzlich Willkommen miggk. Viel Spaß im Forum ;).

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™