リッチテキストボックスで画像が張り付かない

解決


tt  2010-07-27 13:10:38  No: 102455  IP: [192.*.*.*]

初めまして。
初心者過ぎてコードも1行も書いていないのにつまずいてしまいました。
windows7 64bit home 上で vb6 sp6 pro を使用してプログラムを作っていたところ、リッチテキストへの画像(ビットマップ)の表示がされないため、どうして表示できないのか悩んでしまいました。
元画像をコピー(Ctrl + C)し、リッチテキスト上にてペースト(Ctrl + V)しても画像のアイコンのショートカットが表示されてしまいます。
以下のようにすれば問題なく表示されるのですが…

1,windows付属のワードパッドを開く
2,ワードパットに画像を貼り付ける(正常にコピペできます)
3,ワードパット上の貼り付けた画像をコピーする
4,リッチテキスト上にペーストする
5,正常に表示される

ワードパット上でのコピーでは問題ないのにフォルダーからのコピーでは表示できない理由はなんなのでしょうか。
また、解決策をご教授願えたらと思います。

編集 削除
魔界の仮面弁士  2010-07-27 13:17:27  No: 102456  IP: [192.*.*.*]

> フォルダーからのコピーでは表示できない理由はなんなのでしょうか。
データをコピーしているか、ファイル情報をコピーしているかの違いです。
これは画像で無くとも、テキストやリッチテキストであっても同様です。

たとえば文字列そのものをコピーすれば、RichTextBox には文字列として貼り付きますが、
*.txt ファイルをコピーすれば、ファイルへのショートカット情報を持った
オブジェクト パッケージャとして貼り付けられる事になります。

編集 削除
tt  2010-07-27 13:30:02  No: 102457  IP: [192.*.*.*]

素早い返信ありがとうございます。

>たとえば文字列そのものをコピーすれば、RichTextBox には文字列として貼り付きますが、
*.txt ファイルをコピーすれば、ファイルへのショートカット情報を持った
オブジェクト パッケージャとして貼り付けられる事になります。

という事は、とあるディレクトリ上の画像ファイルをそのままリッチテキストボックスに貼り付けたい場合は、OLEオブジェクトを介して貼り付けないと表示できないということでしょうか(image = Clipboard.GetData  のようにしないといけない?)。

とりあえずクリップボード経由で表示できるかどうか確認してみます。

編集 削除
魔界の仮面弁士  2010-07-27 14:37:14  No: 102458  IP: [192.*.*.*]

> とりあえずクリップボード経由で表示できるかどうか確認してみます。

エクスプローラからのコピーも、画像データのコピーも、テキストデータのコピーも、
いずれもクリップボードを経由しています。

下記のコードを実行して、現在、クリップボード内に
どのような形式のデータが渡されているのかを確認してみください。


Private Sub Command1_Click()
    Debug.Print "----------------"
    Debug.Print "File",Clipboard.GetFormat(vbCFFiles)
    Debug.Print "TXT", Clipboard.GetFormat(vbCFText)
    Debug.Print "RTF", Clipboard.GetFormat(vbCFRTF)
    Debug.Print "BMP", Clipboard.GetFormat(vbCFBitmap)
    Debug.Print "DIB", Clipboard.GetFormat(vbCFDIB)
    Debug.Print "WMF", Clipboard.GetFormat(vbCFMetafile)
    Debug.Print "EMF", Clipboard.GetFormat(vbCFEMetafile)
End Sub

編集 削除
tt  2010-07-27 15:56:11  No: 102459  IP: [192.*.*.*]

>どのような形式のデータが渡されているのかを確認してみください。
ただ今確認いたしました。
→ディレクトリ内のファイルをそのままコピーした場合…
File          True
TXT           False
RTF           False
BMP           False
DIB           False
WMF           False
EMF           False

→ワードパッド内の画像をコピーした場合…
File          False
TXT           False
RTF           True
BMP           False
DIB           False
WMF           True
EMF           True

以上の結果より、ワードパッド内の画像をコピーすると、RTF形式で画像がコピーされるため、同じ形式に対応しているリッチテキストに表示できることが分かりました。
そこで、ワードパッドを介さずにRTF形式でクリップボードに画像データを取得する事は可能でしょうか。もしくは、vbCFFilesの属性で、リッチテキストに画像を表示させることはできるのでしょうか。

以下は関係ありませんが先ほどまで試していた方法です。MSペイントが勝手に開いてしまいかっこ悪く、
実行時エラー438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。
というエラーのため、オブジェクトにセットする際に強制エラー処理しなければならないため、他の方法を探していました。↓
Private Sub Command1_Click()
    
    Dim ImgPath     As String               '画像ファイルフルパス
    Dim Oobj        As OLEObject            'OLEオブジェクト
    
    ipath = App.Path & "\test.bmp"          'テストファイルセット

    On Error Resume Next                    '必須!! 438 エラーになっちゃう!!
    obj = Rt1.OLEObjects.Add(, , ipath)     '一応画像は表示できるが、ペイントが開いてしまう
    Err.Clear: On Error GoTo 0              'エラー消去

