由于需要,需要对选择的文件路径进行判断,如不能是C盘下的文件。可在CFileDialog的m_ofn.lpfnHook指定Hook函数。
下面是一个拒绝选择的文件是C:/下的。
UINT_PTR CALLBACK MyOFNHookProc( HWND hdlg, // handle to child dialog box
UINT uiMsg, // message identifier
WPARAM wParam, // message parameter
LPARAM lParam // message parameter
)
{
int nResult = FALSE;
switch(uiMsg)
{
case WM_NOTIFY:
{
LPOFNOTIFY pOfn = (LPOFNOTIFY)lParam;
switch(pOfn->hdr.code)
{
case CDN_FILEOK:
{//need to return nozero value //注意,CDN_FILEOK一定要返回非0值
char szFolder[MAX_PATH];
CommDlg_OpenSave_GetFolderPath(GetParent(hdlg), szFolder, MAX_PATH);
CString strFolder(szFolder);
if (strFolder == "C://")
{
//return nozero and SetWindowLong function to set a
//nonzero DWL_MSGRESULT value to reject the file name.
SetWindowLong(hdlg, DWL_MSGRESULT, 1); //该句不能少,否则不能拒绝该选择
}
nResult = TRUE;
break;
}
default:
break;
}
break;
}
default:
break;
}
return nResult;
}
调用CFileDialog功能的代码:
CFileDialog wndFileDlg(TRUE);
wndFileDlg.m_ofn.Flags = OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY | OFN_FILEMUSTEXIST | OFN_NOCHANGEDIR;
wndFileDlg.m_ofn.hInstance = g_hInstance;
wndFileDlg.m_ofn.lpstrFilter = "JPG Files (*.jpg)/0*.jpg/0";
wndFileDlg.m_ofn.lpfnHook = (LPOFNHOOKPROC)ImgOFNHookProc;
wndFileDlg.m_ofn.lpstrFile = new TCHAR[INT_MULTI_SELECT_FILE_BUF_MAX_SIZE];
ZeroMemory(wndFileDlg.m_ofn.lpstrFile, INT_MULTI_SELECT_FILE_BUF_MAX_SIZE);
wndFileDlg.m_ofn.nMaxFile = INT_MULTI_SELECT_FILE_BUF_MAX_SIZE;
strTmp = CLoadIdString::LoadIdStr(IDS_SELECT_IMPORT_IMG, g_hResource);
wndFileDlg.m_ofn.lpstrTitle = strTmp;
wndFileDlg.DoModal();
上面代码可用。但是自己在写这个的时候,写switch(pOfn->hdr.code)时,一时大意 忘记写default分支了,导致在wndFileDlg.DoModal();的时候出错,找了半天,郁闷。。
若要实现在打开文件对话框上实现图象预览的功能,请参考如下文章:
http://www.vckbase.com/document/viewdoc/?id=1419
不若该文的源码有问题,在选中一个文件,然后点击OK时,会core dump