ビットマップの拡大・縮小

前回ではモノクロビットマップを作りましたが、
今度はそのビットマップのサイズを変更して表示してみましょう。

StretchBlt

StretchBltという関数を使うことで、伸縮させて表示できます。
「多重起動の防止」のソースをスケルトンとして使います。
ウィンドウプロシージャ内に以下の内容を追加していきましょう。

     //デバイスコンテキスト・仮想DC
     HDC hdc, hdcMem;
     PAINTSTRUCT paint ;
     //作成するビットマップ
     HBITMAP hBitmap;
     //ビットマップデータ
     BYTE bm[]={1,128, 2,64, 4,32, 8,16,
                        16,8, 32,4, 64,2, 128,1,
                        128,1, 64,2, 32,4, 16,8,
                        8,16, 4,32, 2,64, 1,128};

宣言自体は前回とまったく同じですね。

               //デバイスコンテキストを取得
               hdc = BeginPaint(hwnd, &paint);
               //ビットマップを作成
               hBitmap = CreateBitmap(16,16,1,1,bm);
               //仮想デバイスコンテキストを作成
               hdcMem = CreateCompatibleDC(NULL);
               //仮想デバイスコンテキストにビットマップを設定
               SelectObject(hdcMem, hBitmap);

               //仮想DCからDCへコピー
               StretchBlt(hdc,0,0,16,16,hdcMem,0,0,16,16,SRCCOPY);
               StretchBlt(hdc,0,17,8,8,hdcMem,0,0,16,16,SRCCOPY);
               StretchBlt(hdc,0,26,64,64,hdcMem,0,0,16,16,SRCCOPY);

               //仮想デバイスコンテキストを削除
               DeleteDC(hdcMem);
               //ビットマップを削除
               DeleteObject(hBitmap);
               //デバイスコンテキストを解放
               EndPaint(hwnd, &paint);

メモリDCやビットマップの作成なども前回と同じです。

StretchBlt関数で
はじめは幅16・高さ16のビットマップを幅16・高さ16で原寸大コピーし
次は幅16・高さ16のビットマップを幅8・高さ8に縮小コピーし
最後は幅16・高さ16のビットマップを幅64・高さ64に拡大コピーしています。

では実行してみましょう。

ビットマップの拡大・縮小

原寸大のビットマップはともかく、縮小では一部は潰れているし
拡大もそのまま拡大されているだけだったりとちょっとイマイチですね^^;

BOOL StretchBlt( HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,
            int nHeightDest, HDC hdcSrc, int nXOriginSrc, int nYOriginSrc,
            int nWidthSrc, int nHeightSrc, DWORD dwRop );

第一引数 hdcDest には、コピー先のデバイスコンテキストのハンドルを指定します
第二・三引数 nXOriginDest, nYOriginDest には、コピー先の長方形の左上隅のx・y座標を指定します
第四・五引数 nWidthDest, nHeightDest には、コピー先の長方形の幅・高さを指定します
第六引数 hdcSrc には、コピー元のデバイスコンテキストのハンドルを指定します
第七・八引数 nXOriginSrc, nYOriginSrc には、コピー元の長方形の左上隅のx・y座標を指定します
第九・十引数 nWidthSrc, nHeightSrc には、コピー元の長方形の幅・高さを指定します
第十一引数 dwRop には、ラスタオペレーションコードを指定します

戻り値 成功ならTRUEが、失敗ならFALSEが返ります。

ソースの表示

2005/6/2


戻る