パス選択ダイアログの入手方法

3410 ワード

1、具体的な手順はコードを参照してください.
2,キーデフォルトパスの設定.
3,BROWSEINFO構造紹介
Visual C++(VC)では,BROWSEINFO構造にユーザがディレクトリを選択した重要な情報が含まれている.
1、定義
typedef struct_browseinfo
{
HWND hwndOwner;//フォルダダイアログボックスの親フォームハンドルの参照
LPCITEMIDLIST pidlRoot;
//ITEMIDLIST構造のアドレスで、ブラウズ時の初期ルートディレクトリを含み、
//指定されたディレクトリとそのサブディレクトリのみがフォルダの参照ダイアログに表示されます.
//このメンバー変数はNULLであり、デスクトップディレクトリで使用されます.
LPSTR pszDisplayName;
//ユーザーが選択したディレクトリ文字列を保存するメモリアドレス.このバッファのサイズはデフォルトで定義されたMAX_です.PATH定数マクロ.
LPCSTR lpszTitle;//フォルダダイアログの表示テキストを参照
UINT ulFlags;
//このフラグビットには、ダイアログボックスのオプションが記載されています.0でもよいし、次の定数の任意の組み合わせでもよい.
 //BIF_BROWSEFORCOMPUTER:コンピュータ名を返します.ユーザーがブラウザのコンピュータ名を選択しない限り、ダイアログボックスの「OK」ボタンはグレーです.
 //BIF_BROWSEFORRINTER:プリンタ名を返します.プリンタ名が選択されていない限り、「OK」ボタンはグレーです.
 //BIF_BROWSEINCLUDEFILES:ブラウザにディレクトリが表示され、ファイルも表示されます.
 //BIF_DONTGOBELOWDOMAIN:ツリーウィンドウにドメイン名の下にあるネットワークディレクトリ構造は含まれません.
 //BIF_EDITBOX:ブラウズダイアログには、ユーザーが選択したアイテムの名前を入力できる編集ボックスが含まれています.
//BIF_RETURNEFSANCESTORS:ファイルシステムのノードを返します.当選したノードが有意義な場合のみ、「OK」ボタンを使用できます.
//BIF_RETURONLYFSDIRS:ファイルシステムのディレクトリのみを返します.たとえば、フォルダをブラウズするダイアログボックスで、いずれかのディレクトリを選択すると「OK」ボタンが使用可能になり、「マイコンピュータ」や「ネット上の隣人」などの意味のないノードを選択すると「OK」ボタンはグレーになります.
//BIF_STATUSTEXT:ダイアログボックスにステータス領域が含まれます.ダイアログボックスにメッセージを送信することで、コールバック関数にステータステキストを設定します.
//BIF_VALLIDATE:BIFがない場合EDITBOXフラグビットの場合、そのフラグビットは無視される.ユーザが編集ボックスに入力した名前が不正である場合、ブラウズダイアログはBFFM_を送信するVALLIDATEFAILEDメッセージはコールバック関数に与えられる.
BFFCALLBACK lpfn;
LPARAM lParam;
int iImage;
}BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;
コード・セグメントを指定します.

int CALLBACK BrowseCallbackProc(HWND hwnd,
								UINT uMsg,
								LPARAM lParam,
								LPARAM lpData
								)
{
	wchar_t szPath[MAX_PATH];

	switch(uMsg)
	{
	case BFFM_INITIALIZED:
		SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
		break;

	case BFFM_SELCHANGED:
		if (SHGetPathFromIDList((LPITEMIDLIST) lParam ,szPath))
		{
			SendMessage(hwnd, BFFM_SETSTATUSTEXT,0,(LPARAM)szPath); 

		}
		break;
	}
	return   0;  
}


//        
void Cibm_testDlg::OnBnClickedButtonBrowse()
{
	// TODO: Add your control notification handler code here

	BROWSEINFO bi;
	memset(&bi,0,sizeof(BROWSEINFO));
	bi.lpszTitle = _T("     ");
	bi.lpfn = BrowseCallbackProc; //      
	bi.lParam = (LPARAM)(LPCTSTR)outPutPath;
	bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;

	//Displays a dialog box that enables the user to select a Shell folder.
	//    LPITEMIDLIST,   BROWSEINFO    
	LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );
	if ( pidl != 0 )
	{
		// get the name of the folder
		TCHAR path[MAX_PATH]; //       
		//                    
		if ( SHGetPathFromIDList ( pidl, path ) )
		{
			outPutPath.Format(_T("%s"),path);
			if(outPutPath.GetAt(outPutPath.GetLength()-1)!=_T('\\'))
				outPutPath.AppendChar(_T('\\'));
			UpdateData(FALSE);
		}

		// free memory used
		IMalloc * imalloc = 0;
		if ( SUCCEEDED( SHGetMalloc ( &imalloc )) )
		{
			imalloc->Free ( pidl );
			imalloc->Release ( );
		}
	} 
}