- ベストアンサー
WEBページをイメージとしてキャプチャしたいです
よくWEBページをBMPで保存するフリーソフトがありますが、(URL2BMP, HTML2JPG, HTML2BMPなど)、あの仕組みを知りたいです。 ・ブラウザを画面表示せずに、 ・WEBページをイメージとしてキャプチャ なんですけど... C#で試行錯誤してます。 AxSHDocVw.AxWebBrowserで、フォームにWebを表示するくらいは出来たんですが... C++でのお答えでもOKです。 また、もし上記ソフトのソースが公開されていれば、その在処でもOKです。 お力お貸しください。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
How To Print a Form That Is Too Large for the Screen or Page http://support.microsoft.com/kb/230502/en-us で行けそうな気がします。
その他の回答 (2)
- sha-girl
- ベストアンサー率52% (430/816)
1.対象のウインドウのHDCをGetDCで取得 2.CreateDIBSectionでDIBを作成 3.CreateCompatibeDCでメモリDCを作成 4.SelectObjectで3のメモリDCと2のDIBを関連付ける 5.BitBltで1のHDCを3のメモリDCへSRCCOPY 6.DIB(メモリ上)の中に画像情報が入っているので後は煮るなり焼くなり好きにする。 私がわかるのはこれぐらいです。
お礼
ご回答ありがとうございます。無事、本懐とげることができました。
補足
表示されているウインドウならご回答の方法でOKでした。 久しぶりに C + SDK でサンプルを作ってみたりしたのでいい勉強になりました。ありがとうございます。 ウインドウを表示せずにできる方法を引き続きさぐってますので、だれかお知恵を。
- sha-girl
- ベストアンサー率52% (430/816)
VC++の場合ですが MFCを使えばブラウザ自体は簡単に作れると思います。 でまずデバイスコンテキストやDIB、BMPのフォーマットについて調べてください。 それらのソフトがやっていることは DCの内容を単にディスプレイ上に表示させずに BMPに変換してファイルに吐き出しているだけだと 思います。 C言語というかGetDC等のWindowsAPIを駆使する 必要があり、 ある程度WindowsプログラムをSDKで 組んだことがないと厳しいと思います。 http://www.kumei.ne.jp/c_lang/sdk/sdk_26.htm JPG変換はまた別の話ですのでおいておきます。
補足
ご回答ありがとうございます。 「DCの内容を単にディスプレイ上に表示させずに BMPに変換してファイルに吐き出しているだけだと 思います。」 同感です。 ご回答のように、1からブラウザを作って、将来にわたりメンテするド根性があれば、それ作ってDCを変えるだけで済むんですが、 せっかく(俺が仕様だと言わんばかりの)出来合いのブラウザがActiveXで使用できるので... 質問への補足ですが、ファイルに保存することは要求してないです(それであれば前に記したソフトをそのまま使います)。 つまり、コントロールの表示先を「画面上」から「メモリ上」にすり替えできればいいなと思ってる訳です。 コントロール(この際LabelでもScrollBarでもなんでもいいです)には普通、指定した親ウインドウのDCがあてがわれると思いますが、 これをCreateCompatibleDCなりで作ったDCですり替えることができれば、解決しそうな気がしてます。(それができないんです(T_T) )。 ちなみに、WM_PAINTの飛び先(OnPaint)の前後にDCをすり替えるコードを入れてみたりもしたんですが、 子ウインドウが描画されず、あえなく敗退しました。 CでのWindowsプログラムも経験あります。だれか、詳細は省いて結構ですので、似たようなことやったことのある方、ご回答おまちしてます。
お礼
ご回答ありがとうございます。無事、本懐とげることができました。
補足
ありがとうございます。無事、本懐とげることができました。 SendMessage( hWnd, // 対象ウインドウハンドル WM_PRINT, (WPARAM)hMemDC, // メモリDC PRF_ERASEBKGND | PRF_CHILDREN | PRF_CLIENT | PRF_NONCLIENT | PRF_OWNED); こんなふうですね。WM_PRINTは考えつきませんでした...。