BitBlt グラフィックデバイス間のイメージの転送

Cの宣言:

BOOL BitBlt(
	HDC hDestDC,
	int nDestLeft,
	int nDestTop,
	int nWidth,
	int nHeight,
	HDC hSrcDC,
	int nSrcLeft,
	int nSrcTop,
	DWORD dwRop);

VBの宣言:

Declare Function BitBlt Lib "gdi32" ( _
	ByVal hDestDC As Long, _
	ByVal nDestLeft As Long, _
	ByVal nDestTop As Long, _
	ByVal nWidth As Long, _
	ByVal nHeight As Long, _
	ByVal hSrcDC As Long, _
	ByVal nSrcLeft As Long, _
	ByVal nSrcTop As Long, _
	ByVal dwRop As Long) As Long

説明:

hSrcDCで指定される転送元グラフィックデバイス上の、左上端座標(nSrcLeft, nSrcTop)、幅nWidth、高さnHeightの長方形領域に存在するイメージを、hDestDCで指定される転送先グラフィックデバイス上の(nDestLeft, nDestTop)で指定される位置に描画する。

dwRopにラスタオペレーションコードを渡すことにより、単純な上書き、転送元イメージと転送先イメージの重ねあわせなど、描画方法を指定することができる。

よく使用されるラスタオペレーションコードには、以下のようなものがある。
SRCCOPY 単純な上書き。
SRCAND 転送元と転送先の色のANDをとる。
SRCPAINT 転送元と転送先の色のORをとる。

大抵のグラフィックデバイスは、BitBltが可能である。しかし、プロッタなど、一部のグラフィックデバイスは、実行に失敗する可能性がある。デバイスがBitBltをサポートしているかどうかは、GetDeviceCaps関数で知ることができる。具体的には、RASTERCAPSを問い合わせ、結果の値にRC_BITBLTビットがセットされているかどうか調べる。

描画位置などを表す数値は、論理単位である。デバイスに対してSetMapModeを行うことにより、単位はピクセルであったり、インチであったりする。ただしVBにおいては、ピクチャボックスなどに存在するScaleModeプロパティとは無関係であり、通常ピクセル単位となる。

転送元グラフィックデバイスが、SetWorldTransform関数によって回転または傾斜の変換を行うように設定されている場合、BitBltは失敗する。

引数の意味は、以下の通り。
hDestDC 転送先グラフィックデバイスを表すデバイスコンテキストハンドル
nDestLeft 転送先グラフィックデバイス上の、イメージの転送先位置の論理X座標成分。
nDestTop 転送先グラフィックデバイス上の、イメージの転送先位置の論理Y座標成分。
nWidth イメージの横幅の論理長。
nHeight イメージの高さの論理長。
hSrcDC 転送元グラフィックデバイスを表すデバイスコンテキストハンドル。
nSrcLeft 転送元グラフィックデバイス上の、転送元イメージの位置の論理X座標成分。
nSrcTop 転送元グラフィックデバイス上の、転送元イメージの位置の論理y座標成分。
dwRop ラスタオペレーションコード。

戻り値は、関数の実行が成功したか否かを表す真偽値である。

主なエラーは、以下の通り。
ERROR_INVALID_HANDLE デバイスコンテキストハンドルが不正。

Cのサンプル:

/*
 * 指定されたウィンドウに、ディスプレイ上の左上のイメージを描画する
 * 引数:
 *   hWnd: 描画先ウィンドウを示すウィンドウハンドル
 */
void DoBitBlt(HWND hWnd)
{
	HDC hSrcDC;
	HDC hDestDC;

	/* デバイスコンテキストハンドルの取得 */
	hSrcDC = GetDC(NULL); /* ディスプレイのデバイスコンテキストハンドル取得 */
	hDestDC = GetDC(hWnd); /* 指定されたウィンドウのデバイスコンテキストハンドル取得 */

	/* 描画 */
	BitBlt(
		hDestDC,
		0, 0, 100, 100,
		hSrcDC,
		0, 0,
		SRCCOPY);

	/* デバイスコンテキストハンドルの開放 */
	ReleaseDC(hWnd, hDestDC);
	ReleaseDC(hWnd, hSrcDC);
}

VBのサンプル:

' ピクチャボックスPicture1に表示されているイメージの一部をピクチャボックスPicture2に描画する。
Private Sub Command1_Click()

	BitBlt _
	Picture2.hDC, _
		0, 0, 100, 100, _
		Picture1.hDC, _
		0, 0, _
		SRCCOPY

End Sub

(original text:1998/12/25 更新)

本ドキュメントの内容は保証しません。本ドキュメントによって生じた結果について、一切の責任を負いません。