VS2012下自定义打开文件对话框,MFC的CFileDialog封装了太多,太复杂,绕得头晕,自己封装一个得了
#pragma once #include <objbase.h> #include <commdlg.h> #include "ImagePreviewStatic.h" // XFileDialog class XFileDialog : public CWnd { DECLARE_DYNAMIC(XFileDialog) public: XFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs LPCTSTR lpszDefExt = NULL, LPCTSTR lpszFileName = NULL, DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, LPCTSTR lpszFilter = NULL, LPCTSTR lpszInitFolder = NULL, CWnd* pParentWnd = NULL); virtual ~XFileDialog(); public: void EndDialog(int nResult); virtual BOOL OnInitDialog(); virtual long DoModal(); virtual void DoDataExchange(CDataExchange *pDX); virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult); virtual void ProcFileChange(TCHAR* strFullName); protected: OPENFILENAME m_ofn; BOOL m_bOpenFileDialog; // TRUE for file open, FALSE for file save CString m_strFilter; // filter string TCHAR m_szFileTitle[64]; // contains file title after return TCHAR m_szFileName[_MAX_PATH]; // contains full path name after return CWnd* m_pParentWnd; // parent/owner window HWND m_hWndTop; // top level parent window (may be disabled) CImagePreviewStatic m_preview; DECLARE_MESSAGE_MAP() };
1 // XFileDialog.cpp : implementation file 2 // 3 4 #include "stdafx.h" 5 #include "XFileDialog.h" 6 #include "resource.h" 7 8 // XFileDialog 9 10 UINT_PTR CALLBACK OFNHookProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); 11 12 UINT_PTR CALLBACK OFNHookProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 13 { 14 if (hWnd == NULL) 15 return 0; 16 _AFX_THREAD_STATE* pThreadState = AfxGetThreadState(); 17 if (pThreadState->m_pAlternateWndInit != NULL && CWnd::FromHandlePermanent(hWnd) == NULL) 18 { 19 ASSERT_KINDOF(XFileDialog, pThreadState->m_pAlternateWndInit); 20 pThreadState->m_pAlternateWndInit->SubclassWindow(hWnd); 21 pThreadState->m_pAlternateWndInit = NULL; 22 } 23 24 if (message == WM_INITDIALOG) 25 { 26 /* 27 _afxMsgLBSELCHANGE = ::RegisterWindowMessage(LBSELCHSTRING); 28 _afxMsgSHAREVI = ::RegisterWindowMessage(SHAREVISTRING); 29 _afxMsgFILEOK = ::RegisterWindowMessage(FILEOKSTRING); 30 _afxMsgCOLOROK = ::RegisterWindowMessage(COLOROKSTRING); 31 _afxMsgHELP = ::RegisterWindowMessage(HELPMSGSTRING); 32 _afxMsgSETRGB = ::RegisterWindowMessage(SETRGBSTRING); 33 */ 34 35 XFileDialog* pDlg = DYNAMIC_DOWNCAST(XFileDialog, CWnd::FromHandlePermanent(hWnd)); 36 if (pDlg != NULL) 37 return pDlg->OnInitDialog(); 38 else 39 return 1; 40 } 41 42 return 0; 43 } 44 45 BEGIN_MESSAGE_MAP(XFileDialog, CWnd) 46 END_MESSAGE_MAP() 47 48 XFileDialog::XFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName, 49 DWORD dwFlags, LPCTSTR lpszFilter, LPCTSTR lpszInitFolder, CWnd* pParentWnd) : 50 CWnd() 51 { 52 m_szFileName[0] = '