• ベストアンサー

C++/CLIを用いて画像をクリップボードにコピー

VC++でC++/CLIでアプリケーションを作成しています。 そこで,pictureBox1の画像を,クリップボードにコピーしたいのですが,方法が分からず困っています。 Clipboard::SetDataObject(); の () の中に何を渡せばいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

まず最初に訂正です。 Clipboard::SetData("Bitmap",this->pictureBox1->Image); でも良いのですが、 Clipboard::SetDataObject( this->pictureBox1->Image ); でも良かったみたいです。 で、pictureBox1(グラフを描画した方)のイメージを貼り付けできない理由ですが、 Graphics ^g = this->pictureBox1->CreateGraphics(); を使用して描画した内容は pictureBox1->Image には反映されないので、pictureBox1->Image が空になっているためだと思います。 これについては http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html なんかが参考になると思います。 上のリンク先では ・PictureBoxのImageプロパティを一切使用しない。 ・PictureBoxのGraphicsオブジェクト(PictureBox.PaintイベントとPictureBox.CreateGraphicsメソッド)を一切使用しない。 のどちらかにしなければならない、ということが書かれていますが、それは .NET に限った話であって、API を使用すれば問題ありません。 次のようにするとの内容 Graphics ^g = this->pictureBox1->CreateGraphics(); を使用して描画した内容もクリップボードにコピーすることができます。 // stdafx.h #include <windows.h> #pragma comment( lib, "user32.lib" ) #pragma comment( lib, "gdi32.lib" ) // フォームのコード HWND hwnd = (HWND)pictureBox1->Handle.ToInt32(); HDC hdcSrc = GetDC( hwnd ); Bitmap ^bmp = gcnew Bitmap( pictureBox1->Width, pictureBox1->Height ); Graphics ^g = Graphics::FromImage( bmp ); HDC hdcDst = (HDC)g->GetHdc().ToInt32(); BitBlt( hdcDst, 0, 0, pictureBox1->Width, pictureBox1->Height, hdcSrc, 0, 0, SRCCOPY ); IntPtr p = IntPtr(hdcDst); g->ReleaseHdc(p); ReleaseDC( hwnd, hdcSrc ); Clipboard::SetDataObject( bmp ); IntPtr を HWND や HDC にキャストしようとするとエラーになってしまったので、ToInt32() を使用しています。が、64bit アプリケーションの場合は ToInt64 に変更する必要があると思います。

con014057
質問者

お礼

ご丁寧な回答ありがとうございます。 無事に欲しい機能を実現することができました。 リンク先の内容もまだ完全に理解できていませんが, 勉強のために,いろいろ試したいと思います。

その他の回答 (1)

回答No.1

SetDataObject ではなく SetData でしたら Clipboard::SetData("Bitmap",this->pictureBox1->Image); でできますけど。

con014057
質問者

お礼

ご回答ありがとうございます。 さっそく試してみました。 質問時に説明していませんでしたが, pictureBox1にはグラフを描画し, picturebox2にはUSBカメラからの画像を表示しています。 pictureBox2の画像はクリップボードにコピーして,Excelなどに貼り付け出来ましたが,なぜか,pictureBox1は出来ません。(Excelに貼り付けようとすると,『データを貼り付けできません』とエラーがでてしまいます。