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

Beiträge von eukalyptus

  • Bitmap Daten direkt aus Arbeitsspeicher auslesen

    • eukalyptus
    • 21. Dezember 2010 um 19:26

    In diesem Fall würde ich es in Gdi+ umwandeln und dann mit _GdiPlus_ImageSaveToFile speichern.
    Bei Bedarf wieder laden, zu einem HBitmap umwandeln und auf ein DDBitmap blitten...

    trotzdem hier noch meine Version mit Speicherfunktion

    Spoiler anzeigen
    [autoit]

    #include <Memory.au3>
    #include <ScreenCapture.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>

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

    $hBmp = _ScreenCapture_Capture("", 0, 0, 500, 500)
    $tData = _GetBmpData($hBmp)
    _WinAPI_DeleteObject($hBmp)
    _SaveBmpData(@ScriptDir & "\Test.dat", $tData)

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

    $tDataNew = _LoadBmpData(@ScriptDir & "\Test.dat")
    $hBmpNew = _CreateBmpFromData($tDataNew)
    _ScreenCapture_SaveImage(@ScriptDir & "\Test.bmp", $hBmpNew)

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

    Func _SaveBmpData($sFilename, $tData)
    Local $tSave = DllStructCreate("byte[" & DllStructGetSize($tData) & "]", DllStructGetPtr($tData))
    Local $hFile = FileOpen($sFilename, 18)
    FileWrite($hFile, DllStructGetData($tSave, 1))
    FileClose($hFile)
    EndFunc ;==>_SaveBmpData

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

    Func _LoadBmpData($sFilename)
    Local $hFile = FileOpen($sFilename, 16)
    Local $bData = FileRead($hFile)
    FileClose($hFile)

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

    Local $tLoad = DllStructCreate("byte[" & BinaryLen($bData) & "]")
    DllStructSetData($tLoad, 1, $bData)
    Local $tBITMAPINFO = DllStructCreate($tagBITMAPINFO, DllStructGetPtr($tLoad))

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

    Local $iSize = DllStructGetData($tBITMAPINFO, "SizeImage")
    Local $tStruct = DllStructCreate($tagBITMAPINFO & ";byte Data[" & $iSize & "]")
    _MemMoveMemory(DllStructGetPtr($tLoad), DllStructGetPtr($tStruct), DllStructGetSize($tLoad))
    Return $tStruct
    EndFunc ;==>_LoadBmpData

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

    Func _CreateBmpFromData($tData)
    Local $tBITMAPINFO = DllStructCreate($tagBITMAPINFO, DllStructGetPtr($tData))
    Local $iSize = DllStructGetData($tBITMAPINFO, "SizeImage")
    Local $tStruct = DllStructCreate($tagBITMAPINFO & ";byte Data[" & $iSize & "]", DllStructGetPtr($tData))
    Local $pStruct = DllStructGetPtr($tStruct)

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

    Local $iWidth = DllStructGetData($tBITMAPINFO, "Width")
    Local $iHeight = DllStructGetData($tBITMAPINFO, "Height")

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

    Local $hWnd = _WinAPI_GetDesktopWindow()
    Local $hDDC = _WinAPI_GetDC($hWnd)
    Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight)
    _WinAPI_SetDIBits($hDDC, $hBmp, 0, $iHeight, $pStruct + DllStructGetSize($tBITMAPINFO), DllStructGetPtr($tBITMAPINFO))

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

    _WinAPI_ReleaseDC($hWnd, $hDDC)
    Return $hBmp
    EndFunc ;==>_CreateBmpFromData

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

    Func _GetBmpData($hBmp)
    Local $tBITMAPINFO = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBITMAPINFO, "Size", DllStructGetSize($tBITMAPINFO))

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

    Local $hWnd = _WinAPI_GetDesktopWindow()
    Local $hDDC = _WinAPI_GetDC($hWnd)
    _WinAPI_GetDIBits($hDDC, $hBmp, 0, 0, 0, DllStructGetPtr($tBITMAPINFO), 0)

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

    Local $iSize = DllStructGetData($tBITMAPINFO, "SizeImage")
    Local $tData = DllStructCreate($tagBITMAPINFO & ";byte Data[" & $iSize & "]")
    DllStructSetData($tData, "Size", DllStructGetSize($tBITMAPINFO))
    Local $pData = DllStructGetPtr($tData)

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

    Local $iLines = DllStructGetData($tBITMAPINFO, "Height")

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

    _WinAPI_GetDIBits($hDDC, $hBmp, 0, 0, 0, $pData, 0)
    _WinAPI_GetDIBits($hDDC, $hBmp, 0, $iLines, $pData + DllStructGetSize($tBITMAPINFO), $pData, 0)

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

    _WinAPI_ReleaseDC($hWnd, $hDDC)
    Return $tData
    EndFunc ;==>_GetBmpData

    [/autoit]
  • Bitmap Daten direkt aus Arbeitsspeicher auslesen

    • eukalyptus
    • 21. Dezember 2010 um 18:51

    Hab hier nochwas ohne GDI+
    ist bei mir doppelt so schnell wie LockBits

    Spoiler anzeigen
    [autoit]

    #include <Memory.au3>
    #include <ScreenCapture.au3>
    #include <StructureConstants.au3>
    #include <WinAPI.au3>

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

    $iTimer = TimerInit()
    $hBmp = _ScreenCapture_Capture("", 0, 0, 500, 500)
    $tData = _GetBmpData($hBmp)
    _WinAPI_DeleteObject($hBmp)

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

    $hBmpNew = _CreateBmpFromData($tData)
    ConsoleWrite(TimerDiff($iTimer) & @CRLF)
    _ScreenCapture_SaveImage(@ScriptDir & "\Test.bmp", $hBmpNew)

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

    Func _CreateBmpFromData($tData)
    Local $tBITMAPINFO = DllStructCreate($tagBITMAPINFO, DllStructGetPtr($tData))
    Local $iSize = DllStructGetData($tBITMAPINFO, "SizeImage")
    Local $tStruct = DllStructCreate($tagBITMAPINFO & ";byte Data[" & $iSize & "]", DllStructGetPtr($tData))
    Local $pStruct = DllStructGetPtr($tStruct)
    Local $aResult = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBITMAPINFO), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'dword', 0)
    _MemMoveMemory($pStruct + DllStructGetSize($tBITMAPINFO), $aResult[4], $iSize)
    Return $aResult[0]
    EndFunc ;==>_CreateBmpFromData

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

    Func _GetBmpData($hBmp)
    Local $tBITMAPINFO = DllStructCreate($tagBITMAPINFO)
    DllStructSetData($tBITMAPINFO, "Size", DllStructGetSize($tBITMAPINFO))

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

    Local $hWnd = _WinAPI_GetDesktopWindow()
    Local $hDDC = _WinAPI_GetDC($hWnd)
    _WinAPI_GetDIBits($hDDC, $hBmp, 0, 0, 0, DllStructGetPtr($tBITMAPINFO), 0)

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

    Local $iSize = DllStructGetData($tBITMAPINFO, "SizeImage")
    Local $tData = DllStructCreate($tagBITMAPINFO & ";byte Data[" & $iSize & "]")
    DllStructSetData($tData, "Size", DllStructGetSize($tBITMAPINFO))
    Local $pData = DllStructGetPtr($tData)

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

    Local $iLines = DllStructGetData($tBITMAPINFO, "Height")

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

    _WinAPI_GetDIBits($hDDC, $hBmp, 0, 0, 0, $pData, 0)
    _WinAPI_GetDIBits($hDDC, $hBmp, 0, $iLines, $pData + DllStructGetSize($tBITMAPINFO), $pData, 0)

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

    _WinAPI_ReleaseDC($hWnd, $hDDC)
    Return $tData
    EndFunc ;==>_GetBmpData

    [/autoit]

    Was willst du mit den Daten eigentlich genau machen?

    E

    Edit: evtl. ist _WinAPI_SetDIBits noch schneller bzw. besser geeignet als CreateDIBSection - musst du halt ausprobieren:

    Spoiler anzeigen
    [autoit]

    Func _CreateBmpFromData($tData)
    Local $tBITMAPINFO = DllStructCreate($tagBITMAPINFO, DllStructGetPtr($tData))
    Local $iSize = DllStructGetData($tBITMAPINFO, "SizeImage")
    Local $tStruct = DllStructCreate($tagBITMAPINFO & ";byte Data[" & $iSize & "]", DllStructGetPtr($tData))
    Local $pStruct = DllStructGetPtr($tStruct)

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

    Local $iWidth = DllStructGetData($tBITMAPINFO, "Width")
    Local $iHeight = DllStructGetData($tBITMAPINFO, "Height")

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

    Local $hWnd = _WinAPI_GetDesktopWindow()
    Local $hDDC = _WinAPI_GetDC($hWnd)
    Local $hBmp = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight)
    _WinAPI_SetDIBits($hDDC, $hBmp, 0, $iHeight, $pStruct + DllStructGetSize($tBITMAPINFO), DllStructGetPtr($tBITMAPINFO))

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

    _WinAPI_ReleaseDC($hWnd, $hDDC)
    Return $hBmp
    EndFunc ;==>_CreateBmpFromData

    [/autoit]
  • Bitmap Daten direkt aus Arbeitsspeicher auslesen

    • eukalyptus
    • 20. Dezember 2010 um 17:07

    Ich weiß leider nicht, wie man das ohne den Umweg überGDI+ machen kann, aber vielleicht ist das hier schnell genug:

    [autoit]

    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <Memory.au3>
    #include <ScreenCapture.au3>
    #include <WinAPI.au3>

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

    _GDIPlus_Startup()
    $hBmp = _ScreenCapture_Capture("", 0, 0, 50, 50)
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
    _WinAPI_DeleteObject($hBmp)

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

    $BitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, 50, 50, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    $Stride = DllStructGetData($BitmapData, "Stride")
    $Width = DllStructGetData($BitmapData, "Width")
    $Height = DllStructGetData($BitmapData, "Height")
    $Scan0 = DllStructGetData($BitmapData, "Scan0")
    $PixelData = DllStructCreate("dword[" & $Width * $Height & ']', $Scan0)

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

    $tBitmap = DllStructCreate("dword[" & $Width * $Height & ']')
    _MemMoveMemory(DllStructGetPtr($PixelData), DllStructGetPtr($tBitmap), DllStructGetSize($PixelData))

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

    _GDIPlus_BitmapUnlockBits($hBitmap, $BitmapData)
    _GDIPlus_BitmapDispose($hBitmap)

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

    $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $Width, "int", $Height, "int", $Stride, "int", $GDIP_PXF32ARGB, "ptr", DllStructGetPtr($tBitmap), "int*", 0)
    $hBitmapNew = $aResult[6]
    $hBmpNew = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBitmapNew)
    _GDIPlus_BitmapDispose($hBitmapNew)
    _GDIPlus_Shutdown()

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

    _ScreenCapture_SaveImage(@ScriptDir & "\Test.bmp", $hBmpNew)

    [/autoit]
  • Bitmap Daten direkt aus Arbeitsspeicher auslesen

    • eukalyptus
    • 20. Dezember 2010 um 16:55

    zu einem GDIPlus Bitmap umwandeln und via LockBits auslesen

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <GDIPlus.au3>
    #include <GDIPlusConstants.au3>
    #include <ScreenCapture.au3>

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

    _GDIPlus_Startup()
    $hBmp = _ScreenCapture_Capture("", 0, 0, 50, 50)
    $hBitmap = _GDIPlus_BitmapCreateFromHBITMAP($hBmp)
    _WinAPI_DeleteObject($hBmp)

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

    $BitmapData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, 50, 50, $GDIP_ILMREAD, $GDIP_PXF32ARGB)
    $Stride = DllStructGetData($BitmapData, "Stride")
    $Width = DllStructGetData($BitmapData, "Width")
    $Height = DllStructGetData($BitmapData, "Height")
    $Scan0 = DllStructGetData($BitmapData, "Scan0")
    $PixelData = DllStructCreate("dword[" & $Width * $Height & ']', $Scan0)
    Global $aPixels[$Width][$Height]
    For $row = 0 To $Height - 1
    For $col = 0 To $Width - 1
    $aPixels[$col][$row] = Hex(DllStructGetData($PixelData, 1, ($row * $Width) + $col + 1))
    Next
    Next
    _GDIPlus_BitmapUnlockBits($hBitmap, $BitmapData)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_Shutdown()

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

    _ArrayDisplay($aPixels)

    [/autoit]

    E

  • Gegenteil von $WS_EX_TOPMOST

    • eukalyptus
    • 10. Dezember 2010 um 09:39

    Am besten via WM_WINDOWPOSCHANGING:

    Spoiler anzeigen
    [autoit]

    #include <WindowsConstants.au3>

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

    Opt("GuiOnEventMode", 1)

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

    Global $hGui = GUICreate("Test", 640, 480)
    GUISetOnEvent(-3, "_Exit")
    GUIRegisterMsg($WM_WINDOWPOSCHANGING, "_WM_WINDOWPOSCHANGING")
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _WM_WINDOWPOSCHANGING($hWnd, $iMsg, $wParam, $lParam)
    Local $tPos = DllStructCreate("hwnd hwnd;hwnd InsertAfter;int x;int y;int cx;int cy;uint flags", $lParam)
    DllStructSetData($tPos, "InsertAfter", 1)
    EndFunc ;==>_WM_WINDOWPOSCHANGING

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

    Func _Exit()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    E

  • Happy Birthday Pee und Funkey

    • eukalyptus
    • 4. Dezember 2010 um 10:08

    Alles, alles Gute! :party:

    Und feiert beide recht schön...

  • transparente Pixel eines .png finden

    • eukalyptus
    • 4. Dezember 2010 um 10:05

    Ich denke mal, du musst bei LockBits den Parameter $GDIP_PXF32ARGB angeben...

    E

  • _GDIPlus_BitmapLoadFromFile spezifische Größe

    • eukalyptus
    • 29. November 2010 um 20:33

    Nein, brauchst du nicht!

    Spoiler anzeigen
    [autoit]

    #cs Kommentar:
    Der Quelltext geht sicherlich kürzer, allerdings habe ich jetzt keine lust, ihn zu überarbeiten
    Wenn Zeit da ist, werde ich dies villt. machen
    Diese Funktion läd euch ein Bild wie _GDIPlus_BitmapCreateFromFile in ein Bitmapobjekt, nur dass ihr
    bestimmen könnt, welche Größe es hat. Anpassungsfähigkeit ist gegeben.
    Der Zweck besteht darin, dass ein großes Bild nicht ständig wieder kleiner gezeichnet werden muss, was Vorteile hat,
    besonders bei Performence. In meinem Test hatte ich statt 22-30ms nurnoch 6-10ms Zeichenzeit.
    Viel Spaß damit ;)
    #ce
    #include <GDIPlus.au3>
    _GDIPlus_StartUp()
    $hWnd = GUICreate("Beispiel Bitmap Laden", 200, 200)
    GUISetState(@SW_SHOW)
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    $sPath = FileOpenDialog("Bild auswählen", @MyDocumentsDir, "(*.jpg)|(*.bmp)|(*.gif)|(*.png)")
    $hTime = TimerInit()
    $hBitmap = _GDIPlus_BitmapLoadFromFile($sPath, 200, 200, 1) ; es wird automatisch passen
    ; um eine feste höhe anzulegen, nehmt als letzte parameter 2 und "height", für eine feste weite einfach 2 und "widht"
    WinSetTitle("Beispiel Bitmap Laden", "", Round(TimerDiff($hTime), 2) & "ms zum Laden benötigt")
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hBitmap, 0, 0, _GDIPlus_ImageGetWidth($hBitmap), _GDIPlus_ImageGetHeight($hBitmap))
    Sleep(3000)
    _GDIPlus_BitmapDispose($hBitmap)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
    GUIDelete($hWnd)
    Exit

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

    ; #FUNCTION# ====================================================================================================================
    ; Name...........: _GDIPlus_BitmapLoadFromFile
    ; Description ...: Erstellt ein Bitmapobjekt mit einer Spezifischen Größe
    ; Syntax.........: _GDIPlus_BitmapLoadFromFile($s_Path[, $i_Widht[, $i_Height[, $i_Opt]]])
    ; Parameters ....: $s_Path - Pfad der Bilddatei
    ; $i_Widht - Weite des Bitmapobjektes
    ; $i_Height - Höhe des Bitmapobjektes
    ; $i_Opt - (optional) Verhältnisse anpassen, falls gewollt (0=Nein/1=Ja/2=Fortgeschritten ; Standart = 0)
    ; Return values .: Sucess - Bitmapobjekt mit dem geladenen Bild
    ; Failure - 0 und setzt @error auf
    ; |1 - Dateipfad ungültig
    ; |2 - Option falsch gesetzt
    ; Author ........: black_skorpi (@autoit.de)
    ; Example .......: Yes
    ; ===============================================================================================================================
    Func _GDIPlus_BitmapLoadFromFile($s_Path, $i_Widht, $i_Height, $i_Opt = 0, $s_Opt = "")
    Local $hWnd=_WinAPI_GetDesktopWindow()
    Local $h_Image = _GDIPlus_ImageLoadFromFile($s_Path)
    If @error Then Return SetError(1, 0, 0)
    Local $a_Verh[3] = [_GDIPlus_ImageGetHeight($h_Image),_GDIPlus_ImageGetWidth($h_Image),_GDIPlus_ImageGetHeight($h_Image) / _GDIPlus_ImageGetWidth($h_Image)]
    If ($i_Opt <> 0) And ($i_Opt <> 1) And ($i_Opt <> 2) Then SetError(2, 0, 0)
    If $i_Opt = 1 Then
    If $a_Verh[2] < 1 Then
    $s_Opt = "widht"
    ElseIf $a_Verh[2] > 1 Then
    $s_Opt = "height"
    ElseIf $a_Verh[2] = 1 Then
    $i_Opt = 0
    EndIf
    EndIf
    If $i_Opt = 0 Then
    Local $h_Graphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    Local $h_Bitmap = _GDIPlus_BitmapCreateFromGraphics($i_Widht, $i_Height, $h_Graphic), $h_Buffer = _GDIPlus_ImageGetGraphicsContext($h_Bitmap)
    _GDIPlus_GraphicsDrawImageRectRect($h_Buffer, $h_Image, 0, 0, $a_Verh[0], $a_Verh[1], 0, 0, $i_Widht, $i_Height)
    Else
    Switch $s_Opt
    Case "widht"
    Local $h_Graphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    Local $h_Bitmap = _GDIPlus_BitmapCreateFromGraphics($i_Widht, $i_Widht * $a_Verh[2], $h_Graphic), $h_Buffer = _GDIPlus_ImageGetGraphicsContext($h_Bitmap)
    _GDIPlus_GraphicsDrawImageRectRect($h_Buffer, $h_Image, 0, 0, $a_Verh[1], $a_Verh[0], 0, 0, $i_Widht, $i_Widht * $a_Verh[2])
    Case "height"
    Local $h_Graphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
    Local $h_Bitmap = _GDIPlus_BitmapCreateFromGraphics($i_Height / $a_Verh[2], $i_Height, $h_Graphic), $h_Buffer = _GDIPlus_ImageGetGraphicsContext($h_Bitmap)
    _GDIPlus_GraphicsDrawImageRectRect($h_Buffer, $h_Image, 0, 0, $a_Verh[1], $a_Verh[0], 0, 0, $i_Height / $a_Verh[2], $i_Height)
    EndSwitch
    EndIf
    _GDIPlus_GraphicsDispose($h_Graphic)
    _GDIPlus_GraphicsDispose($h_Buffer)
    _GDIPlus_ImageDispose($h_Image)
    Return $h_Bitmap
    EndFunc

    [/autoit]

    Du könntest noch diese Funktionen einbinden:

    [autoit]

    _GDIPlus_GraphicsSetSmoothingMode($h_Buffer, 2)
    DllCall($ghGDIPDll, "int", "GdipSetInterpolationMode", "handle", $h_Buffer, "int", 7)

    [/autoit]


    Damit wird das Bild schöner verkleinert

    E

  • _GDIPlus_BitmapLoadFromFile spezifische Größe

    • eukalyptus
    • 29. November 2010 um 20:24

    praktische Funktion!

    Um dein Bitmap ohne GUI zu erstellen kannst du das machen:

    [autoit]

    _GDIPlus_GraphicsCreateFromHWND(_WinAPI_GetDesktopWindow())

    [/autoit]

    E

  • Gui als Button in Gui + Funktion einbauen

    • eukalyptus
    • 29. November 2010 um 19:32

    Ich würde ein Label "unter" der GDI+ Grafik erstellen.
    Damit funktioniert das Script genauso, als würdest du Buttons benutzen:

    Spoiler anzeigen
    [autoit]

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

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

    Global Const $SS_OWNERDRAW = 0x0000000D

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

    Opt("GUIOnEventMode", 1)

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

    _GDIPlus_Startup()

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

    Global $hGui = GUICreate("Test", 300, 200)
    GUISetOnEvent($GUI_EVENT_CLOSE, "_EXIT")
    Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGui)
    Global $hBmpBuffer = _GDIPlus_BitmapCreateFromGraphics(300, 200, $hGraphics)
    Global $hGfxBuffer = _GDIPlus_ImageGetGraphicsContext($hBmpBuffer)
    _GDIPlus_GraphicsSetSmoothingMode($hGfxBuffer, 2)

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

    Global $hPen = _GDIPlus_PenCreate(0xFFFFFF00)
    Global $hBrush = _GDIPlus_BrushCreateSolid(0xFF0000FF)

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

    _GDIPlus_GraphicsClear($hGfxBuffer, 0xFF000000)

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

    Global $cLabel1 = GUICtrlCreateLabel("", 50, 50, 100, 30, $SS_OWNERDRAW)
    GUICtrlSetOnEvent($cLabel1, "_Button")
    _GDIPlus_GraphicsFillRect($hGfxBuffer, 50, 50, 100, 30, $hBrush)
    _GDIPlus_GraphicsDrawRect($hGfxBuffer, 50, 50, 100, 30, $hPen)

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

    Global $cLabel2 = GUICtrlCreateLabel("", 50, 100, 100, 30, $SS_OWNERDRAW)
    GUICtrlSetOnEvent($cLabel2, "_Button")
    _GDIPlus_GraphicsFillRect($hGfxBuffer, 50, 100, 100, 30, $hBrush)
    _GDIPlus_GraphicsDrawRect($hGfxBuffer, 50, 100, 100, 30, $hPen)

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

    GUIRegisterMsg($WM_PAINT, "WM_PAINT")
    GUISetState()

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

    While 1
    Sleep(100)
    WEnd

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

    Func _Button()
    Switch @GUI_CtrlId
    Case $cLabel1
    MsgBox(0, "", "Button 1 wurde gedrückt")
    Case $cLabel2
    MsgBox(0, "", "Button 2 wurde gedrückt")
    EndSwitch
    EndFunc ;==>_Button

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

    Func WM_PAINT($hWnd, $uMsgm, $wParam, $lParam)
    _GDIPlus_GraphicsDrawImage($hGraphics, $hBmpBuffer, 0, 0)
    Return $GUI_RUNDEFMSG
    EndFunc ;==>WM_PAINT

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

    Func _Exit()
    _GDIPlus_BrushDispose($hBrush)
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGfxBuffer)
    _GDIPlus_BitmapDispose($hBmpBuffer)
    _GDIPlus_GraphicsDispose($hGraphics)
    _GDIPlus_Shutdown()
    Exit
    EndFunc ;==>_Exit

    [/autoit]

    Edit: Das geht natürlich auch mit der GuiGetMsg-Methode!

    E

  • Happy Birthday, Der_Doc

    • eukalyptus
    • 29. November 2010 um 00:51
    Zitat von Greenhorn

    Uuups, verpennt ... :rolleyes:


    Me too...
    Er wirds aber eh nicht merken, da er wahrscheinlich noch immer am Feiern ist :D

    Alles Gute!!!

    E

  • Gui beendet sich bei Klick auf ein Label

    • eukalyptus
    • 29. November 2010 um 00:43

    $exititem und label 9 haben die gleiche ID...

    [autoit]

    TraySetOnEvent($exititem, "_beenden")

    [/autoit]

    Edit: Sorry, war wohl etwas zu schnell :D
    So gehts nämlich nicht

  • Happy Birthday BugFix!

    • eukalyptus
    • 28. November 2010 um 00:47

    Herzlichen Glückwunsch, dem King of Array!

  • Nochmals FFMPEG

    • eukalyptus
    • 27. November 2010 um 23:53

    Der Parameter -vn gilt nur wenn du eine MP3 haben willst

  • GDI+ Bitmap "trapezoid" zeichnen / DrawImage_4Points

    • eukalyptus
    • 27. November 2010 um 20:22

    Hab hier ein paar Koordinate für dich zum debuggen:

    Code
    Global $aDrag[5][2] = [[0, 0],[140, 99],[554, 99],[750, 350],[99, 454]]
    Global $aDrag[5][2] = [[0, 0],[135, 108],[698, 154],[698, 347],[99, 454]]
    Global $aDrag[5][2] = [[0, 0],[91, 242],[696, 172],[705, 447],[91, 314]]
    Global $aDrag[5][2] = [[0, 0],[35, 107],[693, 79],[715, 434],[89, 461]]
    Global $aDrag[5][2] = [[0, 0],[587, 67],[693, 79],[715, 434],[89, 461]]

    Zu verwenden mit dem Bild Logo4.gif aus dem Autoit\Examples\Gui -Ordner

    1) sollte selbsterklärend sein ;)
    2) Bild ist schwarz, linke Punkte können bewegt werden - Bild bleibt schwarz
    3) Bild ist schwarz, rechte Punkte können bewegt werden - Bild bleibt schwarz
    4) Bild scheint generell etwas zu hoch zu sitzen, es ragt über die obernen Punkte hinaus (bzw ist abgeschnitten) und hat zu den unteren Punkten Luft
    5) Komisches Eck links unten

    E

    Noch die Zeile um immer gleich die Koordinaten zu bekommen:

    [autoit]

    ConsoleWrite("Global $aDrag[5][2] = [[0, 0],[" & $aDrag[1][0] & ", " & $aDrag[1][1] & "],[" & $aDrag[2][0] & ", " & $aDrag[2][1] & "],[" & $aDrag[3][0] & ", " & $aDrag[3][1] & "],[" & $aDrag[4][0] & ", " & $aDrag[4][1] & "]]" & @CRLF)

    [/autoit]


    In die Hauptschleife in Switch/Else

  • GDI+ Intro Video für Programme/Spiele

    • eukalyptus
    • 27. November 2010 um 19:45

    Guckst du hier: Videovorschau-Bild

  • GDI+ Bitmap "trapezoid" zeichnen / DrawImage_4Points

    • eukalyptus
    • 27. November 2010 um 19:42

    GROSSARTIG :thumbup:
    Oh Mann - ich bin ganz aufgeregt :rock:

    Wie ist es, wenn du $GDIP_ILMUSERINPUTBUF bei BitLock benutzt?
    wird dann auch eine Kopie erstellt?! vielleicht geht das ja schneller...

    2 Bugs sind mir aufgefallen:
    1) konnte ich leider nicht mehr reproduzieren, als ich die Koordinaten der Eckpunkte auslesen wollte, aber manchmal ist das Bild einfach nur schwarz.
    Verschiebt man einen Punkt etwas, dann ist das Bild wieder da - wieder zurück ist es wieder weg...

    2) siehe Screenshot: Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.


    ps.: Du includest in deinen ASM-Scripts immer die Datei GDIConstants.au3, welche aber standartmässig nicht bei AutoIt dabei ist.

    Dateien

    4Points.JPG 24,05 kB – 0 Downloads
  • GDI+ Intro Video für Programme/Spiele

    • eukalyptus
    • 27. November 2010 um 19:24

    Sieht beeindruckend aus!
    Allerdings ist 23MB doch etwas groß...
    Du könntest das Video als "richtige" Videodatei beilegen (z.B.: DivX kodiert) und bei Scriptstart die einzelnen Bilder mit ffmpeg extrahieren.
    das würde weniger Speicher benötigen.

    Das wär zumindest einen Versuch wert ;)

    E

  • Nochmals FFMPEG

    • eukalyptus
    • 27. November 2010 um 19:15

    Ich hab leider keine Ahnung, wie man Joint-Stereo einstellt!
    zumindest Stereo, falls mp4 mono ist, geht mit "-ac 2"

    Die Zeile sollte so funktionieren:

    Code
    ffmpeg.exe -y -vn -i test.mp4 -ab 320k -ar 48000 -aq 2 -ac 2 test.mp3


    "-vn" = disable video, da mp4 wahrscheinlich auch Videodaten enthält...

    Du könntest auch zunächst in Wav umwandeln und dann lame.exe um eine MP3 daraus zu machen - dann hast du sicher Joint Stereo!

    E

  • Fenstergröße und Bitmapgröße ändern

    • eukalyptus
    • 27. November 2010 um 18:58

    Beim Super Mario Spiel hab ich das so gelöst:

    Backbuffer hat immer dieselbe Größe
    Wenn neu gezeichnet werden soll, dann sende ich via _WinApi_RedrawWindow eine $WM_ERASEBKGND-Message - dadurch wird:
    _WM_ERASEBKGND($hWnd, $uMsg, $wParam, $lParam) aufgerufen; §wParam = DC-Handle
    Dann kann ich mit _GDIPlus_GraphicsCreateFromHDC($wParam) und _GDIPlus_GraphicsDrawImageRect den Backbuffer in der gewünschten Größe zeichnen

    Das macht natürlich nur Sinn, wenn sich der grafische Inhalt proportional mit dem Fenster vergrößern soll!

    E

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™