@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

【VB6.0】Windowsエクスプローラのフォルダ表示方法制御について

1
投稿者投稿内容
ひな
会議室デビュー日: 2005/07/05
投稿数: 7
投稿日時: 2006-07-08 00:40
VB(VisualBasic6.0)でエクスプローラ(フォルダ)の表示方法
(縮小版、並べて表示、アイコン、一覧、詳細)を制御したいと思っています。
APIを一通り探してみましたが見つかりませんでした。
エクスプローラーのようなプログラムを作っているのではなく(ListViewなど)
実際のエクスプローラ(フォルダ)を操作する方法が知りたいです。
フォルダの表示方法の制御の仕方で何か方法があれば教えて頂きたいです。
(APIに限らず)
※VB6.0での方法をお願いします。

-----
フォルダを開く⇒[表示]⇒[縮小版]
上記の流れをVBで実現したいです。([縮小版]はWinXPのみ)
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2006-07-08 11:42
ひなさん、こんにちは。

単体のVB6だと判りませんが、VisualStudio 6.0 には Spy++ というツールが付属しています。
これを使って、フォルダの表示方法を切り替えた際に、該当するエクスプローラの ListView ウィンドウに対してどのようなメッセージが飛んでいるのかを観察します。
で、プログラムで同様の事を行うためには、該当するエクスプローラの ListView ウィンドウのハンドルを取得して、SendMessage で同じようにメッセージを送ってやれば良いような気がします。試してませんが。
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-07-08 12:12
とりあえず、COM Class はあるんですけど、IUnknown のみなんですよね。

IFolderView::SetCurrentViewMode Method

一応 Shell32.ShellFolderView にも CurrentViewMode property があるんですが、こっちはなぜか unsignedint 。なんじゃそれ。

ということで、type library 書いてやるとかしてやったほうがいいんじゃないかな?
ひな
会議室デビュー日: 2005/07/05
投稿数: 7
投稿日時: 2006-07-11 00:09
>きくちゃん様
ご返答ありがとうございます。
SendMessage でどのようにメッセージを送ればよいのかで
悩んでいます。。

>ちゃっぴ様
ご返答ありがとうございます。
勉強不足ですが、type library とは?が良くわかりませんでした。

道は険しいです(>_<)
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2006-07-11 06:21
引用:
勉強不足ですが、type library とは?が良くわかりませんでした。



VB であつかう object は COM class の object なんですが、実装している interface により大きくいって2種類あります。

1. IUnknown interface のみを実装している

2. IUnknown に加え IDispatch interface を実装している

VB6.0 で普通に扱えるのはこのうち 2 のみです。

で、1 の方は全く扱えないのかというとそうではなくて、type library というものを作ってやれば VB6.0 からでも扱えます。
# まあ、Win32API をゴリゴリと使って、COM method を呼び出す関数なんかを
# 作ってやれば type library を作ってやらなくてもできないことは無いけど・・・

で、type library を作成するには、ODL か IDL を使って書いたものを MKTYPLIB.exe か
MIDL.exe を利用して compile してやります。

Type Libraries and the Object Description Language (Component Automation)

ちなみに type library とは C(C++) の型を VB の型にどう当てはめるかを記したようなもんだと思ってください。

とはいえ、これも結構敷居が高いでしょうから。
お手軽な方法を見つけたので。

コード:
Enum FOLDERVIEWMODE
    FVM_ICON = 1
    FVM_SMALLICON = 2
    FVM_LIST = 3
    FVM_DETAILS = 4
    FVM_THUMBNAIL = 5
    FVM_TILE = 6
    FVM_THUMBSTRIP = 7
End Enum

' 参照 Microsoft Internet Controls
'      Microsoft Shell Controls And Automation
Sub OpenExplorer(path As String, ByVal viewMode As FOLDERVIEWMODE)
    Dim objExplorer     As SHDocVw.ShellBrowserWindow
    Dim objFolderView   As Object 'Shell32.ShellFolderView

    Set objExplorer = New SHDocVw.ShellBrowserWindow
    
    objExplorer.navigate path
    objExplorer.Visible = True
    Set objFolderView = objExplorer.document
    objFolderView.CurrentViewMode = viewMode
End Sub



Dim objFolderView As Object で宣言しているところがミソです。
Early binding だとこけます。
ひな
会議室デビュー日: 2005/07/05
投稿数: 7
投稿日時: 2006-07-12 10:19
>ちゃっぴ様
ありがとうございます。
実現が可能となりました!

他の方法で、sendmessageを使って実現することもできました。

'表示変更
Call SendMessage(obj.hwnd, &H111, &H702D, 0)

SendMessageの引数で、
第2引数は、WM_COMMANDです。
第3引数
&H7029・・・(大きい)アイコン
&H702A・・・(小さい)アイコン
&H702B・・・一覧
&H702C・・・詳細
&H702D・・・縮小版

本当に、ありがとうございました。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-07-12 21:27
引用:

他の方法で、sendmessageを使って実現することもできました。

'表示変更
Call SendMessage(obj.hwnd, &H111, &H702D, 0)

SendMessageの引数で、
第2引数は、WM_COMMANDです。
第3引数
&H7029・・・(大きい)アイコン
&H702A・・・(小さい)アイコン
&H702B・・・一覧
&H702C・・・詳細
&H702D・・・縮小版



こういった値は公に「仕様」として公開されているものではないので、要注意です。

固定値でないことがあるし、Windows のバージョンアップなどで変わることもあります。
1

スキルアップ/キャリアアップ(JOB@IT)