お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル

"DrawDibDraw (サンプル)"

この発言は
#01142 Fermion さんのDrawDibDraw (宣言)
に対するコメントです

■説明  DrawDibDraw による描画のサンプルです。  実行ファイルと同じフォルダ内にある 'Test.bmp' を読み込んで、Form1 の クライアント領域に描画します。 ■使い方  1.Form1 に Button1 を適当に配置して下さい。  2.Form1 の OnCreate, OnDestroy、Button1 の OnClick等を以下のように    して下さい。 ■注意事項  データチェック等が省かれています。実際のご使用に当たっては十分ご注意 下さい。 ■サンプルコード //========================================================================= {...略...} implementation uses DrawDibAPI; {* 追加して下さい *} {$R *.DFM} var bmpStream: TMemoryStream; {* Bitmap File 読み込み用MemoryStream *} {-------------------------------------------------------------------------- Form OnCreate --- bmpStream を作成 //------------------------------------------------------------------------} procedure TForm1.FormCreate(Sender: TObject); begin bmpStream := TMemoryStream.Create; end; {-------------------------------------------------------------------------- Form OnDestroy --- bmpStream を破棄 //------------------------------------------------------------------------} procedure TForm1.FormDestroy(Sender: TObject); begin bmpStream.Free; end; {-------------------------------------------------------------------------- DrawDibDraw を使用した描画処理 Canvas : 対象となる Canvas を指定 dTop, dLeft : 描画開始位置 dHeight, dWidth : 描画領域のサイズ BitmapStream : 描画対象Bitmapが入ったMemoryStream //------------------------------------------------------------------------} procedure DDDraw( Canvas: TCanvas; dTop, dLeft, dHeight, dWidth: Integer; BitmapStream: TMemoryStream ); var lpBits : Pointer; {* ビットマップビット格納先へのポインタ *} pBmpInfo: PBitmapInfo; {* BitmapInfo構造体へのポインタ *} nColors : Cardinal; {* パレットカラー格納数 *} hdd : HDRAWDIB; {* 描画のための DrawDib DC *} {- 描画領域に収まるように縦横等倍縮小 -------------------------------} procedure SetSize; var RatioH, {* 高さの比 *} RatioW : Extended; {* 幅の比 *} begin with pBmpInfo^.bmiHeader do begin if ( biWidth > dWidth ) or ( biHeight > dHeight ) then begin RatioH := dHeight / biHeight; RatioW := dWidth / biWidth; if RatioH > RatioW then RatioH := RatioW; dHeight := Trunc( biHeight * RatioH ); dWidth := Trunc( biWidth * RatioH ); Exit; end;{if ( biWidth > dWidth ) or ( biHeight > dHeight ) then} dHeight := biHeight; dWidth := biWidth; end;{with pBmpInfo^.bmiHeader do} end; {- End --------------------------------------------------------------} begin {* BitmapInfo構造体のアドレスを計算 *} pBmpInfo := PBitmapInfo( PChar( BitmapStream.Memory ) + SizeOf(TBitmapFileHeader) ); with pBmpInfo^, bmiHeader do begin {* パレットカラー格納数を取得 *} if biClrUsed = 1 then nColors := biClrUsed else nColors := ( 1 shl biBitCount ); {* 各ビット数に合わせてビットマップビット配列のアドレスを計算 *} if biBitCount > 8 then begin lpBits := PChar( @bmiColors ) + Ord( biClrUsed ) + Ord( biCompression = BI_BITFIELDS ) * 3; end else lpBits := PChar( @bmiColors ) + nColors; {* 描画のために DrawDib デバイスコンテキストを作成 *} hdd := DrawDibOpen; try {* DrawDib DC のパレットを実体化 *} DrawDibRealize( hdd, Canvas.Handle, True ); {* 描画サイズ設定 *} SetSize; {* 画像表示 *} DrawDibDraw( hdd, Canvas.Handle, dLeft, dTop, dWidth, dHeight, PBitmapInfoHeader( @bmiHeader ), lpBits, 0, 0, biWidth, biHeight, DDF_BACKGROUNDPAL ); //↑背景パレットに DrawDib DC のパレットを選択 finally {* DrawDib DC を閉じ、割り当てたリソースを解放 *} DrawDibClose( hdd ); end;{try..finally..} end;{with pBmpInfo^ do} end; {-------------------------------------------------------------------------- Button1 OnClick //------------------------------------------------------------------------} procedure TForm1.Button1Click(Sender: TObject); var FileName: String; begin {* 実行ファイルと同じフォルダ内の'Test.bmp'を表示させる場合 *} FileName := ExtractFilePath( ParamStr(0) ) + 'Test.bmp'; if not FileExists( FileName ) then Exit; {* BitmapファイルをbmpStreamに読み込む *} bmpStream.LoadFromFile( FileName ); {...略...} {* Form1のCanvasに描画 *} DDDraw( Canvas, 0, 0, ClientHeight, ClientWidth, bmpStream ); end; {-------------------------------------------------------------------------- //------------------------------------------------------------------------} {...略...} end. //========================================================================= 00/7/19(Wed) 02:07am Fermion [KHF03264]  Original document by Fermion 氏 ID:(KHF03264)



ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。

Copyright 1996-2002 Delphi Users' Forum