他のフォーム等が重なっていても、指定したフォームの画面をキャプチャしたい

解決


egg  2012-09-19 22:39:10  No: 42953  IP: 192.*.*.*

delphi7
Windows7

  フォームにPanelが貼ってあって、そのPanelにいくつかのImageが貼ってあります。
そのPanelをBitmapとしてキャプチャしようと思っています。
  (PanelにImageが貼ってある状態の見た目をキャプチャしたい)

  現在はBitbitを利用してPanelをキャプチャしていますが、これだと処理中にPanelの前面に何か別のフォーム等があると、それが重なった状態でキャプチャされてしまいます。
  それでは困るので、調べていたところ「DrawToBitmap」という私の要望通りのメソッドが存在するような情報を発見しました(以下URL)。

http://help.infragistics.com/Help/NetAdvantage/Reporting/2012.1/CLR4.0/html/Infragistics4.Win.UltraWinReportViewer.v12.1~Infragistics.Win.UltraWinReportViewer.UltraReportViewer~DrawToBitmap.html

    しかし残念ながら、このメソッドの使用方法がわかりませんでした。
  このメソッドの使用方法か、別のフォーム等が重なっていてもPanelをキャプチャできる他の方法をご存じの方がいらっしゃいましたら、教えていただきたいです。
  よろしくお願いします。

編集 削除
Mr.XRAY  2012-09-19 23:26:36  No: 42954  IP: 192.*.*.*

こんにちは,

TPanel ということであれば,PrintWindow 関数を使用すれば可能です.

http://mrxray.on.coocan.jp/Delphi/plSamples/368_ScreenCaptureTest.htm#list13

  //その時アクティブなウィンドウをキャプチャー
  hTargetWnd := Windows.GetForegroundWindow;
  
ここの hTargetWnd を,目的の TPanel のハンドルにしてください.

編集 削除
egg  2012-09-20 10:47:00  No: 42955  IP: 192.*.*.*

Mr.XRAYさん

レスありがとうございます。
希望通りに動きました。

PrintWindowの使い方に少し悩みましたが
過去記事でこれまたMr.XRAYさんの解説を読んで理解しました。

 https://www.petitmonte.com/bbs/answers?question_id=6524 

重ね重ね、ありがとうございました!

編集 削除
egg  2012-09-20 10:52:11  No: 42956  IP: 192.*.*.*

すみませんリンクがおかしいですね。

帰宅してから、PCで正しいリンクを貼り直します。

編集 削除
Mr,XRAY  2012-09-20 11:01:05  No: 42957  IP: 192.*.*.*

>PrintWindowの使い方に少し悩みましたが

え !?

PrintWindow(hTargetWnd, bmpOrigin.Canvas.Handle, 0);

で分かりませんか?
う〜ん.私のサイトの記事は難解と言われていますが,

PrintWindow(hTargetWnd, bmpOrigin.Canvas.Handle, 0);
PrintWindow(ターゲット,つまり目的のウィンドウのハンドル,
            ビットマップのCanvasのハンドル,
      0);

と読み取れませんか?  
う〜む.悩んでしまいます.

編集 削除
通りすがり  2012-09-20 12:11:02  No: 42958  IP: 192.*.*.*

初心者の頃はハンドルの概念とかが難しいからではないでしょうか?

編集 削除
Mr.XRAY  2012-09-20 12:55:32  No: 42959  IP: 192.*.*.*

>初心者の頃はハンドルの概念とかが難しいからではないでしょうか?

そうですね.
で,他の記事を読んで見て,改めて理解するということはよくありますね.
大変失礼しました.
サイトの記事を,なんとかして理解しやすいように,と思う気持ちから,とご理解ください.

編集 削除
egg  2012-09-20 14:04:35  No: 42960  IP: 192.*.*.*

誤解を与えてしまいごめんなさい。
Mr.XRAYさんの仰っていることはつたわりました。

delphiのVCLに定義されていないので
 function PrintWindow( hwnd : HWND; hdcBlt : HDC; nFlags : UINT ) : BOOL; stdcall; external 'user32.dll';

を追加しなくてはいけない、という部分が初めての経験だったものですから、
そこに悩んでしまいました。

どちらにせよ初心者だから理解できなかった部分なのですが、
Mr.XRAYさんの表現が伝わりづらかった訳ではないです。

この度は本当にありがとうございました∧∧

編集 削除
Mr.XRAY  2012-09-20 23:59:03  No: 42961  IP: 192.*.*.*

> function PrintWindow( hwnd : HWND; hdcBlt : HDC; nFlags : UINT ) : BOOL; stdcall; external 'user32.dll';

>を追加しなくてはいけない、という部分が初めての経験だったものですから、
>そこに悩んでしまいました。

スミマセンね.添付のファイルには,全ソースコードを含めていましたが,サイトの記事は,
interface 部を省略していました.手抜きでした.
今,interface 部も含めたコードに修正しておきました.

編集 削除
egg  2012-09-21 00:39:44  No: 42962  IP: 192.*.*.*

【過去記事】「checkboxとradiobuttonの印刷について」
https://www.petitmonte.com/bbs/answers?question_id=6524
先ほどリンクを失敗した記事です。
これでも失敗していた場合はあきらめますw

このQ&Aサイトの上記の題名で調べれば出てきます。
もし同様の悩みを持った方がいれば参考にするといいかもしれません。


Mr.XRAYさん
  確認しました。
  迅速な対応ありがとうございました。
  この質問掲示板以外でもいつもホームページのサンプルを参考にさせていただいているので、本当にお世話になっております。
  今回は、素人から見ると特殊な部分があったので理解が遅れてしまいましたが、いつもはそのまま使えるくらいわかりやすいので、本当に助かっています。
  この場を借りていつものお礼を申し上げます。
  これからもよろしくお願いします^^

編集 削除