| 魔界の仮面弁士 さん
畏れ入ります。
>>「RichTextBoxの要素(画像とテキスト)をArraylistに格納して、ArrayListの要素をLabelやPictureBoxに取り出す」 >>ということです。 > PictureBox に画像を表示するなら、メタファイルのままでも良いのでは? > Metafile も Bitmap も、どちらも Image クラスですよね。
おっしゃるとおり、いいと思ったのです。 しかし、BitmapでAddしたものは全部残っているのに、MetafileでAddしたものは最後のものしか残っていませんでした。
ここで「残っている」、といっているのはpictureboxに画像として表示できるかどうか、ということです。
GetTypeでみればちゃんと全部にSystem.Drawing.Imaging.Metafileがセットされているように見えるのですが。
> > >>まず、これって永続化できてない、ってことですよね・・・ > クリップボードの内容をすべて永続化させたいなら、RichTextBox 等を介さず、 > すべて自前で永続化すべきです。 > > RichTextBox にしろ他の多くのアプリケーションにしろ、クリップボード内の > すべての形式を貼り付け動作に使うわけではありません。一般的には、 > それぞれの形式に優先順位をつけ、最初に見つかった形式のみが採用されます。 > > たとえば、リッチテキスト形式の"あいうえお"と、テキスト形式の "かきくけこ" が > 同時にクリップボードに格納されていた場合、wordpad に貼りつくのは前者、 > notepad に貼りつくのは後者となります。どちらか一方の情報は失われます。 > (テキスト形式のみが格納されていた場合、wordpad はそれを採用します) > > > RichTextBox も同様で、複数の画像形式が格納されていたとしても、 > そのすべてが貼り付くわけでは無いはずです。 > (bmp, dib, wmf, emf 等々、どの形式が優先順位が高いのかは調べていませんが)
誤解を与えてしまっていたら申し訳ありません。 クリップボードを永続化したいわけではないです。 あくまでもRichTextBoxの内容です。
どこかからコピーしてきてRichTextBoxに貼りつけたあと、その画像をもう一度コピーした場合と RTFからRichTextBoxに読み込んだ場合の画像のコピーと、 なぜ違うものになるのか、ということが不思議です。
これはどちらも操作方法は違いますが、 「RichTextBoxからのコピー」という意味では同じですよね。。。
>>DeviceIndependentBitmapがある状態ならば、 >> Dim img As Image = Clipboard.GetImage() >>であっさりとイメージ(System.Drawing.Bitmap)が取得できますので、 > メタファイルではなく、ビットマップ形式での保存に拘るのは、 > 何か理由があるのでしょうか? >
BitmapでAddしたものは全部残っているのに、MetafileでAddしたものは最後のものしか残ってい無いという現象が起きたからです。
> 永続化が必要なら、メタファイルのまま Save することもできそうですし、 > Bitmap 化が必要なら、DrawImage するという手もありそうですけれども。
すいません。 永続化はどちらでもよくて、画像がArrayListにセットできて、あとからpictureboxに表示できる形で渡せれば良いです。
DrawImageする方法はHongliang さんにも提案されましたが、 私の理解不足でよくわかりませんでした。手元の書籍でも調べたのですが・・・
で、こんな変なやり方であればなんとかなりました。一度ファイルに書くなんてすごくださいやり方ですが・・・
pictureBox1.Image = GetEnhMetafileOnClipboard(Me.Handle) pictureBox1.Image.Save( "tmp.bmp" ) Dim img as Image = Image.FromFile("tmp.bmp") arl.Add( img )
>>消えてしまうことに問題を感じています。 > 手元に開発環境がないので、こちらでは試せませんが: > > まず、DIB がペースト可能かどうかを調べてみてください。 > クリップボード内のデータを DIB だけにしてから、リッチテキストボックスに > 貼り付け動作を行えば、DIB を貼れるかどうかがわかると思います。 > > 貼れないなら、そもそも DIB が非対応ということになるでしょう。 > もし貼れるなら、今度はそれを再コピーした時に、クリップボードに渡される > 画像形式の種類が何と何になるのかを調べてみてはいかがでしょう。
DeviceIndependentBitmapだけにする方法がわからないのですが、 おそらくあってもなくても張り付きます。
しかし、DeviceIndependentBitmapがある場合には Dim img As Image = Clipboard.GetImage()で System.Drawing.Bitmap が取得でき、問題はなくなります。
|