VB6SP6、WindowsXPで開発を行っています。
フォルダ選択画面の説明文にUnicode文字を表示したいのですが、
うまくいきません。
わかる方いらっしゃいましたら、教えてください。
質問ばかりですみません。
フォルダ選択ダイアログのUnicodeフォルダパスの取得についての質問
でStringではなく、Byteを使用するということを教えていただいたので
応用してやってみたのですが、表示すると下記のような説明文が表示
されてしまいます。
%s
更新日時:%s
下記がやってみたコードです。
'ブラウザ情報構造体
Private Type BROWSEINFO
hWndOwner As Long
pidlRoot As Long
pszDisplayName As Byte
lpszTitle As Byte
ulFlags As Long
lpfn As Long
lParam As Byte
iImage As Long
End Type
Dim abytTitle() As Byte
Dim abytDisplayName() As Byte
Dim lngpid As Long
ReDim abytDisplayName(0 To 259) As Byte
abytTitle = vstrCaption & vbNullChar ' 表示する説明文
With typBinfo
.hWndOwner = vlngOwnerHwnd ' 親のウィンドウハンドル
.pidlRoot = 0
.pszDisplayName = abytDisplayName(0&)
.lpszTitle = abytTitle(0&) ' 表示する説明文
.ulFlags = vlngFlags
End With
' フォルダー選択ダイアログを表示
lngpid = SHBrowseForFolder(typBinfo)
どこで見たのか知りませんが
Private Type BROWSEINFO
hWndOwner As Long
pidlRoot As Long
pszDisplayName As Byte
lpszTitle As Byte
ulFlags As Long
lpfn As Long
lParam As Byte
iImage As Long
End Type
これ無茶苦茶ですよ。
すみません。途中で送信してしまいました。
独学もいいけど、せっかくネットができる環境なんだから
検索しましょう。
サンプルは山ほどありますよ。
http://www.google.com/search?num=50&hl=ja&q=VB+BROWSEINFO&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja
回答ありがとうございます。
あっきーさんの言われた、URLの1番最初のリンクおよび
2番目のリンクのページをみたのですが、こちらのサンプルソース
ですと、説明文に日本語は表示できるみたいですが、
中国語・タイ語は表示できないみたいです。
私がやりたいのは、Unicode文字(中国語・タイ語)を表示したいのです。
例えば、เปลี่ยน のような文字とかです。
よろしくお願いします。
pszDisplayNameとlpszTitleはAs Longで。
lParamもインスタンスに関連付けないのならばAs Longが無難かと。
# 関連付けてもObjPtrがあるからAs Longで行けますし。
んで、前回の応用でこんな感じでは。
Dim uInfo As BROWSEINFO
Dim abDisplayName() As Byte
Dim abTitle() As Byte
Dim sDisplayName As String
Dim sTitle As String
' この段階でsDisplayNameとsTitleには有効な文字列が
' 格納されるとする。
abDisplayName = sDisplayName & vbNullChar
abTitle = sTitle & vbNullChar
ReDim Preserve abDisplayName(0& To 519&) As Byte
' 文字列の長さがMAX_PATH(260)であるとされる(MSDNより)から。
uInfo.pszDisplayName = VarPtr(abDisplayName(0&))
uInfo.abTitle = VarPtr(abTitle(0&))
' ここでSHBrowseForFolderを呼んでいるとする。
sDisplayName = abDisplayName & vbNullChar
' ここでvbNullChar以下を切り捨てる処理。
回答ありがとうございます。
すごい!!できました!!
K.J.K.さん とても詳しいですね。
恥ずかしながらVarPtr関数というものを知りませんでした・・。
VarPtrをMSDNライブラリで検索してみたんですが、載ってないし・・^^;
HPで検索したら、変数のアドレスを取得する関数というので見つかりました。
大変勉強になりました。
ありがとうございました。
解決ということで、下記にソースコードを掲載しておきます。
'フォルダ選択ダイアログを表示
Private Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolderW" (lpbi As BROWSEINFO) As Long
'ブラウザ情報構造体
Private Type BROWSEINFO
hWndOwner As Long
pidlRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Dim typBinfo As BROWSEINFO ' フォルダ情報構造体
Dim abTitle() As Byte ' タイトル
Dim abDispName() As Byte ' 表示名称
abDispName = vbNullChar
ReDim Preserve abDispName(0& To 519&) As Byte
' 説明文を設定
abTitle = vstrCaption & vbNullChar
'BROWSEINFO 構造体設定
With typBinfo
.hWndOwner = vlngOwnerHwnd ' 親ウィンドウのハンドル
.pszDisplayName = VarPtr(abDispName(0&))
.lpszTitle = VarPtr(abTitle(0&))
.ulFlags = vlngFlags
End With
' フォルダー選択ダイアログを表示
lngpid = SHBrowseForFolder(typBinfo)
ツイート | ![]() |