Hast du das Mozrepl-Addon installiert? Ohne das geht gar nichts.
Beiträge von name22
-
-
Was genau versuchst du alles umzusetzen? Ich hab morgen vermutlich Zeit eines der Scripte hier entsprechend umzuschreiben (wenn ich das umsetzen kann was du willst ^^). Vielleicht hat aber bis dahin auch jemand anders die Lösung.
-
Alles Gute ihr 5 Geburtstags"kinder" :D. Viel Spaß beim feiern ;).
-
Nein. Wurde noch nicht gepostet. Und irgendwie fühle ich mich deswegen gerade ein wenig dämlich ^^.
Die Interpolation ist bei deinem Beispiel halt nicht so schön, aber ansonsten ist es einfacher. Tweaky müsste dann bloß noch sein WM_SIZING gedöns einbauen. -
Bei mir funktioniert es prima
...
Hier noch mal eine saubere Version (ist aber fast der selbe Code):Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Color.au3>$iX = 0
[/autoit] [autoit][/autoit] [autoit]
$iY = 0$sFile = FileOpenDialog("Bild auswählen", "", "Images (*.jpg;*.bmp;*.png)")
[/autoit] [autoit][/autoit] [autoit]
If @error Then Exit_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$hBitmap = _GDIPlus_ImageLoadFromFile($sFile)
[/autoit] [autoit][/autoit] [autoit]
$iColor = _GDIPlus_GetPixel($hBitmap, $iX, $iY)
$tARGB = DllStructCreate("BYTE[4]")
DllStructSetData($tARGB, 1, $iColor)$iA = DllStructGetData($tARGB, 1, 4)
[/autoit] [autoit][/autoit] [autoit]
$iR = DllStructGetData($tARGB, 1, 3)
$iG = DllStructGetData($tARGB, 1, 2)
$iB = DllStructGetData($tARGB, 1, 1)MsgBox(0, "Farbe:", "Alpha: " & @TAB & $iA & @CRLF & "Rot: " & @TAB & $iR & @CRLF & "Grün: " & @TAB & $iG & @CRLF & "Blau: " & @TAB & $iB & @CRLF & @CRLF & "Gesamt: 0x" & Hex($iA, 2) & Hex($iR, 2) & Hex($iG, 2) & Hex($iB, 2))
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_ImageDispose($hBitmap)
[/autoit] [autoit][/autoit] [autoit]
_GDIPlus_Shutdown()Func _GDIPlus_GetPixel($hBitmap, $x, $y)
[/autoit] [autoit][/autoit] [autoit]
; Prog@ndy
Local $result = DllCall($ghGDIPDLL, "int", "GdipBitmapGetPixel", "ptr", $hBitmap, "int", $x, "int", $y, "dword*", 0)
If @error Then Return SetError(1, 0, 0)
Return SetError($result[0], 1, $result[4])
EndFunc ;==>_GDIPlus_GetPixelFunc _GDIPlus_SetPixel($hBitmap, $x, $y, $ARGB)
[/autoit]
; Prog@ndy
Local $result = DllCall($ghGDIPDLL, "int", "GdipBitmapSetPixel", "ptr", $hBitmap, "int", $x, "int", $y, "dword", $ARGB)
If @error Then Return SetError(1, 0, 0)
Return SetError($result[0], 1, $result[0] = 0)
EndFunc ;==>_GDIPlus_SetPixel
Und als Funktion:Spoiler anzeigen
[autoit]Func _ColorGetARGB($iColorARGB)
[/autoit] [autoit][/autoit] [autoit]
;Author: name22 (http://www.autoit.de)
Local $aRet_ARGB[4], $tARGB_Tmp = DllStructCreate("BYTE[4]")DllStructSetData($tARGB_Tmp, 1, $iColorARGB)
[/autoit] [autoit][/autoit] [autoit]
$aRet_ARGB[0] = DllStructGetData($tARGB_Tmp, 1, 4) ;Alpha
$aRet_ARGB[1] = DllStructGetData($tARGB_Tmp, 1, 3) ;Red
$aRet_ARGB[2] = DllStructGetData($tARGB_Tmp, 1, 2) ;Green
$aRet_ARGB[3] = DllStructGetData($tARGB_Tmp, 1, 1) ;BlueReturn $aRet_ARGB
[/autoit]
EndFunc -
Hier mal eine angepasste Version des Beispiels von XovoxKingdom (ungetestet):
Spoiler anzeigen
[autoit]#include <GDIPlus.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <Color.au3>_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]$Bitmap = _GDIPlus_ImageLoadFromFile("Bild.jpg")
[/autoit] [autoit][/autoit] [autoit]
$CLSID = _GDIPlus_EncodersGetCLSID("JPG")
$x = 0
$y = 0
$Color = _GDIPlus_GetPixel($Bitmap, $x, $y)
$tARGB = DllStructCreate("BYTE[4]")
DllStructSetData($tARGB, 1, $Color)
$A=DllStructGetData($tARGB, 1, 1)
$R=DllStructGetData($tARGB, 1, 2)
$G=DllStructGetData($tARGB, 1, 3)
$B=DllStructGetData($tARGB, 1, 4)MsgBox(0,"Farbe:","Alpha: "&@TAB&@TAB&$A&@CRLF&"Rot: "&@TAB&@TAB&$R&@CRLF&"Grün: "&@TAB&@TAB&$G&@CRLF&"Blau: "&@TAB&@TAB&$B&@CRLF&"Hex-Gesamtfarbe: "&@TAB&"0x"&Hex($R,2)&Hex($G,2)&Hex($B,2))
[/autoit] [autoit][/autoit] [autoit]Func _GDIPlus_GetPixel($hBitmap,$X,$Y)
[/autoit]
; Prog@ndy
Local $result = DllCall($ghGDIPDLL, "int", "GdipBitmapGetPixel", "ptr", $hBitmap, "int", $X, "int", $Y, "dword*", 0)
If @error Then Return SetError(1,0,0)
Return SetError($result[0],1,$result[4])
EndFunc
Func _GDIPlus_SetPixel($hBitmap,$X,$Y, $ARGB)
; Prog@ndy
Local $result = DllCall($ghGDIPDLL, "int", "GdipBitmapSetPixel", "ptr", $hBitmap, "int", $X, "int", $Y, "dword", $ARGB)
If @error Then Return SetError(1,0,0)
Return SetError($result[0],1,$result[0]=0)
EndFunc
Sobald ich nach Hause komme kann ich das ganze auch testen, es kann nämlich auch sein, dass ich hier völligen Blödsinn zusammengeschrieben habe. -
Alles Gute unseren drei Geburtstagskindern (wobei sich nur noch eins von denen als Kind bezeichnen lässt, nicht wahr Schachmuschi? :P)!
Viel Erfolg im neuen Lebensjahr und feiert schön.
-
Ganz klar ist es mir immer noch nicht, welche Koordinaten bei WM_SIZING nun verwendet werden.. Zumindest klappt es so:
Spoiler anzeigen
[autoit]#include <WindowsConstants.au3>
[/autoit] [autoit][/autoit] [autoit]
#include <GUIConstants.au3>
#include <Constants.au3>
#include <WinAPI.au3>
#include <ScreenCapture.au3>Global $iGUI_WidthInitial = 800, $fRatio, $iMinWidth = 0, $iMinHeight = 0, $iMaxWidth = 9300, $iMaxHeight = 9300, $iX_Offset, $iY_Offset
[/autoit] [autoit][/autoit] [autoit]
Global $hbmp, $hdcMem; --- $BITMAP
[/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]$fRatio = _WinAPI_GetClientWidth($HWND_DESKTOP) / _WinAPI_GetClientHeight($HWND_DESKTOP)
[/autoit] [autoit][/autoit] [autoit]_AuMain()
[/autoit] [autoit][/autoit] [autoit]Func _AuMain()
[/autoit] [autoit][/autoit] [autoit]
Local $hwndGUIRegisterMsg($WM_CREATE, "OnCreate")
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_ERASEBKGND, "OnEraseBkGnd")
GUIRegisterMsg($WM_SIZING, "WM_SIZING")
GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")$hwnd = GUICreate("Test", $iGUI_WidthInitial, Floor($iGUI_WidthInitial / $fRatio), -1, -1, $WS_OVERLAPPEDWINDOW)
[/autoit] [autoit][/autoit] [autoit]
GUISetState()$fRatio = _WinAPI_GetWindowWidth($hwnd) / _WinAPI_GetWindowHeight($hwnd)
[/autoit] [autoit][/autoit] [autoit]While True
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd; free resources
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_DeleteObject($hbmp)
_WinAPI_DeleteDC($hdcMem)Return 0
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_AuMainFunc OnCreate($hwnd, $message, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $hdc, $bm = DllStructCreate($BITMAP)$hbmp = _ScreenCapture_Capture()
[/autoit] [autoit][/autoit] [autoit]If (Not $hbmp) Then
[/autoit] [autoit][/autoit] [autoit]
; error handling here
ConsoleWrite(StringFormat("_WinAPI_LoadImage fehlgeschlagen!\n"))
EndIf$hdc = _WinAPI_GetDC($HWND_DESKTOP)
[/autoit] [autoit][/autoit] [autoit]
$hdcMem = _WinAPI_CreateCompatibleDC($hdc)_WinAPI_ReleaseDC($HWND_DESKTOP, $hdc)
[/autoit] [autoit][/autoit] [autoit]If (Not $hdcMem) Then
[/autoit] [autoit][/autoit] [autoit]
; error handling here
ConsoleWrite(StringFormat("_WinAPI_CreateCompatibleDC fehlgeschlagen!\n"))
EndIfReturn $GUI_RUNDEFMSG
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>OnCreateFunc OnEraseBkGnd($hwnd, $message, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $rcClient
Local $hObjOld
Local $rcRight, $rcBottom
Local $bmWidth, $bmHeight
Local $bm = DllStructCreate($BITMAP)If (Not $hbmp) Then
[/autoit] [autoit][/autoit] [autoit]
Return 1
EndIf; get the window's client area
[/autoit] [autoit][/autoit] [autoit]
$rcClient = _WinAPI_GetClientRect($hwnd)$rcRight = DllStructGetData($rcClient, "Right")
[/autoit] [autoit][/autoit] [autoit]
$rcBottom = DllStructGetData($rcClient, "Bottom"); get the bitmap dimensions
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_GetObject($hbmp, DllStructGetSize($bm), DllStructGetPtr($bm)); select the bitmap into the memory DC
[/autoit] [autoit][/autoit] [autoit]
$hObjOld = _WinAPI_SelectObject($hdcMem, $hbmp)$bmWidth = DllStructGetData($bm, "bmWidth")
[/autoit] [autoit][/autoit] [autoit]
$bmHeight = DllStructGetData($bm, "bmHeight")DllCall("gdi32.dll", "INT", "SetStretchBltMode", "HANDLE", $wParam, "INT", 4)
[/autoit] [autoit][/autoit] [autoit]StretchBlt( _
[/autoit] [autoit][/autoit] [autoit]
$wParam, 0, 0, $rcRight, $rcBottom, _
$hdcMem, 0, 0, $bmWidth, $bmHeight, _
$SRCCOPY _
)_WinAPI_SelectObject($hdcMem, $hObjOld)
[/autoit] [autoit][/autoit] [autoit]Return 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>OnEraseBkGndFunc StretchBlt($hdcDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hdcSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $dwRop)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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 ;==>StretchBltFunc WM_GETMINMAXINFO($hwnd, $Msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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_GETMINMAXINFOFunc WM_SIZING($hwnd, $iMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $tRect_Cur = DllStructCreate("int[4]", $lParam), $tRect_New = DllStructCreate($tagRECT)
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)Switch $wParam ;drag side or corner
[/autoit] [autoit][/autoit] [autoit]
Case 1, 2, 4, 7
Local $iNewY = Int(($right - $left) / $fRatio)
DllStructSetData($tRect_Cur, 1, $top + $iNewY, 4)
Case Else
Local $iNewX = Int(($bottom - $top) * $fRatio)
DllStructSetData($tRect_Cur, 1, $left + $iNewX, 3)
EndSwitchReturn "GUI_RUNDEFMSG"
[/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>WM_SIZING; #FUNCTION# ====================================================================================================================
[/autoit] [autoit][/autoit] [autoit]
; 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
; ===============================================================================================================================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
[/autoit]
Return SetError(1, 0, 0)
EndIf
Return 1
EndFunc ;==>_WinAPI_AdjustWindowRectEx
Ich hab jetzt in Zeile 37 eine Zuweisung ergänzt, die $fRatio auf das Seitenverhältnis vom gesamten Fenster setzt. Dann passt es nachher. -
Herzlich Willkommen Marius. Ich wünsch dir viel Spaß im Forum und beim lernen von AutoIt ;).
-
Ich hab noch ein paar kleine Verbeserungen hinzugefügt.
Spoiler anzeigen
[autoit]#region ;************ Includes ************
[/autoit] [autoit][/autoit] [autoit]
#include <ScreenCapture.au3>;~~~
#include <WinAPI.au3>;~~~
#include <WindowsConstants.au3>;~~~
#include <GUIConstantsEx.au3>;~~~
#include <Constants.au3>
#endregion ;************ Includes ************Global $iGUI_WidthInitial = 800, $fRatio, $iMinWidth = 0, $iMinHeight = 0, $iMaxWidth = 9300, $iMaxHeight = 9300
[/autoit] [autoit][/autoit] [autoit]
Global $hbmp, $hdcMem; --- $BITMAP
[/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]$fRatio = _WinAPI_GetClientWidth($HWND_DESKTOP) / _WinAPI_GetClientHeight($HWND_DESKTOP)
[/autoit] [autoit][/autoit] [autoit]
ConsoleWrite("Original Ratio: " & $fRatio & @CRLF)_AuMain()
[/autoit] [autoit][/autoit] [autoit]Func _AuMain()
[/autoit] [autoit][/autoit] [autoit]
Local $hwndGUIRegisterMsg($WM_CREATE, "OnCreate")
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_ERASEBKGND, "OnEraseBkGnd")
GUIRegisterMsg($WM_SIZING, "WM_SIZING")
GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")$hwnd = GUICreate("Test", $iGUI_WidthInitial, $iGUI_WidthInitial / $fRatio, -1, -1, $WS_OVERLAPPEDWINDOW)
[/autoit] [autoit][/autoit] [autoit]
GUISetState()While True
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd; free resources
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_DeleteObject($hbmp)
_WinAPI_DeleteDC($hdcMem)Return 0
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>_AuMainFunc OnCreate($hwnd, $message, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $hdc, $bm = DllStructCreate($BITMAP)$hbmp = _ScreenCapture_Capture()
[/autoit] [autoit][/autoit] [autoit]If (Not $hbmp) Then
[/autoit] [autoit][/autoit] [autoit]
; error handling here
ConsoleWrite(StringFormat("_WinAPI_LoadImage fehlgeschlagen!\n"))
EndIf$hdc = _WinAPI_GetDC($HWND_DESKTOP)
[/autoit] [autoit][/autoit] [autoit]
$hdcMem = _WinAPI_CreateCompatibleDC($hdc)_WinAPI_ReleaseDC($HWND_DESKTOP, $hdc)
[/autoit] [autoit][/autoit] [autoit]If (Not $hdcMem) Then
[/autoit] [autoit][/autoit] [autoit]
; error handling here
ConsoleWrite(StringFormat("_WinAPI_CreateCompatibleDC fehlgeschlagen!\n"))
EndIfReturn $GUI_RUNDEFMSG
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>OnCreateFunc OnEraseBkGnd($hwnd, $message, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $rcClient
Local $hObjOld
Local $rcRight, $rcBottom
Local $bmWidth, $bmHeight
Local $bm = DllStructCreate($BITMAP)If (Not $hbmp) Then
[/autoit] [autoit][/autoit] [autoit]
Return 1
EndIf; get the window's client area
[/autoit] [autoit][/autoit] [autoit]
$rcClient = _WinAPI_GetClientRect($hwnd)$rcRight = DllStructGetData($rcClient, "Right")
[/autoit] [autoit][/autoit] [autoit]
$rcBottom = DllStructGetData($rcClient, "Bottom")
ConsoleWrite("Ratio after WM_SIZING " & $rcRight / $rcBottom & @CRLF); get the bitmap dimensions
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_GetObject($hbmp, DllStructGetSize($bm), DllStructGetPtr($bm)); select the bitmap into the memory DC
[/autoit] [autoit][/autoit] [autoit]
$hObjOld = _WinAPI_SelectObject($hdcMem, $hbmp)$bmWidth = DllStructGetData($bm, "bmWidth")
[/autoit] [autoit][/autoit] [autoit]
$bmHeight = DllStructGetData($bm, "bmHeight")DllCall("gdi32.dll", "INT", "SetStretchBltMode", "HANDLE", $wParam, "INT", 4)
[/autoit] [autoit][/autoit] [autoit]StretchBlt( _
[/autoit] [autoit][/autoit] [autoit]
$wParam, 0, 0, $rcRight, $rcBottom, _
$hdcMem, 0, 0, $bmWidth, $bmHeight, _
$SRCCOPY _
)_WinAPI_SelectObject($hdcMem, $hObjOld)
[/autoit] [autoit][/autoit] [autoit]Return 1
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFunc ;==>OnEraseBkGndFunc StretchBlt($hdcDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hdcSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $dwRop)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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 ;==>StretchBltFunc WM_GETMINMAXINFO($hwnd, $Msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
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_GETMINMAXINFOFunc WM_SIZING($hwnd, $iMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $sRect = DllStructCreate("Int[4]", $lParam)
Local $left = DllStructGetData($sRect, 1, 1)
Local $top = DllStructGetData($sRect, 1, 2)
Local $right = DllStructGetData($sRect, 1, 3)
Local $bottom = DllStructGetData($sRect, 1, 4)Switch $wParam ;drag side or corner
[/autoit] [autoit][/autoit] [autoit]
Case 1, 2, 4, 7
Local $iNewY = Int(($right - $left) / $fRatio)
DllStructSetData($sRect, 1, $top + $iNewY, 4)
Case Else
Local $iNewX = Int(($bottom - $top) * $fRatio)
DllStructSetData($sRect, 1, $left + $iNewX, 3)
EndSwitchReturn "GUI_RUNDEFMSG"
[/autoit]
EndFunc ;==>WM_SIZING
Ich kann zwar vermuten welcher Teil diese falsche Fenstergröße verursacht, aber ich weiß nicht wieso das passiert. Bei WM_SIZING werden zwar die korrekten Werte berechet, aber sie werden nicht als Fenstergröße übernommen. Schau dir mal die Konsolenausgabe von diesem Script an, dann siehst du was ich meine. -
Da ich keine Lust hab die Header Files zu durchsuchen, hab ich mal einige Integer für den StretchBltMode ausprobiert. 4 scheint die besten Resultate für Bilder zu liefern.
Spoiler anzeigen
[autoit]#include <WindowsConstants.au3>
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <WinAPI.au3>; --- $BITMAP
[/autoit] [autoit][/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 = 0
[/autoit] [autoit][/autoit] [autoit]
Global $sImagePath = "C:\Windows\System32\oobe\background.bmp"
Global $hbmp, $hdcMem; start the main procedure
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
Call ("_AuMain")Func _AuMain ( )
[/autoit] [autoit][/autoit] [autoit]Local $hwnd
[/autoit] [autoit][/autoit] [autoit]GUIRegisterMsg ($WM_CREATE, "OnCreate")
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg ($WM_ERASEBKGND, "OnEraseBkGnd")$hwnd = GUICreate ("Test", 300, 300, -1, -1, $WS_OVERLAPPEDWINDOW)
[/autoit] [autoit][/autoit] [autoit]GUISetState (@SW_SHOW, $hwnd)
[/autoit] [autoit][/autoit] [autoit]While (TRUE)
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg (FALSE)
Case $GUI_EVENT_CLOSE
ExitLoop
EndSwitch
WEnd; free resources
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_DeleteObject ($hbmp)
_WinAPI_DeleteDC ($hdcMem)Return 0
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func OnCreate ($hwnd, $message, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]Local $hdc
[/autoit] [autoit][/autoit] [autoit]$hbmp = _WinAPI_LoadImage (0, $sImagePath, $IMAGE_BITMAP, 0, 0, $LR_LOADFROMFILE)
[/autoit] [autoit][/autoit] [autoit]If (not $hbmp) Then
[/autoit] [autoit][/autoit] [autoit]
; error handling here
ConsoleWrite (StringFormat ("_WinAPI_LoadImage fehlgeschlagen!\n"))
EndIf$hdc = _WinAPI_GetDC ($HWND_DESKTOP)
[/autoit] [autoit][/autoit] [autoit]
$hdcMem = _WinAPI_CreateCompatibleDC ($hdc)_WinAPI_ReleaseDC ($HWND_DESKTOP, $hdc)
[/autoit] [autoit][/autoit] [autoit]If (not $hdcMem) Then
[/autoit] [autoit][/autoit] [autoit]
; error handling here
ConsoleWrite (StringFormat ("_WinAPI_CreateCompatibleDC fehlgeschlagen!\n"))
EndIfReturn $GUI_RUNDEFMSG
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func OnEraseBkGnd ($hwnd, $message, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]Local $rcClient
[/autoit] [autoit][/autoit] [autoit]
Local $hObjOld
Local $rcRight, $rcBottom
Local $bmWidth , $bmHeight
Local $bm = DllStructCreate ($BITMAP)If (not $hbmp) Then
[/autoit] [autoit][/autoit] [autoit]
Return 1
EndIf; get the window's client area
[/autoit] [autoit][/autoit] [autoit]
$rcClient = _WinAPI_GetClientRect ($hwnd)$rcRight = DllStructGetData ($rcClient, "Right")
[/autoit] [autoit][/autoit] [autoit]
$rcBottom = DllStructGetData ($rcClient, "Bottom"); get the bitmap dimensions
[/autoit] [autoit][/autoit] [autoit]
_WinAPI_GetObject ($hbmp, DllStructGetSize ($bm), DllStructGetPtr ($bm)); select the bitmap into the memory DC
[/autoit] [autoit][/autoit] [autoit]
$hObjOld = _WinAPI_SelectObject ($hdcMem, $hbmp)$bmWidth = DllStructGetData ($bm, "bmWidth")
[/autoit] [autoit][/autoit] [autoit]
$bmHeight = DllStructGetData ($bm, "bmHeight")DllCall ("gdi32.dll", "INT", "SetStretchBltMode", "HANDLE", $wParam, "INT", 4)
[/autoit] [autoit][/autoit] [autoit]StretchBlt ( _
[/autoit] [autoit][/autoit] [autoit]
$wParam, 0, 0, $rcRight, $rcBottom, _
$hdcMem, 0, 0, $bmWidth, $bmHeight, _
$SRCCOPY _
)_WinAPI_SelectObject ($hdcMem, $hObjOld)
[/autoit] [autoit][/autoit] [autoit]Return 1
[/autoit] [autoit][/autoit] [autoit]EndFunc
[/autoit] [autoit][/autoit] [autoit]Func StretchBlt ($hdcDest, $nXOriginDest, $nYOriginDest, $nWidthDest, $nHeightDest, $hdcSrc, $nXOriginSrc, $nYOriginSrc, $nWidthSrc, $nHeightSrc, $dwRop)
[/autoit] [autoit][/autoit] [autoit]Local $aRes = DllCall ("gdi32.dll", "BOOL", "StretchBlt", _
[/autoit] [autoit][/autoit] [autoit]
"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
[/autoit] -
Coole Sache Greenhorn
. Diese Nachrichtencodes sind mir vorher nie wirklich aufgefallen... Nur die Interpolation sieht ein wenig eigenartig aus, wie wird das denn von StretchBlt gehandhabt? -
Das mit GDI+ verbessert zwar die Interpolation, aber das Flackern kommt vom Pic Control. Ich weiß nicht ob man das irgendwie verhindern kann.

Ich bin mal dein Script durchgegangen und hab einige Kleinigkeiten verbessert und auch das Problem mit der Darstellungsgröße behoben. WinGetPos ist eine sehr unzuverlässige Methode um die Fenstergröße auszulesen -> ersetzt durch WinGetClientArea.Spoiler anzeigen
[autoit]#region ;************ Includes ************
[/autoit] [autoit][/autoit] [autoit]
;~ #include <eigen_bilder.au3>
#include <WindowsConstants.au3>
#include <ScreenCapture.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#endregion ;************ Includes ************Global $breite_min, $breite_max, $hoehe_min, $hoehe_max, $array_bilder_1[3], $hBitmap_quelle, $hGfxCtxt, $hHBitmap, $hImage, $breite = 800
[/autoit] [autoit][/autoit] [autoit]Global $bild = @TempDir & "\" & "bild.jpg"
[/autoit] [autoit][/autoit] [autoit]
_ScreenCapture_Capture($bild)_GDIPlus_Startup()
[/autoit] [autoit][/autoit] [autoit]
Global $hImage = _GDIPlus_ImageLoadFromFile($bild)
$array_bilder_1[1] = _GDIPlus_ImageGetWidth($hImage)
$array_bilder_1[2] = _GDIPlus_ImageGetHeight($hImage)Global $seitenverhaeltnis = $array_bilder_1[1] / $array_bilder_1[2]
[/autoit] [autoit][/autoit] [autoit]Global $hGui = GUICreate("Test", $breite, $breite / $seitenverhaeltnis, -1, -1, $WS_OVERLAPPEDWINDOW, $WS_EX_COMPOSITED)
[/autoit] [autoit][/autoit] [autoit]
Global $pic = GUICtrlCreatePic("", 0, 0, $breite, $breite / $seitenverhaeltnis)
GUISetState()Global $aWS = WinGetClientSize($hGui)
[/autoit] [autoit][/autoit] [autoit]
Global Const $ratio = $aWS[1] / $aWS[0]
$breite_min = 0
$breite_max = 9300
$hoehe_min = 0
$hoehe_max = 9300_bild()
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_SIZE, "_bild")
GUIRegisterMsg($WM_SIZING, "WM_SIZING")
GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEnd_WinAPI_DeleteObject(GUICtrlSendMsg($pic, 0x0172, 0, $hHBitmap))
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
_GDIPlus_ImageDispose($hImage)
_GDIPlus_BitmapDispose($hBitmap_quelle)
_GDIPlus_GraphicsDispose($hGfxCtxt)
_GDIPlus_Shutdown()Func _bild()
[/autoit] [autoit][/autoit] [autoit]
Local $win = WinGetClientSize($hGui)
Local $aResult = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $win[0], "int", $win[1], "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
$hBitmap_quelle = $aResult[6]
$hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($hBitmap_quelle)
DllCall($ghGDIPDll, "uint", "GdipSetInterpolationMode", "handle", $hGfxCtxt, "int", 1)
_GDIPlus_GraphicsDrawImageRect($hGfxCtxt, $hImage, 0, 0, $win[0], $win[1])
$hHBitmap = _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap_quelle)
GUICtrlSetPos($pic, Default, Default, $win[0], $win[1])
_WinAPI_DeleteObject(GUICtrlSendMsg($pic, 0x0172, 0, $hHBitmap))
EndFunc ;==>_bildFunc WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
DllStructSetData($minmaxinfo, 7, $breite_min) ; min X
DllStructSetData($minmaxinfo, 8, $hoehe_min) ; min Y
DllStructSetData($minmaxinfo, 9, $breite_max) ; max X
DllStructSetData($minmaxinfo, 10, $hoehe_max) ; max Y
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_GETMINMAXINFOFunc WM_SIZING($hWnd, $iMsg, $wParam, $lParam)
[/autoit] [autoit][/autoit] [autoit]
Local $sRect = DllStructCreate("Int[4]", $lParam)
Local $left = DllStructGetData($sRect, 1, 1)
Local $top = DllStructGetData($sRect, 1, 2)
Local $right = DllStructGetData($sRect, 1, 3)
Local $bottom = DllStructGetData($sRect, 1, 4)Switch $wParam ;drag side or corner
[/autoit] [autoit][/autoit] [autoit]
Case 1, 2, 4, 7
Local $iNewY = Int(($right - $left) * $ratio)
DllStructSetData($sRect, 1, DllStructGetData($sRect, 1, 2) + $iNewY, 4)
Case Else
Local $iNewX = Int(($bottom - $top) / $ratio)
DllStructSetData($sRect, 1, DllStructGetData($sRect, 1, 1) + $iNewX, 3)
EndSwitch
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_SIZINGFunc _GDIPlus_BitmapCreateDIBFromBitmap($hBitmap)
[/autoit]
Local $tBIHDR, $Ret, $tData, $pBits, $hResult = 0
$Ret = DllCall($ghGDIPDll, 'uint', 'GdipGetImageDimension', 'ptr', $hBitmap, 'float*', 0, 'float*', 0)
If (@error) Or ($Ret[0]) Then Return 0
$tData = _GDIPlus_BitmapLockBits($hBitmap, 0, 0, $Ret[2], $Ret[3], $GDIP_ILMREAD, $GDIP_PXF32ARGB)
$pBits = DllStructGetData($tData, 'Scan0')
If Not $pBits Then Return 0
$tBIHDR = DllStructCreate('dword;long;long;ushort;ushort;dword;dword;long;long;dword;dword')
DllStructSetData($tBIHDR, 1, DllStructGetSize($tBIHDR))
DllStructSetData($tBIHDR, 2, $Ret[2])
DllStructSetData($tBIHDR, 3, $Ret[3])
DllStructSetData($tBIHDR, 4, 1)
DllStructSetData($tBIHDR, 5, 32)
DllStructSetData($tBIHDR, 6, 0)
$hResult = DllCall('gdi32.dll', 'ptr', 'CreateDIBSection', 'hwnd', 0, 'ptr', DllStructGetPtr($tBIHDR), 'uint', 0, 'ptr*', 0, 'ptr', 0, 'dword', 0)
If (Not @error) And ($hResult[0]) Then
DllCall('gdi32.dll', 'dword', 'SetBitmapBits', 'ptr', $hResult[0], 'dword', $Ret[2] * $Ret[3] * 4, 'ptr', DllStructGetData($tData, 'Scan0'))
$hResult = $hResult[0]
Else
$hResult = 0
EndIf
_GDIPlus_BitmapUnlockBits($hBitmap, $tData)
Return $hResult
EndFunc ;==>_GDIPlus_BitmapCreateDIBFromBitmap
Leider musste ich dein vorheriges Konzept ein wenig durcheinander bringen, da bei mir das Script sonst nicht lauffähig war. Das solltest du aber ohne Probleme wieder rückgängig machen können. -
Wieso baust du keine Fehlerabfragen im Script ein? Mit denen kannst du nicht nur auf den Fehler reagieren (z.B. Neuversuch) sondern ihn eventuell gleich korrigieren.
Die AutoIt.exe beendet sich ohne sich neuzustarten um mögliche Schäden zu verhindern.. Das hat so schon alles seinen Sinn. Bevor du das per Neustart machst, würde ich vorher den Fehler am auftreten hindern.
-
Was ist denn bitte mit deinem alten Thread? Die bedenken von autoBert was die AGBs von Softpedia betrifft hast du auch noch nicht adressiert.
Außerdem gehört das vermutlich eher in "Programmieranfragen", im Gegensatz zu deinem alten Thread sehe ich nämlich neben dem selben Request kein Script. Wenn das mit den AGBs für jeden geplanten Anbieter geklärt wird wäre es kein Problem, das als Programmieranfrage zu stellen. -
Ja, das geht ^^. Aber es sieht nicht besonders ansprechend aus...
Spoiler anzeigen
[autoit]#region ;************ Includes ************
[/autoit] [autoit][/autoit] [autoit]
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#endregion ;************ Includes ************$bild = @TempDir & "\" & "bild.jpg"
[/autoit] [autoit][/autoit] [autoit]
_ScreenCapture_Capture($bild)Global $hGui = GUICreate("Test", 300, 300, -1, -1, $WS_OVERLAPPEDWINDOW)
[/autoit] [autoit][/autoit] [autoit]
$pic = GUICtrlCreatePic("", 0, 0, 300, 300)
GUISetState()_bild()
[/autoit] [autoit][/autoit] [autoit]
GUIRegisterMsg($WM_SIZE, "_bild")While 1
[/autoit] [autoit][/autoit] [autoit]
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
WEndFunc _bild()
[/autoit]
$win = WinGetPos("Test", "")
GUICtrlSetImage($pic, $bild)
GUICtrlSetPos($pic, 0, 0, $win[2], $win[3])
EndFunc ;==>_bild
Alternativ könnte man natürlich GDI+ verwenden.Mit Doublebuffering sollte das zumindest nicht mehr so flackern. Aber vielleicht lässt sich das ja auch so beheben. -
Ich weiß nicht auf was sich autoBert bezieht, aber alleine diese passage macht das Vorhaben bereits zu einem Regelverstoß (wenn ich das richtig verstehe):
Zitat...- covers or obscures any of the Softpedia marks when using Softpedia services...
Jegliche Werbung und alle Softpedia Logos werden komplett umgangen wenn man den Downloader nutzt. -
I still don't understand why you don't ask for help in an english-speaking forum like http://www.autoitscript.com...
Not everyone here understands english, so you might not get much help for your problem.
I also noticed that your english is about as well written as your broken german, complete with grammatical errors, so the propability of anyone understanding what you write is quite low.Despite all that, I'd still be willing to help you - unfortunately I can't. I didn't even get the gist of what you wanted to say..
Good idea to provide screenshots though. At least I know that you don't want the output you're getting in your program.
Maybe someone else understands what your problem is, otherwise you'll need to formulate your question again. Sorry. -
Zitat
Es wird also eine rekursive Funktion benötigt, die für jeden Schlüssel prüft, ob er Unterschlüssel hat und erst bei "Nein" den Schlüssel löscht. Also von Innen nach Aussen Löschen.
Sowas hatte ich zwar vermutet, aber ich war irgendwie verwirrt, weil es bei ihm nach 6 Versuchen zu funktionieren scheint... -
Langsam weiß ich auch nicht mehr weiter, aber den selben Scriptteil 6 mal hintereinander zu schreiben kann keine Lösung sein..
Jetzt sollte er dir zumindest sagen, welche Schlüssel nicht gelöscht werden.Spoiler anzeigen
[autoit]#RequireAdmin
[/autoit] [autoit][/autoit] [autoit]
$i = 1$hLogFile = FileOpen(@ScriptDir & "\log.txt", 2)
[/autoit] [autoit][/autoit] [autoit]While True
[/autoit] [autoit][/autoit] [autoit]
$sKey = RegEnumKey("HKCR", $i)
If @error > 0 Then
FileWrite($hLogFile, '!' & $i & ' ' & @error & @LF)
ExitLoop
EndIf
If @error < 0 Then
MsgBox(16, 'ERROR', 'i = ' & $i & @CRLF &'Hier schon gescheitert!')
ExitLoop
EndIfIf StringInStr($sKey, "Citrix.ICAClient") Then
[/autoit] [autoit][/autoit] [autoit]
$iRet = RegDelete("HKCR\" & $sKey)
If $iRet <> 1 Then
FileWrite($hLogFile, $i & @TAB & "RegDelete Error: HKCR\" & $sKey & @TAB "Return Code: " & $iRet & @TAB & "Error Code: " & @error & @CRLF)
Else
RegRead("HKCR\" & $sKey)
If @error Then
FileWrite($hLogFile, $i & @TAB & "Deleted: HKCR\" & $sKey & @CRLF)
Else
FileWrite($hLogFile, $i & @TAB & "!NOT Deleted: HKCR\" & $sKey & @CRLF)
EndIf
EndIf
EndIf
$i += 1
WEndFileClose($hLogFile)
[/autoit]
ShellExecute(@ScriptDir & "\log.txt")
Zur Not könnte man auch RegDelete für jeden Schlüssel solange ausführen, bis er nicht mehr existiert. Aber das ist wirklich nur eine unsaubere Notlösung (trotzdem besser als den Code einfach 6 mal auszuführen).