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

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
てる

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

#1 投稿記事 by てる »

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

コード: 全て選択


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
#フォルダのパスは関数の戻り値で返しちゃった方がいいでしょうか?
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

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

私は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はもちろんフォルダ選択ダイアログのウィンドウハンドルです。
てる

#3 投稿記事 by てる »

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