ファイルからBitmapをロード <TOP>
ファイルからBitmapをロードし、クリップボードに転送。ピクチャボックスに貼り付けてみます。
LoadImage 画像ファイルの読み込み
OpenClipboard クリップボードをオープン
CloseClipboard クリップボードをクローズ
EmptyClipboard クリップボードを空にする
SetClipboardData クリップボードにデータを設定
IsClipboardFormatAvailable 指定したフォーマットがクリップボードにあるかどうかを判断
GetClipboardData クリップボードから指定のフォーマットデータを検索
SelectObject 指定されたデバイスコンテキストのオブジェクトを選択
CreateCompatibleDC メモリデバイスコンテキストを作成
DeleteDC 指定されたデバイスコンテキストを削除
BitBlt ビットブロックの転送
GetDC デバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放
LoadImageの第一引数にhInstを指定した場合は、リソースを読み込み、「0」を指定した場合はファイルから画像を読み込みます。
EditBoxにBitmapファイルをドラッグするとPictureBoxにBitmap画像が表示されます。
'================================================================ '= ファイルからBitmapをロード
'= (LoadImage.bas) '================================================================ #include "Windows.bi" #define LR_LOADFROMFILE &H10 '外部ファイルからロードする #define IMAGE_BITMAP 0 'ビットマップ #define IMAGE_CURSOR 2 'カーソル #define IMAGE_ICON 1 'アイコン #define IMAGE_ENHMETAFILE 3 '拡張メタファイル #define CF_BITMAP 2 'ビットマップのデータ(HBITMAP) #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_OpenClipboard& Lib "user32" Alias "OpenClipboard" (ByVal hWnd&) ' クリップボードをクローズ Declare Function Api_CloseClipboard& Lib "user32" Alias "CloseClipboard" () ' クリップボードを空にする Declare Function Api_EmptyClipboard& Lib "user32" Alias "EmptyClipboard" () ' クリップボードにデータを設定 Declare Function Api_SetClipboardData& Lib "user32" Alias "SetClipboardData" (ByVal wFormat&, ByVal hMem&) ' 指定したフォーマットがクリップボードにあるかどうか判定 Declare Function Api_IsClipboardFormatAvailable& Lib "user32" Alias "IsClipboardFormatAvailable" (ByVal wFormat&) ' クリップボードから指定フォーマットのデータを検索 Declare Function Api_GetClipboardData& Lib "user32" Alias "GetClipboardData" (ByVal wFormat&) ' 指定されたデバイスコンテキストのオブジェクトを選択 Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&) ' 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成 Declare Function Api_CreateCompatibleDC& Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hDC&) ' 指定されたデバイスコンテキストを削除 Declare Function Api_DeleteDC& Lib "gdi32" Alias "DeleteDC" (ByVal hDC&) ' ビットブロック転送を行います。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピーします。 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_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) Var Shared hBitmap As Long Var Shared phDC As Long Var Shared FileName As String Var Shared Picture1 As Object Var Shared Edit1 As Object Picture1.Attach GetDlgItem("Picture1") Edit1.Attach GetDlgItem("Edit1") : Edit1.SetFontSize 14 '================================================================ '= '================================================================ Declare Sub Mainform_Start edecl () Sub Mainform_Start() 'ピクチャボックスのデバイスコンテキストを取得 phDC = Api_GetDC(Picture1.GethWnd) End Sub '================================================================ '= '================================================================ Declare Sub PicturePaste edecl () Sub PicturePaste() Var hBuf As Long Var Ret As Long 'ファイルからBitmapをロード hBitmap = Api_LoadImage(0, FileName, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE) If hBitmap = 0 Then A% = MessageBox(GetWindowText, "ビットマップファイルをロードできません!", 0, 2) Exit Sub End If 'クリップボードをオープン Ret = Api_OpenClipboard(GethWnd) 'クリップボードを初期化 Ret = Api_EmptyClipboard() 'クリップボードにBitmapをロード Ret = Api_SetClipboardData(CF_BITMAP, hBitmap) 'クリップボードにBitmapが存在するかどうかを判断 If Api_IsClipboardFormatAvailable(CF_BITMAP) = 0 Then A% = MessageBox(GetWindowText, "クリップボードにBitmapがありません!", 0, 2) End If 'クリップボードをクローズ Ret = Api_CloseClipboard() Picture1.Cls 'クリップボードに指定したフォーマットのデータがあるかどうかを調べる Ret = Api_GetClipboardData(CF_BITMAP) 'メモリデバイスコンテキストを作成 hBuf = Api_CreateCompatibleDC(Ret) 'オブジェクトを選択 Ret = Api_SelectObject(hBuf, hBitmap) 'ビットブロックの転送 Ret = Api_BitBlt(phDC, 0, 0, Picture1.GetWidth, Picture1.GetHeight, hBuf, 0, 0, SRCCOPY) 'デバイスコンテキストを削除 Ret = Api_DeleteDC(hBuf) End Sub '================================================================ '= シェルドロップされたファイル名を取得 '================================================================ Declare Sub Edit1_DropFiles edecl (ByVal DF As Long) Sub Edit1_DropFiles(ByVal DF As Long) Var CN As Long CN = GetDropFileCount(DF) FileName = GetDropFileName(DF, 0) Edit1.SetWindowText FileName PicturePaste End Sub '================================================================ '= '================================================================ Declare Sub MainForm_QueryClose edecl () Sub MainForm_QueryClose() Var Ret As Long Ret = Api_ReleaseDC(Picture1.GethWnd, phDC) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End