初めまして。
初心者過ぎてコードも1行も書いていないのにつまずいてしまいました。
windows7 64bit home 上で vb6 sp6 pro を使用してプログラムを作っていたところ、リッチテキストへの画像(ビットマップ)の表示がされないため、どうして表示できないのか悩んでしまいました。
元画像をコピー(Ctrl + C)し、リッチテキスト上にてペースト(Ctrl + V)しても画像のアイコンのショートカットが表示されてしまいます。
以下のようにすれば問題なく表示されるのですが…
1,windows付属のワードパッドを開く
2,ワードパットに画像を貼り付ける(正常にコピペできます)
3,ワードパット上の貼り付けた画像をコピーする
4,リッチテキスト上にペーストする
5,正常に表示される
ワードパット上でのコピーでは問題ないのにフォルダーからのコピーでは表示できない理由はなんなのでしょうか。
また、解決策をご教授願えたらと思います。
> フォルダーからのコピーでは表示できない理由はなんなのでしょうか。
データをコピーしているか、ファイル情報をコピーしているかの違いです。
これは画像で無くとも、テキストやリッチテキストであっても同様です。
たとえば文字列そのものをコピーすれば、RichTextBox には文字列として貼り付きますが、
*.txt ファイルをコピーすれば、ファイルへのショートカット情報を持った
オブジェクト パッケージャとして貼り付けられる事になります。
素早い返信ありがとうございます。
>たとえば文字列そのものをコピーすれば、RichTextBox には文字列として貼り付きますが、
*.txt ファイルをコピーすれば、ファイルへのショートカット情報を持った
オブジェクト パッケージャとして貼り付けられる事になります。
という事は、とあるディレクトリ上の画像ファイルをそのままリッチテキストボックスに貼り付けたい場合は、OLEオブジェクトを介して貼り付けないと表示できないということでしょうか(image = Clipboard.GetData のようにしないといけない?)。
とりあえずクリップボード経由で表示できるかどうか確認してみます。
> とりあえずクリップボード経由で表示できるかどうか確認してみます。
エクスプローラからのコピーも、画像データのコピーも、テキストデータのコピーも、
いずれもクリップボードを経由しています。
下記のコードを実行して、現在、クリップボード内に
どのような形式のデータが渡されているのかを確認してみください。
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
>どのような形式のデータが渡されているのかを確認してみください。
ただ今確認いたしました。
→ディレクトリ内のファイルをそのままコピーした場合…
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
また他の方法を探してみまして、夜にでも報告いたします。
>Dim ImgPath As String '画像ファイルフルパス
iPathの間違いでした…
画像を直接埋め込む場合は、クリップボード経由にするのが簡単です。
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
>魔界の仮面弁士さん
いろいろありがとうございます。
試行錯誤の結果クリップボードからの貼り付け(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
返信が来ていたのも気づかずに書き込もうと思っていたため、中途半端な解決策となってしまいました。
教えていただいたことをよく調べて、実践していきたいと思います。
とりあえず、解決とさせていただきます。
ありがとうございました。
> 以下失敗コードです…
失敗コードの動作について補足。
> Call Rt1.LoadFile(Imgpath) '文字化けして画像は表示されません
LoadFile に指定できるファイルは、
rtfText 形式:テキストファイル(*.txt 等)
rtfRTF 形式:リッチテキストファイル(*.rtf 等)
のいずれかです。画像ファイルを直接読み込むことはできません。
> Rt1 = Clipboard.GetData '毎回違う数値が画面に表示されてしまう(画像は表示されない)
GetData メソッドの戻り値は Picture オブジェクトです。
(正確には、IPictureDisp インターフェイス)
上記は、
Rt1.Text = CStr(Clipboard.GetData().Handle)
に相当するコードとして実行されることになります。
> 下記のメーリングリストで回答したことがあります。
> 10 年前の記事ですが、参考になれば。
> http://w3.sfdata.ne.jp/ML/VB/msg02674.html
個人情報(メールアドレス等)の保護ということで、
昨日付で公開中止になったようです。一応報告までに。
http://w3.sfdata.ne.jp/infomation/?tid=5