StretchBlt 拡縮をともなうグラフィックデバイス間のイメージの転送

Cの宣言:

BOOL StretchBlt(
	HDC hDestDC,
	int nDestLeft, int nDestTop,
	int nDestWidth, int nDestHeight,
	HDC hSrcDC,
	int nSrcLeft, int nSrcTop,
	int nSrcWidth, int nSrcHeight,
	DWORD dwRop);

VBの宣言:

Declare Function StretchBlt Lib "gdi32" ( _
	ByVal hDestDC As Long, _
	ByVal nDestLeft As Long, ByVal nDestTop As Long, _
	ByVal nDestWidth As Long, ByVal nDestHeight As Long, _
	ByVal hSrcDC As Long, _
	ByVal nSrcLeft As Long, ByVal nSrcTop As Long, _
	ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, _
	ByVal dwRop As Long) As Long

説明:

hSrcDCで指定される転送元グラフィックデバイス上の、左上端座標(nSrcLeft, nSrcTop)、幅nSrcWidth、高さnSrcHeightの長方形領域に存在するイメージを、hDestDCで指定される転送先グラフィックデバイス上の(nDestLeft, nDestTop)で指定される位置に、幅nDestWidth、高さnDestHeightに拡大/縮小して描画する。特に、幅や高さが負の時、鏡映イメージや上下逆のイメージを描画することができる。

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

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

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

StretchBlt は、BitBltよりも低速である。BitBltですむ処理のときは、BitBltを使用する方がよいだろう。

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

イメージがStretchBitによって拡縮されるとき、色がつぶれずにきれいに描画されるようにするためには、SetStretchBltMode関数を実行する。

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

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

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

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

Cのサンプル:

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

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

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

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

VBのサンプル:

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

	StretchBlt _
		Picture2.hDC, _
		0, 0, 200, 200, _
		Picture1.hDC, _
		0, 0, 100, 100, _
		SRCCOPY

End Sub

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

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