Button1をクリックしてForm1のビットマップイメージを取得し、
それをImage1に表示したいのですが、下記のように書くと
Image1に黒く表示されただけでどうもForm1のイメージはとれて
いません。どの辺が間違っているのでしょうか?
procedure TForm1.Button1Click(Sender: TObject);
var
hdcForm,hdcCopy: HDC;
begin
Bitmap := TBitMap.Create;
hdcForm := GetDC(Form1.Handle);
hdcCopy := CreateCompatibleDC(hdcForm);
Bitmap.Handle := CreateCompatibleBitmap(hdcCopy,Form1.Width ,Form1.Height);
Image1.Picture.Bitmap := Bitmap;
end;
TForm には Canvas プロパティーがありますので、それを有効利用してください。
procedure TForm1.Button2Click(Sender: TObject);
begin
with Image1.Picture.Bitmap do begin
Width := ClientWidth;
Height := ClientHeight;
Canvas.CopyRect(ClientRect,self.Canvas,ClientRect);
end;
end;
GetFormImage メソッドを使うともっと簡単です。
procedure TForm1.Button1Click(Sender: TObject);
var
bmp:TBitmap;
begin
bmp := self.GetFormImage;
Image1.Picture.Bitmap.Assign(bmp);
bmp.Free;
end;
蛇足です。
Delphi の TBitmap は、API の CreateCompatibleDC() でつくられるメモリDC を
カプセル化したクラスです。これの Canvas.Handle がデバイスコンテキストハンドル
に相当します。いわゆるオフスクリーンビットマップですね。
今回の質問では、GetDC() を使っていますのでクライアント領域のイメージがほしい
のでしょう。でも、幅と高さは Width と Height を使っていますので、タイトルバー
や枠なんかも含めたいのでしょうか。その場合は、GetDC ではなく GetWindowDC() を
使って、ビットマップに複写します。こんな感じです。
procedure TForm1.Button1Click(Sender: TObject);
var
FormDC:HDC;
begin
FormDC := GetWindowDC(Handle);
Image1.Picture.Bitmap.Width := Width;
Image1.Picture.Bitmap.Height := Height;
BitBlt(Image1.Picture.Bitmap.Canvas.Handle,0,0,Width,Height,FormDC,0,0,srcCopy);
ReleaseDC(Handle,FormDC);
Image1.Refresh;
end;
無事解決しました。
いろいろ勉強になります。jok様ありがとうございました。
ツイート | ![]() |