プロが教えるわが家の防犯対策術!

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

A 回答 (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/pictureboxim …

なんかが参考になると思います。

上のリンク先では

・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 に変更する必要があると思います。
    • good
    • 0
この回答へのお礼

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

お礼日時:2012/01/27 19:37

SetDataObject ではなく SetData でしたら



Clipboard::SetData("Bitmap",this->pictureBox1->Image);

でできますけど。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

さっそく試してみました。
質問時に説明していませんでしたが,
pictureBox1にはグラフを描画し,
picturebox2にはUSBカメラからの画像を表示しています。

pictureBox2の画像はクリップボードにコピーして,Excelなどに貼り付け出来ましたが,なぜか,pictureBox1は出来ません。(Excelに貼り付けようとすると,『データを貼り付けできません』とエラーがでてしまいます。

お礼日時:2012/01/27 11:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!