クリップボードへ転送と取り出し(BITMAP)          <TOP>


BITMAPファイルを読み込み、クリップボードへ転送します。また、そのデータをピクチャボックスに描画します。

LoadImage 画像ファイルの読み込み

CopyImage イメージを拡大縮小してコピー

OpenClipboard クリップボードをオープン

EmptyClipboard クリップボードをからにする

SetClipboardData クリップボードにデータを設定

GetClipboardData クリップボードから指定フォーマットのデータを検索

CloseClipboard クリップボードをクローズ

IsClipboardFormatAvailable 指定したフォーマットがクリップボードにあるかどうかを判定

CreateCompatibleDC メモリデバイスコンテキストを作成

SelectObject 指定されたデバイスコンテキストのオブジェクトを選択

GetObject オブジェクトを取得

BitBlt ビットブロック転送を行う

DeleteDC 指定されたデバイスコンテキストを削除

GetDC デバイスコンテキストのハンドルを取得

ReleaseDC デバイスコンテキストを解放

 

例では、既存のBMPファイル「bike1.bmp:56x52Dot」を読み込んでいます。

「そのまま」:LoadImageでnx、nyのサイズで読み込んだBITMAPをSetClipboardData(CF_BITMAP)でクリップボードに設定(転送)しています。

 nx、nyが「0」の場合は元のサイズで読み込みます。

「CopyImage」:LoadImageで元のサイズで読み込みます。CopyImageでnx、nyのサイズにコピー後、SetClipboardData(CF_BITMAP)でクリップボードに設定(転送)しています。

どちらの場合もクリップボードに転送されたデータを即、そのサイズでPictureBox(120x120Dot)に描画させています。

 

'================================================================
'= BITMAPのクリップボード転送と取り出し
'=    (SetClipboardData.bas)
'================================================================
#include "Windows.bi"

Type BITMAP
    bmType       As Long
    bmWidth      As Long
    bmHeight     As Long
    bmWidthBytes As Long
    bmPlanes     As Integer
    bmBitsPixel  As Integer
    bmBits       As Long
End Type

#define IMAGE_BITMAP 0                  'ビットマップ
#define LR_DEFAULTSIZE &H40             '標準サイズで表示
#define LR_COPYRETURNORG &H4            '指定されたサイズを無視し、そのままコピー
#define LR_SHARED &H8000                'イメージハンドルを固定する
#define LR_LOADFROMFILE &H10            '外部ファイルからロードする

#define CF_BITMAP 2                     'ビットマップのデータ(HBITMAP)
#define CF_DIB 8                        '構造体とビットマップビットからなるメモリオブジェクト
#define CF_DIF 5                        'SoftwareArts社のDIFデータ交換形式
#define CF_TEXT 1                       'テキスト形式のデータ。各行は復帰改行(CR-LF)コードで終わる
#define CF_TIFF 6                       'TIFF形式の画像データ
#define SRCCOPY &HCC0020                'そのまま転送

' 画像ファイルの読み込み
Declare Function Api_LoadImage& Lib "user32" Alias "LoadImageA" (ByVal hInst&, ByVal lpszName$, ByVal uType&, ByVal cxDesired&, ByVal cyDesired&, ByVal fuLoad&)

' イメージを拡大縮小してコピーする
Declare Function Api_CopyImage& Lib "user32" Alias "CopyImage" (ByVal handle&, ByVal imageType&, ByVal newWidth&, ByVal newHeight&, ByVal lFlags&)

' クリップボードをオープン
Declare Function Api_OpenClipboard& Lib "user32" Alias "OpenClipboard" (ByVal hWnd&)

' クリップボードを空にする
Declare Function Api_EmptyClipboard& Lib "user32" Alias "EmptyClipboard" ()

' クリップボードにデータを設定
Declare Function Api_SetClipboardData& Lib "user32" Alias "SetClipboardData" (ByVal wFormat&, ByVal hMem&)

' クリップボードから指定フォーマットのデータを検索
Declare Function Api_GetClipboardData& Lib "user32" Alias "GetClipboardData" (ByVal wFormat&)

' クリップボードをクローズ
Declare Function Api_CloseClipboard& Lib "user32" Alias "CloseClipboard" ()

' 指定したフォーマットがクリップボードにあるかどうか判定
Declare Function Api_IsClipboardFormatAvailable& Lib "user32" Alias "IsClipboardFormatAvailable" (ByVal wFormat&)