End Sub

また他の方法を探してみまして、夜にでも報告いたします。

編集 削除
tt  2010-07-27 16:05:00  No: 102460  IP: [192.*.*.*]

>Dim ImgPath     As String               '画像ファイルフルパス
iPathの間違いでした…

編集 削除
魔界の仮面弁士  2010-07-27 17:06:29  No: 102461  IP: [192.*.*.*]

画像を直接埋め込む場合は、クリップボード経由にするのが簡単です。
WM_PASTE (= &H302) メッセージの送出のために API 宣言が必要ですけれどね
(もしくは SendKeys で代用)

  Clipboard.Clear
  Clipboard.SetData LoadPicture("C:\aaa.jpg")
  SendMessage RichTextBox1.hwnd, WM_PASTE, ByVal 0&, ByVal 0&


> vbCFFilesの属性で、リッチテキストに画像を表示させることはできるのでしょうか。
vbCFFiles(CF_HDROP) で得られるファイル名の一覧を取り出す方法について、
下記のメーリングリストで回答したことがあります。
10 年前の記事ですが、参考になれば。

http://w3.sfdata.ne.jp/ML/VB/msg02674.html

編集 削除
tt  2010-07-27 17:26:34  No: 102462  IP: [192.*.*.*]

>魔界の仮面弁士さん
いろいろありがとうございます。
試行錯誤の結果クリップボードからの貼り付け(Getdata)ができないため、クリップボードへ取得したデータを(ctrl + v) にて貼り付けるようにしました(と思ったら魔界の仮面弁士さんの返信が来ていたため、もう一度考えます…)。
魔界の仮面弁士さまが書いてくださったコードでどのような属性で取得されるのか確認しましたところ、こちらはBitmap属性(デバイスに依存しない属性でもありました)となっておりました。
今日はいろいろ勉強になりました。不明点はまだありますが、また調べていきたいと思います。
以下失敗コードです…

Private Sub Command1_Click()

   Dim Imgpath As String
   Call Rt1.LoadFile(Imgpath)  '文字化けして画像は表示されません

End Sub


Private Sub Command1_Click()

    Dim Imgpath As String

    Imgpath = App.Path & "\test.bmp"
    Clipboard.Clear
    Clipboard.SetData LoadPicture(Imgpath)
    Rt1 = Clipboard.GetData    '毎回違う数値が画面に表示されてしまう(画像は表示されない)

    Debug.Print "----------------"
    Debug.Print "File", Clipboard.GetFormat(vbCFFiles)         'File          False
    Debug.Print "TXT", Clipboard.GetFormat(vbCFText)           'TXT           False
    Debug.Print "RTF", Clipboard.GetFormat(vbCFRTF)            'RTF           False
    Debug.Print "BMP", Clipboard.GetFormat(vbCFBitmap)         'BMP           True
    Debug.Print "DIB", Clipboard.GetFormat(vbCFDIB)            'DIB           True
    Debug.Print "WMF", Clipboard.GetFormat(vbCFMetafile)       'WMF           False
    Debug.Print "EMF", Clipboard.GetFormat(vbCFEMetafile)      'EMF           False
    '以上から、クリップボード自体には画像データが入っていたため、クリップボードからの出力は
    'ctrl + c  キーで行うこととしました。
End Sub

③こちらで行くことにしました
Private Sub Command1_Click()

    Dim Imgpath As String

    Imgpath = App.Path & "\test.bmp"
    Clipboard.Clear
    Clipboard.SetData LoadPicture(Imgpath)

End Sub

返信が来ていたのも気づかずに書き込もうと思っていたため、中途半端な解決策となってしまいました。
教えていただいたことをよく調べて、実践していきたいと思います。
とりあえず、解決とさせていただきます。
ありがとうございました。

編集 削除
魔界の仮面弁士  2010-07-27 18:18:05  No: 102463  IP: [192.*.*.*]

> 以下失敗コードです…
失敗コードの動作について補足。

>  Call Rt1.LoadFile(Imgpath)  '文字化けして画像は表示されません
LoadFile に指定できるファイルは、
  rtfText 形式:テキストファイル(*.txt 等)
  rtfRTF  形式:リッチテキストファイル(*.rtf 等)
のいずれかです。画像ファイルを直接読み込むことはできません。

> Rt1 = Clipboard.GetData    '毎回違う数値が画面に表示されてしまう(画像は表示されない)
GetData メソッドの戻り値は Picture オブジェクトです。
(正確には、IPictureDisp インターフェイス)

上記は、
  Rt1.Text = CStr(Clipboard.GetData().Handle)
に相当するコードとして実行されることになります。

編集 削除
魔界の仮面弁士  2010-07-30 11:45:01  No: 102464  IP: [192.*.*.*]

> 下記のメーリングリストで回答したことがあります。
> 10 年前の記事ですが、参考になれば。
http://w3.sfdata.ne.jp/ML/VB/msg02674.html

個人情報(メールアドレス等)の保護ということで、
昨日付で公開中止になったようです。一応報告までに。
http://w3.sfdata.ne.jp/infomation/?tid=5

編集 削除