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(&amt;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)&amt;m_dir;//lParam传给回调函数中的lpData
bi.lpfn=BrowseCallbackProc;
}

//调用浏览目录
ITEMIDLIST *pIDList = SHBrowseForFolder(&amt;bi);

//确定选择的路径
if(pIDList)
{
SHGetPathFromIDList(pIDList, m_dir.szPath);
LPMALLOC pMalloc=NULL;
if (SUCCEEDED(SHGetMalloc(&amt;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;
}