- Сообщения
- 8,671
- Репутация
- 2,481
Мне стало интересно, как можно сделать снимок окна, учитывая его прокручиваемость?
Вот тут пишут что нужно как то использовать WM_PAINT/WM_PRINT/WM_PRINTCLIENT и т.п., но как именно я так и не понял .
Также на оф. форуме нашёл кое что интересное (вроде рабочий вариант на дельфи), попробовал из кусков что там выкладывали собрать рабочий вариант:
Но что то всё не то :stars:
Вот тут пишут что нужно как то использовать WM_PAINT/WM_PRINT/WM_PRINTCLIENT и т.п., но как именно я так и не понял .
Также на оф. форуме нашёл кое что интересное (вроде рабочий вариант на дельфи), попробовал из кусков что там выкладывали собрать рабочий вариант:
Код:
#include <StructureConstants.au3>
#include <ScrollBarConstants.au3>
#include <GUiScrollBars.au3>
#include <SendMessage.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>
#include <GDIPlus.au3>
$hWin = WinGetHandle("[CLASS:SciTEWindow]")
$hCtrl = ControlGetHandle($hWin, "", "Scintilla1")
$ThumbTop = _GUIScrollBars_GetScrollBarXYThumbTop($hCtrl, $OBJID_VSCROLL)
$Width = _WinAPI_GetClientWidth($hCtrl)
$Height = _WinAPI_GetClientHeight($hCtrl) ;_GetWndHeight($hCtrl) ;Get correct height of the scrolled ctrl
_SendMessage($hCtrl, $WM_VSCROLL, $SB_TOP, 0)
$BufWidth = $Width
$BufHeight = $Height / 2
$hDC = _WinAPI_GetDC($hCtrl)
$hCDC = _WinAPI_CreateCompatibleDC($hDC)
$hBMP = _WinAPI_CreateCompatibleBitmap($hDC, $Width, $Height)
_WinAPI_SelectObject($hCDC, $hBMP)
_WinAPI_BitBlt($hCDC, 0, 0, $BufWidth, $Height / 2, $hDC, 0, 0, BitOR($SRCCOPY, $CAPTUREBLT))
_WinAPI_MoveTo($hDC, 0, $Height/2)
_WinAPI_LineTo($hDC, 3, $Height/2)
Do
$AlineHeight = NextLineHeight($hCtrl) + 1
$BufHeight += $AlineHeight
_WinAPI_BitBlt($hCDC, 0, $BufHeight - $AlineHeight, $BufWidth, $AlineHeight, $hDC, 0, ($Height / 2) - $AlineHeight, BitOR($SRCCOPY, $CAPTUREBLT))
_WinAPI_MoveTo($hDC, 0, $Height/2)
_WinAPI_LineTo($hDC, 3, $Height/2)
_SendMessage($hCtrl, $WM_VSCROLL, $SB_LINEDOWN, 0)
;Sleep(10)
Until IsScrollEnd($hCtrl)
$AlineHeight = $Height - ($Height / 2)
$BufHeight += $AlineHeight
_WinAPI_BitBlt($hCDC, 0, $BufHeight - $AlineHeight, $BufWidth, $AlineHeight, $hDC, 0, ($Height / 2) + 1, BitOR($SRCCOPY, $CAPTUREBLT))
_SendMessage($hCtrl, $WM_VSCROLL, $SB_TOP, 0)
_WinAPI_ReleaseDC($hCtrl, $hDC)
_WinAPI_DeleteDC($hCDC)
_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
_GDIPlus_ImageSaveToFile($hImage, @DesktopDir & "\TestCapture.bmp")
_GDIPlus_Shutdown()
_WinAPI_DeleteObject($hBMP)
Func _GetWndHeight($hWin)
_SendMessage($hWin, $WM_VSCROLL, $SB_TOP, 0)
Local $iHeight = _WinAPI_GetClientHeight($hWin)
Local $iRet = $iHeight
While Not IsScrollEnd($hWin)
_SendMessage($hWin, $WM_VSCROLL, $SB_LINEDOWN, 0)
$iRet += 16
WEnd
_SendMessage($hWin, $WM_VSCROLL, $SB_TOP, 0)
Return $iRet
EndFunc
Func NextLineHeight($hCtrl)
Local $ThumbTopNow, $LineHeight
$ThumbTopNow = _GUIScrollBars_GetScrollBarXYThumbTop($hCtrl, $OBJID_VSCROLL)
$LineHeight = $ThumbTopNow - $ThumbTop
;ConsoleWrite($LineHeight & @CRLF)
Return $LineHeight
_WinAPI_BitBlt($hCDC, 0, 0, 3, $Height, $hDC, 0, 0, $SRCCOPY)
Local $Result = 0
Local Const $TAGCOLOR = 0x00FEFEFE
For $i = $BufHeight - 1 To 0 Step -1
If _WinAPI_GetPixel($hDC, 2, $i) = $TAGCOLOR Then ExitLoop
$Result += 1
Next
Return $Result
EndFunc
Func IsScrollEnd($hCtrl)
Local $nPos, $nMax, $nPage
$nPos = _GUIScrollBars_GetScrollInfoPos($hCtrl, $SB_VERT)
$nMax = _GUIScrollBars_GetScrollInfoMax($hCtrl, $SB_VERT)
$nPage = _GUIScrollBars_GetScrollInfoPage($hCtrl, $SB_VERT)
Return $nPos == ($nMax - $nPage)
EndFunc
Но что то всё не то :stars: