BOOL StretchBlt( HDC hDestDC, int nDestLeft, int nDestTop, int nDestWidth, int nDestHeight, HDC hSrcDC, int nSrcLeft, int nSrcTop, int nSrcWidth, int nSrcHeight, DWORD dwRop);
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
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 | デバイスコンテキストハンドルが不正。 |
/* * 指定されたウィンドウに、ディスプレイ上の左上のイメージを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); }
' ピクチャボックスPicture1に表示されているイメージの一部をピクチャボックスPicture2に、2倍の大きさで描画する。 Private Sub Command1_Click() StretchBlt _ Picture2.hDC, _ 0, 0, 200, 200, _ Picture1.hDC, _ 0, 0, 100, 100, _ SRCCOPY End Sub