デスクトップ画面を異なる方法で転送          <TOP>


デスクトップ画面をBitBlt、StretchBlt、SetStretchBltModeで転送しています。

StretchBltとSetStretchBltModeでの違いに注目

BitBlt ビットブロック転送を行う
StretchBlt 拡縮をともなうグラフィックデバイス間のイメージを転送
SetStretchBltMode 指定されたデバイスコンテキストのビットマップ伸縮モードを設定
GetDesktopWindow Windows のデスクトップ ウィンドウを識別
GetWindowDC ウィンドウ全体のデバイスコンテキストを取得
GetDC デバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放

 

BitBlt(等倍・そのまま転送)

StretchBltMode(綺麗に縮小転送)

StretchBlt(通常縮小転送)

 

'================================================================
'= デスクトップ画面を転送
'=    (BitBlt2.bas)
'================================================================
#include "Windows.bi"

' ビットブロック転送を行う。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピー
Declare Function Api_BitBlt& Lib "gdi32" Alias "BitBlt" (ByVal hDestDC&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal hSrcDC&, ByVal xSrc&, ByVal ySrc&, ByVal dwRop&)

' 拡縮をともなうグラフィックデバイス間のイメージを転送
Declare Function Api_StretchBlt& Lib "gdi32" Alias "StretchBlt" (ByVal hDC&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal hSrcDC&, ByVal xSrc&, ByVal ySrc&, ByVal nSrcWidth&, ByVal nSrcHeight&, ByVal dwRop&)

' 指定されたデバイスコンテキストのビットマップ伸縮モードを設定
Declare Function Api_SetStretchBltMode& Lib "gdi32" Alias "SetStretchBltMode" (ByVal hDC&, ByVal nStretchMode&)

' Windows のデスクトップ ウィンドウを識別。返されるポインタは、一時的なポインタ。後で使用するために保存しておくことはできない
Declare Function Api_GetDesktopWindow& Lib "user32" Alias "GetDesktopWindow" ()

' ウィンドウ全体のデバイスコンテキストを取得
Declare Function Api_GetWindowDC& Lib "user32" Alias "GetWindowDC" (ByVal hWnd&)

' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得
Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&)

' デバイスコンテキストを解放
Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&)

#define SRCCOPY &HCC0020               '単純な上書き
#define COLORONCOLOR 3                 '取り除く点の情報を保存することなく削除

Var Shared PICTURE1 As Object
Var Shared Button1 As Object
Var Shared Button2 As Object
Var Shared Button3 As Object

Picture1.Attach GetDlgItem("Picture1")
Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14
Button2.Attach GetDlgItem("Button2") : Button2.SetFontSize 14
Button3.Attach GetDlgItem("Button3") : Button3.SetFontSize 14

Var Shared dWidth As Long
Var Shared dHeight As Long
Var Shared Flg As byte

'================================================================
'=
'================================================================
Declare Sub Mainform_Start edecl ()
Sub Mainform_Start()
    dWidth = GetDeviceCaps(8)
    dHeight = GetDeviceCaps(10)
End Sub

'================================================================
'=
'================================================================
Declare Sub PrintScreen edecl ()
Sub PrintScreen()
    Var dHwnd As Long
    Var dhDC As Long
    Var phDC As Long
    Var dLeft As Long
    Var dTop As Long
    Var Ret As Long

    dLeft = 0
    dTop = 0

    dWidth = GetDeviceCaps(8)
    dHeight = GetDeviceCaps(10)

    dHwnd = Api_GetDesktopWindow()
    dhDC = Api_GetWindowDC(dHwnd)
    phDC = Api_GetDC(Picture1.GethWnd)


    If Flg = 0 Then
        Ret = Api_BitBlt(phDC, 0, 0, dWidth, dHeight, dhDC, dLeft, dTop, SRCCOPY)
    Else If Flg = 1 Then
        Ret = Api_SetStretchBltMode(phDC, COLORONCOLOR)
        Ret = Api_StretchBlt(phDC, 0, 0, Picture1.GetWidth, Picture1.GetHeight, dhDC, dLeft, dTop, dWidth, dHeight, SRCCOPY)
    Else
        Ret = Api_StretchBlt(phDC, 0, 0, Picture1.GetWidth, Picture1.GetHeight, dhDC, dLeft, dTop, dWidth, dHeight, SRCCOPY)
    End If

    Ret = Api_ReleaseDC(dHwnd, dhDC)
End Sub

'================================================================
'=
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Flg = 0
    PrintScreen
End Sub

'================================================================
'=
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Flg = 1
    PrintScreen
End Sub

'================================================================
'=
'================================================================
Declare Sub Button3_on edecl ()
Sub Button3_on()
    Flg = 2
    PrintScreen
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End