「多重起動の防止」のソースをスケルトンとして使います。
ウィンドウプロシージャ内に以下の内容を追加していきましょう。
//デバイスコンテキスト・仮想DC HDC hdc, hdcMem; PAINTSTRUCT paint ; //読み込むビットマップ HBITMAP hBitmap; //幅・高さを入れる BITMAP bmp;
いつものようにDCとメモリDCなどの宣言をした上で、
今回はサイズを取得するのに使うBITMAP 構造体を宣言します。
//デバイスコンテキストを取得 hdc = BeginPaint(hwnd, &paint); //ビットマップを読み込む hBitmap = SHLoadDIBitmap(_T("\\My Documents\\bmp.bmp")); //hBitmapのサイズを取得し、bmpに入れる GetObject(hBitmap,sizeof(BITMAP), &bmp); //仮想デバイスコンテキストを作成 hdcMem = CreateCompatibleDC(NULL); //仮想デバイスコンテキストにビットマップを設定 SelectObject(hdcMem, hBitmap); int x,y; for(x=0;x<(240/bmp.bmWidth);x++){ for(y=0;y<(296/bmp.bmHeight);y++){ //仮想DCからDCへコピー BitBlt(hdc,x*bmp.bmWidth,y*bmp.bmHeight,bmp.bmWidth,bmp.bmHeight, hdcMem,0,0,SRCCOPY); } } //仮想デバイスコンテキストを削除 DeleteDC(hdcMem); //ビットマップを削除 DeleteObject(hBitmap); //デバイスコンテキストを解放 EndPaint(hwnd, &paint);
SHLoadDIBitmap関数でビットマップをメモリに読み込みます。
なお、このプログラムでもこのビットマップを
MyDocumentsディレクトリに置いて、使っています。
いつも通りメモリDCを作成し、selectobjectでビットマップをメモリDCに設定します。
今回はGetObject 関数で読み込んだhBitmapのサイズをBITMAP構造体に格納します。
このサイズを使って、タイルパターンで隙間なく画面に敷き詰めていきます。
描画が終わったら、メモリDCを削除した後ビットマップを削除します。
では実行してみましょう。
しかしこの画像はちょっとあれですね。
使いまわしもなんなので、次やるときは別の画像を作ってみようと思います。
int GetObject( HGDIOBJ hgdiobj, int cbBuffer, LPVOID lpvObject);
・GDIオブジェクトのサイズを取得します
第一引数 hgdiobj には、論理ビットマップなどのハンドルを指定します (in)
第二引数 cbBuffer には、バッファに書かれる情報のバイト数を指定します (in)
第三引数 lpvObject には、第一引数に対応する情報を受け取るGDIオブジェクトのポインタを指定します (out)
戻り値 成功ならバッファに格納されたバイト数が、失敗なら0 が返ります。
■ソースの表示■
2005/6/26