www.pudn.com > XRayImg.rar > BrowseDir.cpp


// BrowseDir.cpp: implementation of the CBrowseDir class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "BrowseDir.h" 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
int CBrowseDir::DoModal() 
{ 
	CWaitCursor wait; 
 
	BROWSEINFO bi; 
	RtlZeroMemory(&bi,sizeof(BROWSEINFO)); 
	bi.hwndOwner=m_dir.hOwnerWnd; 
	bi.ulFlags=m_dir.uFlag; 
	bi.pszDisplayName = m_dir.szDisplayName; 
	bi.lpszTitle=m_dir.lpszTitle; 
	if (m_dir.lpszInitDir || m_dir.bIncludeSubDir) 
	{ 
		bi.lParam=(LPARAM)&m_dir;//lParam传给回调函数中的lpData 
		bi.lpfn=BrowseCallbackProc; 
	} 
	 
	//调用浏览目录 
	ITEMIDLIST *pIDList = SHBrowseForFolder(&bi); 
 
	//确定选择的路径 
	if(pIDList) 
	{ 
		SHGetPathFromIDList(pIDList, m_dir.szPath); 
		LPMALLOC pMalloc=NULL; 
		if (SUCCEEDED(SHGetMalloc(&pMalloc))) 
		{ 
			pMalloc->Free(pIDList); 
			pMalloc->Release(); 
			return IDOK; 
		} 
	} 
	return IDCANCEL; 
} 
 
////////////////////////////////////////////////////////////////////// 
LRESULT CALLBACK CBrowseDir::Browse_WndProc(HWND hWnd,UINT uMsg, 
									   WPARAM wParam,LPARAM lParam) 
{ 
	CBrowseDir::struct_browsedir * lpDir; 
	lpDir=(CBrowseDir::struct_browsedir *)GetWindowLong(hWnd,GWL_USERDATA); 
	 
	//窗口快要摧毁了, 
	//赶紧看看有没有选中"包含子文件夹" 
	if (uMsg==WM_DESTROY ) 
	{ 
		lpDir->bIncludeSubDir=SendDlgItemMessage(hWnd,1000,BM_GETCHECK,0,0); 
	} 
	return ::CallWindowProc(lpDir->proc,hWnd,uMsg,wParam,lParam); 
} 
 
int CALLBACK CBrowseDir::BrowseCallbackProc(HWND hwnd,UINT uMsg, 
									   LPARAM lParam,LPARAM lpData) 
{	 
	if (uMsg==BFFM_INITIALIZED) 
	{ 
		CBrowseDir::struct_browsedir * lpDir; 
		lpDir=(CBrowseDir::struct_browsedir*)lpData;//看DoModal() 
		//设置初始目录 
		if (lpDir->lpszInitDir) 
			SendMessage(hwnd,BFFM_SETSELECTION,TRUE,(LPARAM)lpDir->lpszInitDir); 
		 
		//是否 支持包含子目录 
		if (lpDir->bIncludeSubDir) 
		{ 
			//创建一个Check按钮,ID为1000 
			CreateWindowEx(0,"button","包含子文件夹", 
				WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 
				5,5,100,20,hwnd,(HMENU)1000,::GetModuleHandle(0),0); 
 
			//用默认的GUI字体 
 
			SendDlgItemMessage(hwnd,1000,WM_SETFONT , 
				(WPARAM)GetStockObject(DEFAULT_GUI_FONT),TRUE ); 
 
			//由于默认的回调函数不能处理标准的消息 
			//所以必须改变窗体的回调函数 
			lpDir->proc=(WNDPROC)SetWindowLong(hwnd,GWL_WNDPROC,(LONG)Browse_WndProc); 
			 
			//OOP时代据说不兴用全局变量... 
			SetWindowLong(hwnd,GWL_USERDATA,(LONG)lpDir); 
		} 
	} 
	return TRUE; 
}