DOBON.NET DOBON.NETプログラミング掲示板過去ログ

メタファイルの読み込み2

環境/言語:[VB.NET]
分類:[.NET]

すみません。先ほど投稿させていただいたばかりですが、
少し内容が違うので別スレッドで質問させていただきます。

先ほど質問させて頂いたメタファイルの読み込みですが、
ファイル経由がダメならばクリップボード経由で・・・
と試してみたのですが、こちらも上手く行きません。

プログラムは以下の通りです。

        Dim p As System.Drawing.Image

        If System.Windows.Forms.Clipboard.GetDataObject.GetDataPresent( _
           System.Windows.Forms.DataFormats.MetafilePict) Then
            MsgBox("クリップボード存在確認OK")
            p = System.Windows.Forms.Clipboard.GetDataObject.GetData( _
            System.Windows.Forms.DataFormats.MetafilePict)
            If p Is Nothing Then
                MsgBox("取り出し失敗")
            End If
            PictureBox1.Image = p
        End If

上記のGetDataPresentで確かにクリップボードにデータが有るのは
確認できているのですが、GetDataで取り出したデータがなぜかNothing
になってしまいます。

クリップボードのイメージは先ほどのVSVIEW6で作成したメタファイル
イメージでWindowsXPのクリップボードビューアでは正常に表示され
ます。
2004/08/30(Mon) 15:13:53 編集(投稿者)

■No5876に返信(なるさんの記事)
> すみません。先ほど投稿させていただいたばかりですが、
> 少し内容が違うので別スレッドで質問させていただきます。
>
> 先ほど質問させて頂いたメタファイルの読み込みですが、
> ファイル経由がダメならばクリップボード経由で・・・
> と試してみたのですが、こちらも上手く行きません。
>
> プログラムは以下の通りです。
>
> Dim p As System.Drawing.Image
>
> If System.Windows.Forms.Clipboard.GetDataObject.GetDataPresent( _
> System.Windows.Forms.DataFormats.MetafilePict) Then
> MsgBox("クリップボード存在確認OK")
> p = System.Windows.Forms.Clipboard.GetDataObject.GetData( _
> System.Windows.Forms.DataFormats.MetafilePict)
> If p Is Nothing Then
> MsgBox("取り出し失敗")
> End If
> PictureBox1.Image = p
> End If
>
> 上記のGetDataPresentで確かにクリップボードにデータが有るのは
> 確認できているのですが、GetDataで取り出したデータがなぜかNothing
> になってしまいます。
>
> クリップボードのイメージは先ほどのVSVIEW6で作成したメタファイル
> イメージでWindowsXPのクリップボードビューアでは正常に表示され
> ます。

ファイル経由でダメならば、クリップボード経由でもダメでしょう。
それと、Windowsメタファイル形式でない、拡張メタだとダメかもしれません。

  ' クリップボードから取り込み
  Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    Dim pImage As Image

    If Clipboard.GetDataObject.GetDataPresent(DataFormats.MetafilePict) = True Then
      MessageBox.Show("クリップボード存在確認OKでつ。")
      pImage = CType(Clipboard.GetDataObject.GetData(DataFormats.MetafilePict), Image)

      If pImage Is Nothing Then
        MessageBox.Show("取り出し失敗でつ。")
        Return
      End If

      PictureBox1.Image = pImage
    End If
  End Sub

  ' クリップボードに送る
  Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    Dim pMetaFile As New System.Drawing.Imaging.Metafile("D:\Onigiri.wmf")
    Clipboard.SetDataObject(pMetaFile)
  End Sub
java.lang.Nullpoさま。お返事ありがとうございます。

ファイル経由の方は、VS-VIEWで生成したメタファイルが不完全だったようで、
Windowsのビューアでは見れるもののVB6のLoadPicture関数でも読めなかった
のでVS-VIEWでメタファイルを再生成したところ問題なく動作しました。
(Windowsの画像とFAXビューアで見れるのが不思議ですが・・・)

ただ、クリップボード経由の方は取出し前の存在確認はOKなのに、取出すと
やはりNothingになってしまいます。。。
VS-VIEWのリファレンスによると拡張・・・とは書いておらず、ファイル保存の
説明に拡張子WMFとなっている事から通常のメタファイルであると思われます。
先の投稿に書かせていただいたように、Windowsのクリップボードビューアで
表示できるので一般的なメタファイルの形式にはなっていると思われます。
また、VB6では以下の方法で問題なく読み込みできます。

Picture1.Picture = Clipboard.GetData(vbCFMetafile)

うーん、不思議です。
■No5876に返信(なるさんの記事)
> 先ほど質問させて頂いたメタファイルの読み込みですが、
> ファイル経由がダメならばクリップボード経由で・・・
> と試してみたのですが、こちらも上手く行きません。

マイクロソフトサポート技術情報に次のようなものがあります。

マイクロソフト サポート技術情報 - 323530
PRB: Metafiles on Clipboard Are Not Visible to All Applications
http://support.microsoft.com/?id=323530
■No5998に返信(管理人さんの記事)
> ■No5876に返信(なるさんの記事)
>>先ほど質問させて頂いたメタファイルの読み込みですが、
>>ファイル経由がダメならばクリップボード経由で・・・
>>と試してみたのですが、こちらも上手く行きません。
>
> マイクロソフトサポート技術情報に次のようなものがあります。
>
> マイクロソフト サポート技術情報 - 323530
> PRB: Metafiles on Clipboard Are Not Visible to All Applications
> http://support.microsoft.com/?id=323530

管理人さま。返事が遅くなり申し訳ありません。
マイクロソフトの技術情報を確認させていただき、納得しました。
なるほど、そういう事だったんですね・・・

また、他にもう一人回答をいただいたようですが、
私が見たときには既に削除されておりました。
この場を借りてお礼を申し上げます。

ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板