(ビットマップオフスクリーンビットマップオフスクリーン)
また、ビットマップメモリと呼ばれるオフスクリーンビットマップは、一般的に使用される Windowsプログラミング。これは描画方法を使用して、メモリ内の画像を作成し、画面に表示されます。ユーザーはすぐに画面上の画像を描画したい場合には、オフスクリーンビットマップは、ちらつきを回避するのに役立ちます。オフスクリーンビットマップは、複雑なマッピングユーティリティに適しています。ユーザーは、イメージアップを予め記憶され、必要なときに表示することができます。アニメーションのオフスクリーンビットマップ、アニメーションの中で最も人気のある方法は、マイクロソフトのDirectX SDKです。
オフスクリーンビットマップの原理は、3つの簡単な手順です:
メモリビットマップを作成する(ビットマップメモリを作成します)
ビットマップメモリを描画(ビットマップメモリ上に描画)
画面(にメモリビットマップをコピーメモリにコピーザ・ビットマップ画面)
メモリビットマップを作成(メモリビットマップを作成します)
メモリのビットマップを作成することは容易です。実際には、前回の講義では、数回にわたり作成されています。あなたが作成するたび TBitmapオブジェクトがメモリビットマップであるときは、ファイルの一部がメモリビットマップにロードされ、作成され、一部はメモリビットマップを作成することで、そのサイズを設定し、ビットマップメモリを描き、例えば:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
手順TForm1.btn1Click(送信者:TObjectを); ました ビットマップ:TBitmapの。 I、X、Y、W、H:整数; 赤、緑、青:整数; ベギン ビットマップ:= TBitmap.Create。 Bitmap.Width:= 500; Bitmap.Height:= 500; = 0〜19の操作を行います。私のために ベギン X:=ランダム(400)。 Y:=ランダム(400)。 W:=ランダム(100)+ 50。 H:=ランダム(100)+ 50。 赤:=ランダム(255); 緑:=ランダム(255); 青:=ランダム(255); Bitmap.Canvas.Brush.Color:= RGB(赤、緑、青)。 Bitmap.Canvas.Rectangle(X、Y、W、H)。 終わり; Canvas.Draw(0、0、ビットマップ)。 Bitmap.Free; 終わり; |
ボタンのすべてのクリック、画面上に描かれたランダムな長方形の文字列。このコードは、単純にビットマップメモリを描画し、画面フォームにビットマップをコピーします。
デスクトップを使用する場合は、不確実性の最終実行結果の色を設定する256色。
注意
メモリビットマップを作成する際に、現在表示されている色の深さを有するビットマップは、同じセット。換言すれば、 256色表示設定、メモリビットマップは、ディスプレイが24ビットまたは32ビットに設定されている場合、ビットマップメモリは、32K、64K、または16M色を含むであろう、256色のビットマップです。
(メモリビットマップを保存保存メモリビットマップA)
非常に簡単なビットマップメモリを保存します。これは、コードを見ている実行する必要があります。
1 |
Bitmap.SaveToFile( 'test.bmp'); {}メモリビットマップを保存します |
はい、あなたができるように。実際には、あなたは簡単に独自の画面キャプチャプログラムを作成することができます。やるビットマップメモリにデスクトップの適切な部分をコピーし、ファイルに保存されています。次のコード:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
procedure TForm1.btn2Click(Sender: TObject); var DtCanvas: TCanvas; Bitmap: TBitmap; NumColor: Integer; LogPal: PLogPalette; Src, Dst: TRect; begin { Create a TCanvas object for the desktop DC.} DtCanvas := TCanvas.Create; DtCanvas.Handle := GetDC(0);
{ Create a new TBitmap object and set its} { size to the size of the form.} Bitmap := TBitmap.Create; Bitmap.Width := Width; Bitmap.Height := Height;
{ Create a palette from the form's Canvas} { and assign that palette to the Bitmap's} { Palette property.} NumColor := GetDeviceCaps(Canvas.Handle, SIZEPALETTE); { 返回调色板的颜色数} GetMem(LogPal, SizeOf(TLogPalette) + (NUMCOLORS - 1) * SizeOf(TPaletteEntry)); LogPal.palVersion := $300; LogPal.palNumEntries := NumColor; GetSystemPaletteEntries(Canvas.Handle, 0, NumColor, LogPal.palPalEntry); Bitmap.Palette := CreatePalette(LogPal^); FreeMem(LogPal);
{ Copy a section of the screen from the desktop canvas to the Bitmap } Src := BoundsRect; Dst := Rect(0, 0, Width, Height); Bitmap.Canvas.CopyRect(Dst, DtCanvas, Src);
{ Save it to disk} Bitmap.SaveToFile('form.bmp'); { Clean up and go home} Bitmap.Free; DtCanvas.Free; end; |
运行后,将截取本程序界面并保存到form.bmp文件中,显示图片如下:
内存位图程序实例(Sample Memory Bitmap Program)
下面的清单中的程序,它说明内存位图的应用。当点击两个按钮中的某一个时,文本沿着屏幕水平滚动。
第一个按钮的实现,不使用内存位图(直接写于窗体画面上)。
第二个按钮使用内存位图来实现文本屏幕水平滚动。
第三个按钮停止滚动。
部分代码如下(详细代码请下载本讲示例代码):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
{ 直接画到画布上} procedure TForm1.btn3Click(Sender: TObject); var I: Integer; begin Canvas.Font.Name := 'Arial Bold'; Canvas.Font.Size := 20; Canvas.Brush.Color := clSilver; Done := False; while not Done do begin for I := -canvas.TextWidth(DisplayText) to pred(Width) do begin Sleep(1); Application.ProcessMessages; if Done then Break; Canvas.Font.Color := clGray; Canvas.Brush.Style := bsClear;
Canvas.TextOut(i + 2, 12, DisplayText);
Canvas.Font.Color := clBlack; Canvas.Brush.Style := bsClear; Canvas.TextOut(i, 10, DisplayText); Canvas.Font.Color := clSilver; Canvas.TextOut(i + 2, 12, DisplayText); Canvas.TextOut(i, 10, DisplayText); end; end; end;
{ 通过脱屏位图} procedure TForm1.btn5Click(Sender: TObject); begin Done := True; end;
procedure TForm1.btn4Click(Sender: TObject); var Bitmap: TBitmap; I: Integer; begin Bitmap := TBitmap.Create; Bitmap.Width := Width; Bitmap.Height := 40; Bitmap.Canvas.Font.Name := 'Arial Bold'; Bitmap.Canvas.Font.Size := 20; Bitmap.Canvas.Brush.Color := clSilver; Bitmap.Canvas.FillRect(Rect(0, 0, Width, 40)); Done := False; while not Done do begin for I := -Bitmap.Canvas.TextWidth(DisplayText) to Pred(Width) do begin Application.ProcessMessages; if (Done) then Break; Sleep(1); Bitmap.Canvas.Font.Color := clGray; Bitmap.Canvas.Brush.Style := bsClear; Bitmap.Canvas.TextOut(2, 12, DisplayText); Bitmap.Canvas.Font.Color := clBlack; Bitmap.Canvas.Brush.Style := bsClear; Bitmap.Canvas.TextOut(0, 10, DisplayText); Canvas.Draw(i, 0, Bitmap); end; end; Bitmap.Free; end; |
两种不同的画图方式,显示的效果也不同,其中通过脱屏位图绘制的滚动字幕是最平滑的。如下图:
以上代码均在Delphi7中测试通过,示例代码下载:GDI之脱屏位图.rar