KSFileDialog.cpp
上传用户:shilei2004
上传日期:2020-07-18
资源大小:83k
文件大小:8k
源码类别:

RichEdit

开发平台:

Visual C++

  1. // MyFileDialog.cpp : implementation file
  2. // Download by http://www.codefans.net
  3. #include "stdafx.h"
  4. #include "KSFileDialog.h"
  5. #ifdef AFX_AUX_SEG
  6. #pragma code_seg(AFX_AUX_SEG)
  7. #endif
  8. #ifdef _DEBUG
  9. #define new DEBUG_NEW
  10. #undef THIS_FILE
  11. static char THIS_FILE[] = __FILE__;
  12. #endif
  13. #include <dlgs.h>  
  14. #include <afxdlgs.h>  
  15. #include <commdlg.h>    // common dialog APIs
  16. #include <afxwin.h>
  17. //#include <afximpl.h>
  18. /////////////////////////////////////////////////////////////////////////////
  19. // CKSFileDialog
  20. #define _countof(array) (sizeof(array)/sizeof(array[0]))
  21. IMPLEMENT_DYNAMIC(CKSFileDialog, CFileDialog)
  22. CKSFileDialog::CKSFileDialog(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
  23. DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
  24. CFileDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
  25. {
  26.     m_ofn.Flags             = NULL;
  27. m_ofn.Flags = dwFlags;//|OFN_ENABLEHOOK;
  28. m_pMyParent=pParentWnd;
  29. m_pApp=NULL;
  30. m_pDoc=NULL;
  31. m_StrFilter.Empty();
  32. }
  33. BEGIN_MESSAGE_MAP(CKSFileDialog, CFileDialog)
  34. //{{AFX_MSG_MAP(CKSFileDialog)
  35. // NOTE - the ClassWizard will add and remove mapping macros here.
  36. //}}AFX_MSG_MAP
  37. END_MESSAGE_MAP()
  38. int CKSFileDialog::DoModal()
  39. {
  40. ASSERT_VALID(this);
  41. ASSERT_VALID(m_pMyParent);  //must set the parent window
  42. DWORD nOffset = lstrlen(m_ofn.lpstrFile)+1;
  43. memset(m_ofn.lpstrFile+nOffset, 0, (m_ofn.nMaxFile-nOffset)*sizeof(TCHAR));
  44. HWND hWndFocus = ::GetFocus();
  45. BOOL bEnableParent = FALSE;
  46. //m_ofn.hwndOwner = PreModal();
  47. CWnd dummy;
  48. dummy.CreateEx(WS_EX_TRANSPARENT,AfxRegisterWndClass(0, AfxGetApp()->LoadStandardCursor(IDC_ARROW)),NULL,NULL,CRect(0,0,0,0),(AfxGetMainWnd()),NULL);
  49. CRect rect;
  50. KSCenterWindow(dummy.GetSafeHwnd());
  51. dummy.GetWindowRect(rect);
  52. dummy.SetWindowPos(&wndTop, rect.left-230, rect.top-180, -1, -1,
  53. SWP_NOSIZE | /*SWP_NOZORDER |*/ SWP_NOACTIVATE);
  54. dummy.ShowWindow(SW_HIDE);
  55. m_ofn.hwndOwner=dummy.GetSafeHwnd();
  56. if (m_ofn.hwndOwner==NULL||m_pMyParent==NULL) m_ofn.hwndOwner=PreModal();
  57. if (m_ofn.hwndOwner != NULL && ::IsWindowEnabled(m_pMyParent->GetSafeHwnd()))
  58. {
  59. bEnableParent = TRUE;
  60. //::EnableWindow(m_ofn.hwndOwner, FALSE);
  61. ::EnableWindow(m_pMyParent->GetSafeHwnd(), FALSE);
  62. }
  63. _AFX_THREAD_STATE* pThreadState = AfxGetThreadState();
  64. ASSERT(pThreadState->m_pAlternateWndInit == NULL);
  65. m_ofn.lpfnHook = NULL;
  66. m_ofn.lpTemplateName = NULL;
  67. int nResult;
  68. if (m_bOpenFileDialog)
  69. nResult = ::GetOpenFileName(&m_ofn);
  70. else
  71. nResult = ::GetSaveFileName(&m_ofn);
  72. m_ofn.hwndOwner=AfxGetMainWnd()->GetSafeHwnd();
  73. if (nResult)
  74. ASSERT(pThreadState->m_pAlternateWndInit == NULL);
  75. pThreadState->m_pAlternateWndInit = NULL;
  76. // WINBUG: Second part of special case for file open/save dialog.
  77. if (bEnableParent)
  78. ::EnableWindow(m_pMyParent->GetSafeHwnd(), TRUE);
  79. if (::IsWindow(hWndFocus))
  80. ::SetFocus(hWndFocus);
  81. PostModal();
  82. return nResult ? nResult : IDCANCEL;
  83. }
  84. BOOL CKSFileDialog::DoPromptFileName(CString& fileName, UINT nIDSTitle, DWORD lFlags,
  85. BOOL bOpenFileDialog, CDocTemplate* pTemplate)
  86. {
  87. CString title;
  88. VERIFY(title.LoadString(nIDSTitle));
  89. if (m_pApp==NULL) {ASSERT (FALSE);} //set the m_pApp app point before you call this function
  90. ASSERT(m_pApp->m_pDocManager != NULL);
  91. m_ofn.Flags |= lFlags;
  92. CString strFilter;
  93. CString strDefault;
  94. if (nIDSTitle==AFX_IDS_SAVEFILE || nIDSTitle==AFX_IDS_SAVEFILECOPY)
  95. {
  96. POSITION pos = m_pApp->GetFirstDocTemplatePosition();
  97. BOOL bFirst = TRUE;
  98. while (pos != NULL)
  99. {
  100. CDocTemplate* pTemplate = (CDocTemplate*)m_pApp->GetNextDocTemplate(pos);
  101. AppendFilterSuffix(strFilter, m_ofn, pTemplate,
  102. bFirst ? &strDefault : NULL);
  103. bFirst = FALSE;
  104. }
  105. }
  106. else
  107. {
  108. if (m_StrFilter.GetLength()==0)
  109. strFilter = "Edit Files (*.edt)|*.edt";
  110. else
  111. strFilter = m_StrFilter;
  112. }
  113. m_ofn.nMaxCustFilter++;
  114. LPTSTR pch = strFilter.GetBuffer(0); // modify the buffer in place
  115. // MFC delimits with '|' not ''
  116. while ((pch = _tcschr(pch, '|')) != NULL)
  117. *pch++ = '';
  118. m_ofn.lpstrFilter = strFilter;
  119. m_ofn.lpstrTitle = title;
  120. m_ofn.lpstrFile = fileName.GetBuffer(_MAX_PATH);
  121. m_ofn.hwndOwner=m_pApp->m_pMainWnd->GetSafeHwnd() ;
  122. m_ofn.Flags&=OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY;//|OFN_ENABLEHOOK;
  123. int nResult = DoModal();
  124. fileName.ReleaseBuffer();
  125. return nResult == IDOK;
  126. }
  127. void CKSFileDialog::AppendFilterSuffix(CString& filter, OPENFILENAME& ofn,
  128. CDocTemplate* pTemplate, CString* pstrDefaultExt)
  129. {
  130. ASSERT_VALID(pTemplate);
  131. ASSERT_KINDOF(CDocTemplate, pTemplate);
  132. CString strFilterExt, strFilterName;
  133. if (pTemplate->GetDocString(strFilterExt, CDocTemplate::filterExt) &&
  134.  !strFilterExt.IsEmpty() &&
  135.  pTemplate->GetDocString(strFilterName, CDocTemplate::filterName) &&
  136.  !strFilterName.IsEmpty())
  137. {
  138. // a file based document template - add to filter list
  139. ASSERT(strFilterExt[0] == '.');
  140. if (pstrDefaultExt != NULL)
  141. {
  142. // set the default extension
  143. *pstrDefaultExt = ((LPCTSTR)strFilterExt) + 1;  // skip the '.'
  144. ofn.lpstrDefExt = (LPTSTR)(LPCTSTR)(*pstrDefaultExt);
  145. ofn.nFilterIndex = ofn.nMaxCustFilter + 1;  // 1 based number
  146. }
  147. // add to filter
  148. filter += strFilterName;
  149. ASSERT(!filter.IsEmpty());  // must have a file type name
  150. filter += (TCHAR)'';  // next string please
  151. filter += (TCHAR)'*';
  152. filter += strFilterExt;
  153. filter += (TCHAR)'';  // next string please
  154. ofn.nMaxCustFilter++;
  155. }
  156. }
  157. void CKSFileDialog::SetAppPointer(CWinApp *pApp)
  158. {
  159. m_pApp=pApp;
  160. }
  161. BOOL CKSFileDialog::DoSave(LPCTSTR lpszPathName, BOOL bReplace)
  162. {
  163. if (m_pDoc==NULL){ASSERT (FALSE);return FALSE;}
  164. CString newName = lpszPathName;
  165. if (newName.IsEmpty())
  166. {
  167. CDocTemplate* pTemplate = m_pDoc->GetDocTemplate();
  168. ASSERT(pTemplate != NULL);
  169. newName = m_pDoc->GetPathName();
  170. if (bReplace && newName.IsEmpty())
  171. {
  172. newName = m_pDoc->GetTitle();
  173. // check for dubious filename
  174. int iBad = newName.FindOneOf(_T(" #%;/\"));
  175. if (iBad != -1)
  176. newName.ReleaseBuffer(iBad);
  177. // append the default suffix if there is one
  178. CString strExt;
  179. if (pTemplate->GetDocString(strExt, CDocTemplate::filterExt) &&
  180.   !strExt.IsEmpty())
  181. {
  182. ASSERT(strExt[0] == '.');
  183. newName += strExt;
  184. }
  185. }
  186. if (!(DoPromptFileName(newName,bReplace ? AFX_IDS_SAVEFILE : AFX_IDS_SAVEFILECOPY,
  187.   OFN_PATHMUSTEXIST|OFN_HIDEREADONLY, FALSE, pTemplate)))
  188. return FALSE;       // don't even attempt to save
  189. }
  190. CWaitCursor wait;
  191. if (!m_pDoc->OnSaveDocument(newName))
  192. {
  193. if (lpszPathName == NULL)
  194. {
  195. // be sure to delete the file
  196. TRY
  197. {
  198. CFile::Remove(newName);
  199. }
  200. CATCH_ALL(e)
  201. {
  202. TRACE0("Warning: failed to delete file after failed SaveAs.n");
  203. do { e->Delete(); } while (0);
  204. }
  205. END_CATCH_ALL
  206. }
  207. return FALSE;
  208. }
  209. // reset the title and change the document name
  210. if (bReplace)
  211. m_pDoc->SetPathName(newName);
  212. return TRUE;        // success
  213. }
  214. void CKSFileDialog::SetDocumentPointer(CDocument *pDoc)
  215. {
  216. m_pDoc=pDoc;
  217. }
  218. void CKSFileDialog::SetStringFilter(LPCSTR filter)
  219. {
  220. m_StrFilter=filter;
  221. }
  222. void CKSFileDialog::SetMyParent(CWnd *pwnd)
  223. {
  224. m_pMyParent=pwnd;
  225. }
  226. void CKSFileDialog::KSCenterWindow(HWND hWnd)
  227. {
  228. RECT rcWnd;
  229. ::GetWindowRect(hWnd,&rcWnd);
  230. rcWnd.left=((GetSystemMetrics(SM_CXSCREEN)-(rcWnd.right-rcWnd.left))/2);
  231. rcWnd.top=((GetSystemMetrics(SM_CYSCREEN)-(rcWnd.bottom-rcWnd.top))/2);
  232. ::SetWindowPos(hWnd,NULL,rcWnd.left,rcWnd.top,0,0,SWP_NOSIZE|SWP_NOZORDER|
  233. SWP_NOACTIVATE);
  234. }