MDITextEditor.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:10k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // MDITextEditor.cpp : Defines the class behaviors for the application.
  2. //
  3. #include "stdafx.h"
  4. #include "MDITextEditor.h"
  5. #include "MainFrm.h"
  6. #include "ChildFrm.h"
  7. #include "MDITextEditorDoc.h"
  8. #include "MDITextEditorView.h"
  9. #ifdef _DEBUG
  10. #define new DEBUG_NEW
  11. #undef THIS_FILE
  12. static char THIS_FILE[] = __FILE__;
  13. #endif
  14. /////////////////////////////////////////////////////////////////////////////
  15. // CMDITextEditorApp
  16. BEGIN_MESSAGE_MAP(CMDITextEditorApp, CWinApp)
  17. //{{AFX_MSG_MAP(CMDITextEditorApp)
  18. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  19. ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
  20. ON_COMMAND(ID_FILE_SAVEALL, OnFileSaveAll)
  21. ON_COMMAND(ID_FILE_CLOSEALL, OnFileCloseAll)
  22. //}}AFX_MSG_MAP
  23. // Standard file based document commands
  24. ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
  25. ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
  26. // Standard print setup command
  27. ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
  28. END_MESSAGE_MAP()
  29. /////////////////////////////////////////////////////////////////////////////
  30. // CMDITextEditorApp construction
  31. CMDITextEditorApp::CMDITextEditorApp()
  32. : m_hMutex(NULL)
  33. , m_pMainFrame(0)
  34. , m_pDocTemplate(0)
  35. , m_bInsertKey(FALSE)
  36. , m_nFilterIndex(0)
  37. {
  38. // TODO: add construction code here,
  39. // Place all significant initialization in InitInstance
  40. }
  41. CMDITextEditorApp::~CMDITextEditorApp()
  42. {
  43. WriteProfileInt(XTP_EDIT_REG_SETTINGS,
  44. _T("FilterIndex"), m_nFilterIndex);
  45. WriteProfileString(XTP_EDIT_REG_SETTINGS,
  46. _T("InitialDir"), m_csInitialDir);
  47. if (m_hMutex)
  48. {
  49. ::ReleaseMutex(m_hMutex);
  50. m_hMutex = 0;
  51. }
  52. }
  53. /////////////////////////////////////////////////////////////////////////////
  54. // The one and only CMDITextEditorApp object
  55. CMDITextEditorApp theApp;
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CMDITextEditorApp initialization
  58. BOOL CMDITextEditorApp::InitInstance()
  59. {
  60. // only allow one instance of this application
  61. if (!CreateSingleInstance())
  62. return FALSE;
  63. AfxEnableControlContainer();
  64. CXTPWinDwmWrapper().SetProcessDPIAware();
  65. // Standard initialization
  66. // If you are not using these features and wish to reduce the size
  67. //  of your final executable, you should remove from the following
  68. //  the specific initialization routines you do not need.
  69. #if _MSC_VER <= 1200 // MFC 6.0 or earlier
  70. #ifdef _AFXDLL
  71. Enable3dControls(); // Call this when using MFC in a shared DLL
  72. #else
  73. Enable3dControlsStatic(); // Call this when linking to MFC statically
  74. #endif
  75. #endif
  76. OleInitialize(NULL);
  77. // Change the registry key under which our settings are stored.
  78. // TODO: You should modify this string to be something appropriate
  79. // such as the name of your company or organization.
  80. SetRegistryKey(_T("Codejock Software Sample Applications"));
  81. LoadStdProfileSettings();  // Load standard INI file options (including MRU)
  82. // Register the application's document templates.  Document templates
  83. //  serve as the connection between documents, frame windows and views.
  84. m_pDocTemplate = new CMultiDocTemplate(
  85. IDR_MDITEXTYPE,
  86. RUNTIME_CLASS(CMDITextEditorDoc),
  87. RUNTIME_CLASS(CChildFrame), // custom MDI child frame
  88. RUNTIME_CLASS(CMDITextEditorView));
  89. AddDocTemplate(m_pDocTemplate);
  90. // create main MDI Frame window
  91. m_pMainFrame = new CMainFrame;
  92. if (!m_pMainFrame->LoadFrame(IDR_MAINFRAME))
  93. return FALSE;
  94. m_pMainWnd = m_pMainFrame;
  95. m_pMainWnd->DragAcceptFiles();
  96. // Parse command line for standard shell commands, DDE, file open
  97. CCommandLineInfo cmdInfo;
  98. ParseCommandLine(cmdInfo);
  99. if (cmdInfo.m_nShellCommand == CCommandLineInfo::FileOpen)
  100. {
  101. // Process files list 
  102. for (int i = 1; i < __argc; i++)
  103. OpenDocumentFile(__targv[i]);
  104. }
  105. else
  106. {
  107. // Dispatch commands specified on the command line
  108. if (!ProcessShellCommand(cmdInfo))
  109. return FALSE;
  110. }
  111. // The main window has been initialized, so show and update it.
  112. m_pMainFrame->ShowWindow(m_nCmdShow);
  113. m_pMainFrame->UpdateWindow();
  114. // restore file open filter index.
  115. m_nFilterIndex = GetProfileInt(XTP_EDIT_REG_SETTINGS,
  116. _T("FilterIndex"), m_nFilterIndex);
  117. m_csInitialDir = GetProfileString(XTP_EDIT_REG_SETTINGS,
  118. _T("InitialDir"), m_csInitialDir);
  119. return TRUE;
  120. }
  121. // App command to run the dialog
  122. void CMDITextEditorApp::OnAppAbout()
  123. {
  124. CAboutDlg aboutDlg;
  125. aboutDlg.DoModal();
  126. }
  127. /////////////////////////////////////////////////////////////////////////////
  128. // CMDITextEditorApp message handlers
  129. BOOL CMDITextEditorApp::RegisterWindowClass()
  130. {
  131. WNDCLASS wndcls;
  132. if (!(::GetClassInfo(m_hInstance, CLASSNAME_APPINSTANCE, &wndcls)))
  133. {
  134. // otherwise we need to register a new class
  135. wndcls.style = CS_DBLCLKS;
  136. wndcls.lpfnWndProc = AfxWndProc;
  137. wndcls.cbClsExtra = wndcls.cbWndExtra = 0;
  138. wndcls.hInstance = m_hInstance;
  139. wndcls.hIcon = ::LoadIcon(m_hInstance, MAKEINTRESOURCE(IDR_MAINFRAME));
  140. wndcls.hCursor = ::LoadCursor(NULL, IDC_ARROW);
  141. wndcls.hbrBackground = NULL;
  142. wndcls.lpszMenuName = NULL;
  143. wndcls.lpszClassName = CLASSNAME_APPINSTANCE;
  144. if (!AfxRegisterClass(&wndcls))
  145. {
  146. AfxThrowResourceException();
  147. return FALSE;
  148. }
  149. }
  150. return TRUE;
  151. }
  152. BOOL CMDITextEditorApp::CreateSingleInstance()
  153. {
  154. // make the application a single instance, if the
  155. // mutex does not already exist register the window class
  156. // and open the first instance.
  157. m_hMutex = ::CreateMutex(NULL, FALSE, CLASSNAME_APPINSTANCE);
  158. if (::GetLastError() == ERROR_ALREADY_EXISTS)
  159. {
  160. // Reset our mutext handle (just in case)
  161. m_hMutex = 0;
  162. // The mutex already exists, which means an instance is already
  163. // running, get the window handle and bring it to the foreground. If
  164. // we could not find a valid handle, open the second instance.
  165. HWND hWnd = ::FindWindowEx(NULL, NULL, CLASSNAME_APPINSTANCE, NULL);
  166. if (::IsWindow(hWnd))
  167. {
  168. ::ShowWindow(hWnd, SW_RESTORE);
  169. ::BringWindowToTop(hWnd);
  170. ::SetForegroundWindow(hWnd);
  171. TCHAR szSharedData[_MAX_PATH];
  172. COPYDATASTRUCT copyData;
  173. copyData.dwData = cdwData_FileName;
  174. copyData.lpData = szSharedData;
  175. copyData.cbData = sizeof(szSharedData);
  176. // parse command line arguments.
  177. for (int i = 1; i < __argc; i++)
  178. {
  179. STRCPY_S(szSharedData, sizeof(szSharedData), __targv[i]);
  180. szSharedData[_MAX_PATH-1] = 0;
  181. ::SendMessage(hWnd, WM_COPYDATA, (WPARAM)0, (LPARAM)&copyData);
  182. }
  183. }
  184. return FALSE; // Return failure
  185. }
  186. return RegisterWindowClass();
  187. }
  188. BOOL CMDITextEditorApp::PreTranslateMessage(MSG* pMsg) 
  189. {
  190. if (pMsg->message == WM_KEYDOWN)
  191. {
  192. // Insert key pressed.
  193. if (pMsg->wParam == VK_INSERT)
  194. {
  195. m_bInsertKey = !m_bInsertKey;
  196. }
  197. }
  198. return CWinApp::PreTranslateMessage(pMsg);
  199. }
  200. void CMDITextEditorApp::UpdateAllViews(CView* pSender/*=NULL*/)
  201. {
  202. for (POSITION posDoc = m_pDocTemplate->GetFirstDocPosition(); posDoc;)
  203. {
  204. CXTPSyntaxEditDoc* pDoc = DYNAMIC_DOWNCAST(
  205. CXTPSyntaxEditDoc, m_pDocTemplate->GetNextDoc(posDoc));
  206. if (pDoc)
  207. pDoc->UpdateAllViews(pSender, xtpEditHintInitView);
  208. }
  209. }
  210. BOOL CMDITextEditorApp::ActivateExisting(const CString& csFilePath)
  211. {
  212. // try to find the document among existing ones
  213. POSITION posDoc = m_pDocTemplate->GetFirstDocPosition();
  214. while(posDoc)
  215. {
  216. // iterate next open document
  217. CDocument *pDoc = m_pDocTemplate->GetNextDoc(posDoc);
  218. // if docs names are the same
  219. if (pDoc && csFilePath.CompareNoCase(pDoc->GetPathName()) == 0)
  220. {
  221. // make existing view as active
  222. POSITION posView = pDoc->GetFirstViewPosition();
  223. if (posView)
  224. {
  225. CView *pView = pDoc->GetNextView(posView);
  226. if (pView)
  227. {
  228. CFrameWnd* pFrame = pView->GetParentFrame();
  229. if (pFrame)
  230. {
  231. pFrame->ActivateFrame();
  232. }
  233. }
  234. }
  235. return TRUE; // document found, end iteration
  236. }
  237. }
  238. return FALSE;
  239. }
  240. AFX_STATIC int AFX_CDECL GetStructSize()
  241. {
  242. OSVERSIONINFO ovi;
  243. ::ZeroMemory(&ovi, sizeof(OSVERSIONINFO));
  244. ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  245. ::GetVersionEx(&ovi);
  246. // Windows 2000 or newer OS, we can use newer file open dialog.
  247. if ((ovi.dwPlatformId >= VER_PLATFORM_WIN32_NT) && (ovi.dwMajorVersion >= 5))
  248. return sizeof(OPENFILENAME) + 12;
  249. // Use standard file open dialog.
  250. return sizeof(OPENFILENAME);
  251. }
  252. void CMDITextEditorApp::OnFileOpen() 
  253. {
  254. CString csFilter;
  255. csFilter.LoadString(IDS_FILE_OPEN_FILTER);
  256. DWORD dwOpenFlags = 
  257. OFN_HIDEREADONLY | 
  258. OFN_ALLOWMULTISELECT |
  259. OFN_PATHMUSTEXIST |
  260. OFN_FILEMUSTEXIST |
  261. OFN_ENABLESIZING;
  262. CFileDialog dlg(TRUE, NULL, NULL, dwOpenFlags, csFilter, NULL);
  263. dlg.m_ofn.lStructSize = GetStructSize();
  264. dlg.m_ofn.nFilterIndex = m_nFilterIndex;
  265. dlg.m_ofn.lpstrInitialDir = m_csInitialDir;
  266. if (dlg.DoModal() == IDOK)
  267. {
  268. for (POSITION pos = dlg.GetStartPosition(); pos;)
  269. {
  270. CString csFilePath(dlg.GetNextPathName(pos));
  271. if (!ActivateExisting(csFilePath))
  272. m_pDocTemplate->OpenDocumentFile(csFilePath);
  273. }
  274. m_nFilterIndex = dlg.m_ofn.nFilterIndex;
  275. m_csInitialDir = dlg.m_ofn.lpstrInitialDir;
  276. }
  277. }
  278. void CMDITextEditorApp::OnFileSaveAll() 
  279. {
  280. POSITION posDoc = m_pDocTemplate->GetFirstDocPosition();
  281. while (posDoc)
  282. {
  283. CDocument* pDoc = m_pDocTemplate->GetNextDoc(posDoc);
  284. if (pDoc->IsModified())
  285. {
  286. if (!pDoc->DoFileSave()) // error.
  287. break;
  288. }
  289. }
  290. }
  291. void CMDITextEditorApp::OnFileCloseAll() 
  292. {
  293. POSITION posDoc = m_pDocTemplate->GetFirstDocPosition();
  294. while (posDoc)
  295. {
  296. CDocument* pDoc = m_pDocTemplate->GetNextDoc(posDoc);
  297. if (pDoc->IsModified())
  298. {
  299. if (!pDoc->SaveModified()) // user canceled.
  300. break;
  301. }
  302. pDoc->OnCloseDocument();
  303. }
  304. }