Hier ein Beispiel:
Spoiler anzeigen
#include <WindowsConstants.au3>
#include <ScrollBarConstants.au3>
#include <Constants.au3>
#include <GuiScrollBars.au3>
#include <ScreenCapture.au3>
Global Const $STM_SETIMAGE = 0x0172
_GDIPlus_Startup()
Global $hBMP_Screen = _ScreenCapture_Capture("", 0, 0, @DesktopWidth, @DesktopHeight)
Global $hBmp = _GDIPlus_BitmapCreateFromHBITMAP($hBMP_Screen)
Global $bW = _GDIPlus_ImageGetWidth($hBmp)
Global $bH = _GDIPlus_ImageGetHeight($hBmp)
Global $iW = @DesktopWidth * 0.5, $iH = @DesktopHeight * 0.5
Global $hGUI = GUICreate("Test", $iW, $iH)
Global $idPic = GUICtrlCreatePic("", $iW, $iH)
GUISetState()
Global $iVSscroll = _WinAPI_GetSystemMetrics(2)
Global $iHSscroll = _WinAPI_GetSystemMetrics(3)
Global $iYCaption = _WinAPI_GetSystemMetrics(4)
Global $iYFixedFrame = _WinAPI_GetSystemMetrics(8)
Global $iXFixedFrame = _WinAPI_GetSystemMetrics(7)
Global $IE_offset_x, $IE_offset_y, $iNewH, $iNewW
Global $hGfx_IE_BMP_Display, $hCtx_IE_BMP_Display
Global $IE_ScrollbarH = False, $IE_ScrollbarV = False
PlacePicCtrl()
[/autoit] [autoit][/autoit] [autoit]Do
Until GUIGetMsg() = -3
_GDIPlus_BitmapDispose($hGfx_IE_BMP_Display)
_GDIPlus_GraphicsDispose($hCtx_IE_BMP_Display)
_GDIPlus_BitmapDispose($hBmp)
_WinAPI_DeleteObject($hBMP_Screen)
_GDIPlus_Shutdown()
GUIDelete()
Exit
Func PlacePicCtrl()
GUIRegisterMsg($WM_HSCROLL, "")
GUIRegisterMsg($WM_VSCROLL, "")
Local $iVSscroll = _WinAPI_GetSystemMetrics(2)
Local $iHSscroll = _WinAPI_GetSystemMetrics(3)
Local $iYCaption = _WinAPI_GetSystemMetrics(4)
Local $iYFixedFrame = _WinAPI_GetSystemMetrics(8)
Local $iXFixedFrame = _WinAPI_GetSystemMetrics(7)
Local $iMetricsSumX = ($bH > $iH ) * $iVSscroll + $iXFixedFrame * 2
Local $iMetricsSumY = ($bW > $iW) * $iHSscroll + $iYCaption + $iYFixedFrame
$iNewW = Min($bW, $iW)
$iNewH = Min($bH, $iH)
Calc_Offset()
GUICtrlSetPos($idPic, $IE_offset_x, $IE_offset_y, $iNewW, $iNewH)
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_BitmapDispose($hGfx_IE_BMP_Display)
_GDIPlus_GraphicsDispose($hCtx_IE_BMP_Display)
$hGfx_IE_BMP_Display = DllCall($ghGDIPDll, "uint", "GdipCreateBitmapFromScan0", "int", $iNewW, "int", $iNewH, "int", 0, "int", 0x0026200A, "ptr", 0, "int*", 0)
$hGfx_IE_BMP_Display = $hGfx_IE_BMP_Display[6]
$hCtx_IE_BMP_Display = _GDIPlus_ImageGetGraphicsContext($hGfx_IE_BMP_Display)
_GDIPlus_GraphicsSetSmoothingMode($hCtx_IE_BMP_Display, 2)
$IE_ScrollbarV = False
$IE_ScrollbarH = False
If $bW > $iNewW Or $bH > $iNewW Then
_GUIScrollBars_Init($hGUI)
_GUIScrollBars_SetScrollInfoMin($hGUI, $SB_HORZ, 0)
_GUIScrollBars_SetScrollInfoMax($hGUI, $SB_HORZ, $bW - $iW + 61 + $iMetricsSumX)
_GUIScrollBars_SetScrollInfoMin($hGUI, $SB_VERT, 0)
_GUIScrollBars_SetScrollInfoMax($hGUI, $SB_VERT, $bH - $iH + $iMetricsSumY - 1)
GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL_IE")
GUIRegisterMsg($WM_VSCROLL, "WM_VSCROLL_IE")
If $bW > $iW Then
WM_HSCROLL_IE($hGUI, 0, $SB_THUMBTRACK, 0)
$IE_ScrollbarH = True
EndIf
If $bH > ($iH) Then
WM_VSCROLL_IE($hGUI, 0, $SB_THUMBTRACK, 0)
$IE_ScrollbarV = True
EndIf
EndIf
EndFunc
Func Calc_Offset()
Local $iDiff_x = $bW - $iW, $iDiff_y = $bH - $iH
If $iDiff_x < 0 Then
$IE_offset_x = ($iW - $bW) / 2
$IE_signX = -1
Else
$IE_offset_x = 0
$IE_signX = 1
EndIf
$delta_x = ($iW - $iNewW) / 2
If $iDiff_y < 0 Then
$IE_offset_y = ($iH - $bH) / 2
$delta_y = ($iH - $iNewH) / 2
$IE_signY = -1
Else
$IE_offset_y = 0
$delta_y = ($iH - $iNewH) / 2
$IE_signY = 1
EndIf
EndFunc
Func WM_VSCROLL_IE($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $lParam
Local $Min, $Max, $Page, $TrackPos
[/autoit] [autoit][/autoit] [autoit]Local $tSCROLLINFO_Y = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_VERT)
$Min = DllStructGetData($tSCROLLINFO_Y, "nMin")
$Max = DllStructGetData($tSCROLLINFO_Y, "nMax")
$Page = DllStructGetData($tSCROLLINFO_Y, "nPage")
$IE_offset_y = DllStructGetData($tSCROLLINFO_Y, "nPos")
$TrackPos = DllStructGetData($tSCROLLINFO_Y, "nTrackPos")
Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
Switch $nScrollCode
Case $SB_LINELEFT ; user clicked left arrow
DllStructSetData($tSCROLLINFO_Y, "nPos", $IE_offset_y - 1)
Case $SB_LINERIGHT ; user clicked right arrow
DllStructSetData($tSCROLLINFO_Y, "nPos", $IE_offset_y + 1)
Case $SB_PAGELEFT ; user clicked the scroll bar shaft left of the scroll box
DllStructSetData($tSCROLLINFO_Y, "nPos", $IE_offset_y - $Page)
Case $SB_PAGERIGHT ; user clicked the scroll bar shaft right of the scroll box
DllStructSetData($tSCROLLINFO_Y, "nPos", $IE_offset_y + $Page)
Case $SB_THUMBTRACK ; user dragged the scroll box
DllStructSetData($tSCROLLINFO_Y, "nPos", $TrackPos)
EndSwitch
DllStructSetData($tSCROLLINFO_Y, "fMask", $SIF_POS)
_GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO_Y)
$IE_offset_y = DllStructGetData($tSCROLLINFO_Y, "nPos")
[/autoit] [autoit][/autoit] [autoit]_GDIPlus_GraphicsDrawImageRectRect($hCtx_IE_BMP_Display, $hBmp, $IE_offset_x * $IE_ScrollbarH, $IE_offset_y * $IE_ScrollbarV, $iNewW, $iNewH, 0, 0, $iNewW, $iNewH)
CopyImage2Control($idPic, $hGfx_IE_BMP_Display)
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_VSCROLL_IE
Func WM_HSCROLL_IE($hWnd, $iMsg, $wParam, $lParam)
#forceref $iMsg, $lParam
Local $Min, $Max, $Page, $TrackPos
Local $tSCROLLINFO_X = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
$Min = DllStructGetData($tSCROLLINFO_X, "nMin")
$Max = DllStructGetData($tSCROLLINFO_X, "nMax")
$Page = DllStructGetData($tSCROLLINFO_X, "nPage")
$IE_offset_x = DllStructGetData($tSCROLLINFO_X, "nPos")
$TrackPos = DllStructGetData($tSCROLLINFO_X, "nTrackPos")
Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
Switch $nScrollCode
Case $SB_LINELEFT ; user clicked left arrow
DllStructSetData($tSCROLLINFO_X, "nPos", $IE_offset_x - 1)
Case $SB_LINERIGHT ; user clicked right arrow
DllStructSetData($tSCROLLINFO_X, "nPos", $IE_offset_x + 1)
Case $SB_PAGELEFT ; user clicked the scroll bar shaft left of the scroll box
DllStructSetData($tSCROLLINFO_X, "nPos", $IE_offset_x - $Page)
Case $SB_PAGERIGHT ; user clicked the scroll bar shaft right of the scroll box
DllStructSetData($tSCROLLINFO_X, "nPos", $IE_offset_x + $Page)
Case $SB_THUMBTRACK ; user dragged the scroll box
DllStructSetData($tSCROLLINFO_X, "nPos", $TrackPos)
EndSwitch
DllStructSetData($tSCROLLINFO_X, "fMask", $SIF_POS)
_GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO_X)
$IE_offset_x = DllStructGetData($tSCROLLINFO_X, "nPos")
_GDIPlus_GraphicsDrawImageRectRect($hCtx_IE_BMP_Display, $hBmp, $IE_offset_x * $IE_ScrollbarH, $IE_offset_y * $IE_ScrollbarV, $iNewW, $iNewH, 0, 0, $iNewW, $iNewH)
CopyImage2Control($idPic, $hGfx_IE_BMP_Display)
Return "GUI_RUNDEFMSG"
EndFunc ;==>WM_HSCROLL_IE
Func CopyImage2Control($idControl, $hBmp)
Local Const $hHBitmap_ImageEditor = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hBmp)
Local Const $hB = GUICtrlSendMsg($idControl, $STM_SETIMAGE, $IMAGE_BITMAP, $hHBitmap_ImageEditor)
If $hB Then _WinAPI_DeleteObject($hB)
_WinAPI_DeleteObject($hHBitmap_ImageEditor)
EndFunc ;==>CopyImage2Control
Func Min($a, $b)
If $a < $b Then Return $a
Return $b
EndFunc ;==>Min
Func Max($a, $b)
If $a > $b Then Return $a
Return $b
EndFunc ;==>Max
Beispiel ist ein Fast Hack und stammt vom Basic Image Editor v2...
Gruß,
UEZ