フォームのビットマップイメージを取得するには?

解決


ねんねこ  2004-05-13 01:23:51  No: 8917

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;


jok  2004-05-13 03:36:48  No: 8918

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;


jok  2004-05-13 04:33:32  No: 8919

蛇足です。
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;


ねんねこ  2004-05-13 20:08:19  No: 8920

無事解決しました。
いろいろ勉強になります。jok様ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加