Visual C++ .NET2005でCLRのwindowsフォームコントロールライブラリのテンプレートを用いてコントロールの作成をしています。
そこで、デバイスコンテキストの取得方法が分かりません。教えていただけないでしょうか?
多分、C++/CLIなんだと思いますが、
CLIの場合、デバイスコンテキストを意識してプログラミングする必要が
ありましたっけ?
CLIの作法に則って処理する方法があるのであれば、そちらを使う方がよいと
思いますので、何をやりたくてそういう質問をしているのかを書いた方が
良いと思いますよ。
CLRのwindowsフォームコントロールライブラリのテンプレートを用いています。
やりたいことは、画面をキャプチャーし縮小してpictureboxに表示するということです。MFCではCWindowDC cSrcDC(NULL)を用いて画面のDCを取得できて、BitBltやStretchBltを用いて処理をすることが出来ましたが、CLRではどれも使うことが出来ません。
キャプチャーした情報はどのようにして持っているのでしょうか?
クリップボード?
CRLではデバイスコンテキストを直接使うことは余りありません。
System::Drawing::Graphicsを使うことになります。
ちなみにC++/CLIでこれらの処理をするには、まずはC#のソースを参考にされたほうがよいです。
基本的には ^ がついたり :: になったり、gcnew になったりするだけなので十分に参考になります。
(C++/CLIのドキュメントが少ないのが現状ですので)
いくつか紹介しておきます。
DOBON.NET 画像、印刷編メニュー(C#,VB.NET)
http://dobon.net/vb/dotnet/graphics/index.html
緑のバイク C# 画像/描画
http://homepage3.nifty.com/midori_no_bike/CS/graphics.html
> CRLでは
間違いです。
CLRでした。
ちなみに
CLIとは.NET Frameworkに関する仕様のことで、
CLRとはCLIの動作環境を実装したものです。(「実践C++/CLI」より一部抜粋)
Blueさん、ご意見ありがとうございます。
キャプチャーした情報はBitMapで保持します。
"DOBON.NET 画像、印刷編メニュー(C#,VB.NET)"に、[PrintScreen]キーを用いてクリップボードに保持しそこからPictureBoxに表示していましたが、これでは2度手間です。
処理を連続して行うシステムを作ろうと考えているので出来る限り処理を最適化したいです。
他の方法はありませんでしょうか?
> キャプチャーした情報はBitMapで保持します。
ならば普通に Bitmapオブジェクトをファイルパスから作ればいい話なのでは?
Bitmapファイルより読み込み、ピクチャーボックスのサイズに縮小して表示する例。
ただし、縮小率は考えていない。
Bitmap^ img = gcnew Bitmap("パス");
this->pictureBox1->Image =
gcnew Bitmap( img, this->pictureBox1->Width, this->pictureBox1->Height );
何度もありがとうございます。
ネットワークカメラの画像をWebBrowserコントロールを用いて表示し、そこから静止画を取得し変換すること連続して行うことを考えています。
よくわからなくなってきた。
最終的に、ビットマップにするけど、変換前は
「ネットワークカメラの画像」(動画)ということなんでしょうか?
(というか、こういう情報は一番最初に提示すべき。んなこと回答者が予想できるわけない。)
すいませんが、動画を静止画に変換するというやり方はわかりません。
(最適な方法はあるはず。)
一応類似スレ(未解決)
http://madia.world.coocan.jp/cgi-bin/Vcbbs/wwwlng.cgi?print+200606/06060026.txt
ビットマップファイルで保持するならBlueさんの方法でよいのだと思いますが、
メモリ上のビットマップオブジェクトに保持するのであれば、違ってきますね。
Blueさんが紹介してくれたページには直接キャプチャするにはWin32APIを使う
ように書かれているようなので素直にそれを使うのも手なのでは?
CLRでうまく出来ないのであれば、無理をしてCLRだけでやろうとする必要は
ないわけですし。
要はその辺の見極めをする為の情報をきちんと得て状況に応じた対応ができれば
よいわけですし。
C#だが、こんなスレも
http://f57.aaa.livedoor.jp/~jeanne/bbs/faq.cgi?mode=al2&namber=1028&KLOG=6
# 完全に「デバイスコンテキストの取得」とは本題がずれていまなぁ。
うーん、要はWebBrowserコントロールで表示しておいて表示している画像を
キャプチャ使用としているんですよね。
それって必ずしもうまく行くとは限らないような気がしますけれど。
書き換え中にキャプチャしてしまう事もありえそうですし。
ネットワークカメラから直接静止画を取得するようにした方がいいのでは?
ネットワークカメラ側にはそういうインターフェイスはないのですか?
Blueさん、PATIOさん、アドバイスをありがとうございます。また、デバイスコンテキストの話からずれてきてしまい申し訳ありません。
>CLRでうまく出来ないのであれば、無理をしてCLRだけでやろうとする必要は
>ないわけですし。
上で書いたようなコンポーネントを作成しようとしています。CLRを用いずに作る方法をご存知でしょうか?もしご存知であれば、参考になるページを教えていただきたいです。教授には.NET Frameworkコンポーネントを作れと言われました。
>ネットワークカメラから直接静止画を取得するようにした方がいいのでは?
>ネットワークカメラ側にはそういうインターフェイスはないのですか?
調べてみます。USBカメラを用いた場合のサンプルコードは見つけましたが。ネットワークカメラを用いた場合のサンプルが見つからなかったので断念していました。再度チャレンジしてみます。
用いているカメラはPanasonicのBB-HCM381です。
> CLRを用いずに作る方法をご存知でしょうか?
Blueさんが紹介してくれているページに書いてありますが、
ちゃんと読みましたか?
下の方にWin32APIをCLR上に取り込んで使用する方法が書かれています。
もし、サンプルを見て理解でいないようならC++/CLIの勉強の方を
本格的にした方が良いかもしれません。
ネットワークカメラであるならその使い方に関する説明もメーカーから
出ていてよさそうなものなんですが、Panasonicのホームページに
その辺りの制御方法に関する情報は無いんでしょうか。
あと、HTTPを使うにしてもなんにしてもネットワーク経由で何かをするなら
通信する為の基本的な知識は必要です。
HTTPを使った制御が可能ならMFCのWinInet系のクラスを使って
ホームページを取得する方法なんかを調べて見てはどうでしょう。
なんにせよ、単独の知識だけで何とかなるような事は少ないので
色々な知識を総動員するつもりで取り組まないといけないと思いますよ。
足りない知識はNET上で検索して調べるとか、本を探して調べるとか。
> Blueさんが紹介してくれているページに書いてありますが、
> ちゃんと読みましたか?
> 下の方にWin32APIをCLR上に取り込んで使用する方法が書かれています。
DOBON.NET 画像、印刷編メニュー(C#,VB.NET)
の画面をキャプチャするの中を上から下までしっかり詠んで見てください。
ツイート | ![]() |