クリップボード2



クリップボードに格納できるデータの形式はさまざまです。
前回では文字列の場合をやってみました。今回はビットマップの場合をやってみようと思います。

ビットマップの場合はビットマップハンドルを直接やり取りするので、 文字列の時のようにメモリオブジェクトを使用する必要はないので、少しは楽かもしれません。

前回でも使った命令をそのまま使用します。

#include "llmod.as"

#define CF_TEXT 1	;文字列形式
#define CF_BITMAP 2	;ビットマップ形式

#module

#deffunc getclipboard val,int
	mref hobj,16		;クリップボードのデータを格納する数値型変数
	mref format,1		;データ形式
	mref state,64

	prm=0
	dllproc "OpenClipboard",prm,1,D_USER	;クリップボードを開く
	if dllret@=0 : state=1 : return

	dllproc "GetClipboardData",format,1,D_USER	;データ取得
	hobj=dllret@

	dllproc "CloseClipboard",prm,0,D_USER	;クリップボードを閉じる

	if hobj {
		state=0
	} else {
		state=2
	}
return

#deffunc setclipboard int,int
	mref hobj,0		;クリップボードにセットするデータ
	mref format,1		;データ形式
	mref state,64

	prm=0
	dllproc "OpenClipboard",prm,1,D_USER	;クリップボードを開く
	if dllret@=0 : state=1 : return

	dllproc "EmptyClipboard",prm,0,D_USER	;クリップボードの中身を初期化

	prm=format,hobj
	dllproc "SetClipboardData",prm,2,D_USER	;クリップボードにデータをセット

	dllproc "CloseClipboard",prm,0,D_USER	;クリップボードを閉じる

	state=0
return

#global

	screen 0,200,20

	objmode 1,1
	objsize 100,20
	button "クリップボードへコピー",*set
	pos 100,0 : button "クリップボードを取得",*get
	stop

*set
	dialog "bmp;*.jpg",16
	if stat=0 : stop

	mref bmscr,67
	sdim path,1024 : path=refstr : getptr ppath,path
	prm=bmscr.14,ppath,0,0,0,$50
	dllproc "LoadImageA",prm,6,D_USER	;ファイルからビットマップオブジェクトを作成
	hbmp=dllret

	setclipboard hbmp,CF_BITMAP	;ビットマップをクリップボードへ送る

	stop

*get
	getclipboard hbmp,CF_BITMAP	;クリップボードのビットマップを取得
	if stat=1 : dialog "クリップボードを開けませんでした" : stop
	if stat=2 : dialog "データ形式がビットマップではありません" : stop

	getptr pbitmap,bitmap
	prm=hbmp,24,pbitmap
	dllproc "GetObjectA",prm,3,D_GDI	;ビットマップ情報を取得

	screen 2,bitmap.1,bitmap.2,8

	mref bmscr,67
	dllproc "CreateCompatibleDC",bmscr.4,1,D_GDI	;メモリデバイスコンテキストを作成
	hmemdc=dllret

	prm=hmemdc,hbmp
	dllproc "SelectObject",prm,2,D_GDI	;ビットマップをデバイスコンテキストに割り当て

	prm=bmscr.4,0,0,winx,winy,hmemdc,0,0,$CC0020
	dllproc "BitBlt",prm,9,D_GDI	;ウィンドウへコピー

	dllproc "DeleteDC",hmemdc,1,D_GDI	;デバイスコンテキストを破棄

	redraw	;再描画
	stop

実行して、「クリップボードを取得」ボタンを押すと、クリップボードからビットマップ画像を取得して表示します。
「クリップボードへコピー」ボタンを押すとファイル選択ダイアログが開き、選択した画像ファイルの画像をクリップボードへコピーします。
クリップボードがどうこうよりもビットマップ処理がややこしくなっています。

LoadImageA … 指定したイメージを読み込む
(モジュールのインスタンスハンドル,
ロードするイメージの名前(パスとは限らない),
ロードするイメージのタイプ,
ロードするイメージの幅,
ロードするイメージの高さ,
オプションフラグ)
戻り値:成功すればイメージのオブジェクトハンドル、失敗すれば0。
インスタンスハンドルはBMSCR構造体の.14に入っているのでそこから使用します。
イメージのタイプは、IMAGE_BITMAP(0)、IMAGE_ICON(1)、IMAGE_CURSOR(2)がありますが、ここではビットマップなので0(IMAGE_BITMAP)です。
オプションフラグにLR_LOADFROMFILE(0x10)を指定すると、第二引数であるロードするイメージの名前はファイルへのパスになります。
また、LR_DEFAULTSIZE(0x40)を指定すると、イメージの大きさは自動で設定してくれます。

GetObjectA … オブジェクトの情報を取得
(オブジェクトハンドル,
バッファのサイズ,
情報を格納するバッファのポインタ)
戻り値:成功すれば書き込まれた(必要な)バイト数、失敗すれば0。
ビットマップの場合はBITMAP構造体を指定します。

BITMAP構造体
.0 構造体のバイト数(24)
.1 ビットマップの幅
.2 ビットマップの高さ
.3 1走査線あたりのバイト数
.4 下位2バイト カラープレーン
.4 上位2バイト 1ピクセルを定義するのに必要なビット数
.5 ビットデータが格納されている配列へのポインタ

CreateCompatibleDC … 指定デバイスコンテキストに互換性のあるデバイスコンテキストを作成
(デバイスコンテキストハンドル)
戻り値:成功すれば作成されたデバイスコンテキストハンドル、失敗すれば0。

SelectObject … デバイスコンテキストにオブジェクトを割り当て
(デバイスコンテキストハンドル,
オブジェクトハンドル)
戻り値:成功すれば以前まで割り当てられていたオブジェクトハンドル、失敗すれば0。

DeleteDC … デバイスコンテキストを破棄
(デバイスコンテキストハンドル)
戻り値:成功すれば1、失敗すれば0。


前へ 戻る