フォルダ選択ダイアログの初期フォルダについて

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: フォルダ選択ダイアログの初期フォルダについて

by てる » 2006年3月10日(金) 16:40

教えていただいたやり方で出来ました。
ありがとうございました。

by イグトランス » 2006年3月10日(金) 09:47

フォルダ選択ダイアログの場合は面倒でコールバック関数を用意しなければなりません。
コールバック関数の中で初期フォルダを指定する必要があります。

私はString型が好きなので戻り値としてパスを返すようにしました。
OpenFolderの2つ目の引数は初期フォルダを指定するようになっています。

コード: 全て選択

Const BFFM_INITIALIZED = 1
Const BFFM_SETSELECTIONA = WM_USER + 102
Const BFFM_SETSELECTION = BFFM_SETSELECTIONA

Function BrowseCallbackProc(hwnd As HWND, msg As DWord, lp As LPARAM, lpData As LPARAM) As LRESULT
	If msg = BFFM_INITIALIZED Then
		SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData) 'lpDataにはbi.lParamの内容(つまり初期フォルダへのポインタ)が入っている。
	End If
End Function

Typedef PIDLIST = VoidPtr

Function OpenFolder(hWnd As HWND, InitialFolder As BytePtr) As String
    Dim bi As BROWSEINFO
    Dim pidlBrowse As VoidPtr
    'BROWSEINFO構造体の初期化
    FillMemory(VarPtr(bi), Len(bi), 0)
    With bi
	    .hwndOwner=hWnd
	    .lpszTitle = "フォルダの選択"
	    .ulFlags = BIF_RETURNONLYFSDIRS or BIF_EDITBOX
		.lParam = InitialFolder As LPARAM
		.lpfn = AddressOf(BrowseCallbackProc)
    End With
    '「フォルダの参照」ダイアログボックスを表示
    pidlBrowse = SHBrowseForFolder(bi) As PIDLIST

    If pidlBrowse Then
        'フォルダへのパスを取得
		Dim folder[ELM(MAX_PATH)] As Byte
        SHGetPathFromIDList(pidlBrowse, folder)
        OpenFolder = folder
    Else
        OpenFolder = ""
    End If
End Function
BrowseCallbackProcがそのコールバック関数です。
ちなみにコールバック関数のhwndはもちろんフォルダ選択ダイアログのウィンドウハンドルです。

フォルダ選択ダイアログの初期フォルダについて

by てる » 2006年3月09日(木) 19:57

以下の関数でフォルダ選択のダイアログの表示までは出来たのですが、初期フォルダの設定方法がわかりません。

コード: 全て選択


Function OpenFolder(hWnd As HWND, lpFolder As BytePtr) As Long
	Dim bi As BROWSEINFO
	Dim pidlBrowse As VoidPtr
	'BROWSEINFO構造体の初期化
	FillMemory(VarPtr(bi),Len(bi),0)
	With bi
	.hwndOwner=hWnd
	.lpszTitle="フォルダの選択"
	.ulFlags=BIF_RETURNONLYFSDIRS or BIF_EDITBOX
	End With
	'「フォルダの参照」ダイアログボックスを表示
	pidlBrowse=SHBrowseForFolder(bi)

	If pidlBrowse Then
		'フォルダへのパスを取得(lpFolderポインタが示すバッファにコピー)
		SHGetPathFromIDList(pidlBrowse, lpFolder)
		GetFolderDlg=1
	Else
		GetFolderDlg=0
	End If
End Function
#フォルダのパスは関数の戻り値で返しちゃった方がいいでしょうか?

ページトップ