自定义文件打开对话框有关问题

自定义文件打开对话框问题
因为想要在windows默认文件打开对话框上加一个BUTTON所以就继承了CFileDialog参照别人的写了个CFileDialogEx,界面实现没什么问题,现在的问题是怎么相应windows打开对话框上的原有"打开"消息啊,本来我打算在钩子函数中相应CDN_FILEOK消息,相应后关闭对话框再把打开的文件名SEND到主窗口,但是一点"打开"总是出错。。。谁能告诉我该怎么做啊,是不是我的思路就是有错误啊,主要代码如下 

XXXdlg中调用改文件对话框
C/C++ code
...
char szFileFilter[]= "AVI File(*_front.avi)|*_front.avi|";
CFileDialogEx dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);
dlg.m_ofn.lpstrInitialDir = strTempDirver;
dlg.m_ofn.lStructSize = nStructSize; 
if (dlg.DoModal () == IDOK) //这里的写法好像不对,不能返回IDOK吧
{
...
}
...

 


CFileDialogEx构造函数中 
C/C++ code
... 
m_ofn.lpfnHook =  (LPOFNHOOKPROC)ComDlgPreviewProc; 
... 

钩子 
C/C++ code

LRESULT CALLBACK ComDlgPreviewProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) 
switch (uMsg) 
{ 
case WM_INITDIALOG:  
                  ... 
case WM_DESTROY: 
                ... 
case WM_COMMAND: 

if((HIWORD(wParam) == BN_CLICKED) && (LOWORD(wParam) == IDC_SEARCH)) 
{   
                ... 
} 
if(LOWORD(wParam) == IDOK) 
{ 
} 
break; 

case WM_NOTIFY: 
HandleNotify(hDlg, (LPOFNOTIFY)lParam); //在这个函数中捕捉相应消息 
break; 
default: 
return FALSE; 
} 
return TRUE; 
} 


C/C++ code
BOOL NEAR CALLBACK HandleNotify(HWND hDlg, LPOFNOTIFY pofn) 
{ 
CFileDialogEx dlg(TRUE); 

switch (pofn->hdr.code) 
{ 
case CDN_SELCHANGE: 
.... 
case CDN_FILEOK: //捕捉"open"文件消息 

HWND cWnd = GetActiveWindow(); 
        HWND pWnd = AfxGetApp()->m_pMainWnd->m_hWnd; 
CString csFilePath; 
csFilePath = dlg.GetPathName(); 
::SendMessage(cWnd,WM_SYSCOMMAND,SC_CLOSE,0); 
return TRUE;//执行完了就出错了 
//::SendMessage(pWnd,WM_MY_MESSAGE,TRUE,(LPARAM)(&csFilePath)); 
break; 

} 

return(TRUE); 
} 


------解决方案--------------------
看看这几个,你就会发现解决这个问题很方便了
http://www.vckbase.com/document/viewdoc/?id=1419
http://www.vckbase.com/document/viewdoc/?id=417
http://www.codeproject.com/dialog/imagepreviewdialog.asp
http://www.vccode.com/file_show.php?id=891
http://www.vccode.com/file_show.php?id=895
------解决方案--------------------
这个我有一个重写了CFileDialog的类,你可以直接用,可以同时选择文件和文件夹,点击OK的时候,会列出选中的文件或者文件夹的全路径。可能会对你有所帮助:

// CNewFileDialog.h 
#pragma once
#include <Dlgs.h>


// CNewFileDialog

class CNewFileDialog : public CFileDialog
{
DECLARE_DYNAMIC(CNewFileDialog)

public:
CNewFileDialog(BOOL bOpenFileDialog=TRUE, // TRUE for FileOpen, FALSE for FileSaveAs
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT | OFN_ALLOWMULTISELECT | OFN_EXPLORER & (~OFN_SHOWHELP),
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL);
virtual ~CNewFileDialog();

protected:
DECLARE_MESSAGE_MAP()
virtual void OnInitDone();
virtual void OnFolderChange();
virtual BOOL OnFileNameOK();
static LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
public:
static CString m_strCurrentDirectory;
static CStringArray m_strArrayItemList;
static WNDPROC m_wndProc;
};


-----------------------------------------------------------
//NewFileDialog.cpp


#include "stdafx.h"