' 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成
Declare Function Api_CreateCompatibleDC& Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hDC&)

' 指定されたデバイスコンテキストのオブジェクトを選択
Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&)

' オブジェクト取得
Declare Function Api_GetObject& Lib "gdi32" Alias "GetObjectA" (ByVal hObject&, ByVal nCount&, lpObject As Any)

' ビットブロック転送を行う。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピー
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_DeleteDC& Lib "gdi32" Alias "DeleteDC" (ByVal hDC&)

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

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

Var Shared Picture1 As Object
Var Shared Text(1) As Object
Var Shared Edit(1) As Object
Var Shared Button(1) As Object

Picture1.Attach GetDlgItem("Picture1")
For i = 0 To 1
    Text(i).Attach GetDlgItem("Text" & Trim$(Str$(i + 1))) : Text(i).SetFontSize 14
    Edit(i).Attach GetDlgItem("Edit" & Trim$(Str$(i + 1))) : Edit(i).SetFontSize 14
    Button(i).Attach GetDlgItem("Button" & Trim$(Str$(i + 1))) : Button(i).SetFontSize 14
Next

'================================================================
'= ClipBoardからPictureBoxへ
'================================================================
Declare Sub ImageFromClipBoard ()
Sub ImageFromClipBoard()
    Var bmp As BITMAP
    Var hBit As Long
    Var phDC As Long
    Var mhDC As Long
    Var Ret As Long

    phDC = Api_GetDC(Picture1.GethWnd)

    Picture1.Cls

    'Bitmap型式データの有無を調査
    If Api_IsClipboardFormatAvailable(CF_BITMAP) <> 0 Then
        Ret = Api_OpenClipboard(GethWnd)

        '指定フォーマットのBITMAPデータを検索
        hBit = Api_GetClipboardData(CF_BITMAP)

        'メモリデバイスコンテキストを作成
        mhDC = Api_CreateCompatibleDC(phDC)

        'Object取得
        Ret = Api_GetObject(hBit, Len(bmp), bmp)

        'Object選択
        Ret = Api_SelectObject(mhDC, hBit)

        '指定の(PictureBox)のデバイスコンテキストにメモリデバイスコンテキストのデータを転送
        Ret = Api_BitBlt(phDC, 0, 0, bmp.bmWidth, bmp.bmHeight, mhDC, 0, 0, SRCCOPY)

        Ret = Api_ReleaseDC(Picture1.GethWnd, phDC)
        Ret = Api_DeleteDC(mhDC)
        Ret = Api_CloseClipboard()
    End If
End Sub

'================================================================
'= LoadImage → SetClipboardData
'================================================================
Declare Sub Button1_on edecl ()
Sub Button1_on()
    Var hBit As Long
    Var nx As Long
    Var ny As Long
    Var Ret As Long

    Ret = Api_OpenClipboard(GethWnd)
    Ret = Api_EmptyClipboard

    nx = Val(Edit(0).GetWindowText)
    ny = Val(Edit(1).GetWindowText)

    '画像ファイル(bike1.bmp)を読み込む
    hBit = Api_LoadImage(0, "bike1.bmp", IMAGE_BITMAP, nx, ny, LR_LOADFROMFILE)

    'クリップボードにデータを設定
    Ret = Api_SetClipboardData(CF_BITMAP, hBit)

    Ret = Api_CloseClipboard

    ImageFromClipBoard 
End Sub

'================================================================
'= LoadImage → CopyImage → SetClipboardData
'================================================================
Declare Sub Button2_on edecl ()
Sub Button2_on()
    Var hBit As Long
    Var hNew As Long
    Var nx As Long
    Var ny As Long
    Var Ret As Long

    Ret = Api_OpenClipboard(GethWnd)
    Ret = Api_EmptyClipboard

    nx = Val(Edit(0).GetWindowText)
    ny = Val(Edit(1).GetWindowText)

    '画像ファイル(bike1.bmp)を読み込む
    hBit = Api_LoadImage(0, "bike1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)

    'イメージを拡大縮小してコピー
    hNew = Api_CopyImage(hBit, IMAGE_BITMAP, nx, ny, LR_COPYRETURNORG)

    'クリップボードにデータを設定
    Ret = Api_SetClipboardData(CF_BITMAP, hNew)

    Ret = Api_CloseClipboard

    ImageFromClipBoard 
End Sub

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