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

对话框与窗口

开发平台:

Visual C++

  1. // MSDI.cpp
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. /*********************************************************
  21. * Multithreaded SDI Application
  22. * Version: 1.4
  23. * Date: January 3, 2002
  24. * Autor: Michal Mecinski
  25. * E-mail: mimec@mimec.w.pl
  26. * WWW: http://www.mimec.w.pl
  27. *
  28. * Copyright (C) 2002-03 by Michal Mecinski
  29. *********************************************************/
  30. #include "stdafx.h"
  31. #include <afxpriv.h>
  32. #include <dde.h>
  33. #include "MSDI.h"
  34. #include "MSDIDocManager.h"
  35. #include "MSDIThread.h"
  36. #include "AboutDlg.h"
  37. #ifdef _DEBUG
  38. #define new DEBUG_NEW
  39. #undef THIS_FILE
  40. static char THIS_FILE[] = __FILE__;
  41. #endif
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CMSDIApp
  44. BEGIN_MESSAGE_MAP(CMSDIApp, CWinApp)
  45. //{{AFX_MSG_MAP(CMSDIApp)
  46. ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
  47. ON_COMMAND(ID_APP_EXIT, OnAppExit)
  48. //}}AFX_MSG_MAP
  49. // Standard file based document commands
  50. ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
  51. ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
  52. // Standard print setup command
  53. ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
  54. // Handle thread messages
  55. ON_THREAD_MESSAGE(MSDIM_EXIT_THREAD, OnExitThread)
  56. ON_THREAD_MESSAGE(MSDIM_NEW_INSTANCE, OnNewInstance)
  57. END_MESSAGE_MAP()
  58. /////////////////////////////////////////////////////////////////////////////
  59. // CMSDIApp construction
  60. CMSDIApp::CMSDIApp()
  61. {
  62. m_pFrameWnd = NULL;
  63. m_fCommand = 0;
  64. EnableManifestEditor();
  65. }
  66. /////////////////////////////////////////////////////////////////////////////
  67. // The one and only CMSDIApp object
  68. CMSDIApp theApp;
  69. /////////////////////////////////////////////////////////////////////////////
  70. // CMSDIApp initialization
  71. BOOL CMSDIApp::InitInstance()
  72. {
  73. if (!ParseCommandLine())
  74. return FALSE;
  75. if (IsAlreadyRunning(_T("Unique App Name")))
  76. return FALSE;
  77. SetRegistryKey(_T("Codejock Software Sample Applications"));
  78. LoadStdProfileSettings();
  79. m_pDocManager = new CMSDIDocManager;
  80. EnableShellOpen();
  81. if (!ProcessShellCommand())
  82. return FALSE;
  83. return TRUE;
  84. }
  85. // App command to run the dialog
  86. void CMSDIApp::OnAppAbout()
  87. {
  88. CAboutDlg dlgAbout;
  89. dlgAbout.DoModal();
  90. }
  91. /////////////////////////////////////////////////////////////////////////////
  92. // CMSDIApp message handlers
  93. int CMSDIApp::Run()
  94. {
  95. return CWinThread::Run();
  96. }
  97. int CMSDIApp::ExitInstance()
  98. {
  99. if (m_pFrameWnd)
  100. m_pFrameWnd->DestroyWindow();
  101. if (m_pDocManager)
  102. ((CMSDIDocManager*)m_pDocManager)->KillAllThreads();
  103. SaveStdProfileSettings();
  104. return 0;
  105. }
  106. void CMSDIApp::OnExitThread(WPARAM pThread, LPARAM)
  107. {
  108. ((CMSDIDocManager*)m_pDocManager)->OnExitThread((CMSDIThread*)pThread);
  109. }
  110. void CMSDIApp::OnNewInstance(WPARAM nFileOpen, LPARAM)
  111. {
  112. if (nFileOpen)
  113. {
  114. TCHAR szBuf[MAX_PATH];
  115. if (GlobalGetAtomName((ATOM)nFileOpen, szBuf, sizeof(szBuf)))
  116. OpenDocumentFile(szBuf);
  117. GlobalDeleteAtom((ATOM)nFileOpen);
  118. }
  119. else
  120. OnFileNew();
  121. }
  122. BOOL CMSDIApp::ParseCommandLine()
  123. {
  124. for (int i=1; i < __argc; i++)
  125. {
  126. LPCSTR lpszParam = __argv[i];
  127. if (lpszParam[0] == '-' || lpszParam[0] == '/')
  128. {
  129. }
  130. else if (!(m_fCommand & CMD_OPEN))
  131. {
  132. m_strFileOpen = lpszParam;
  133. m_fCommand |= CMD_OPEN;
  134. }
  135. }
  136. return TRUE;
  137. }
  138. BOOL CMSDIApp::ProcessShellCommand()
  139. {
  140. if (m_fCommand & CMD_OPEN)
  141. OpenDocumentFile(m_strFileOpen);
  142. else
  143. OnFileNew();
  144. if (((CMSDIDocManager*)m_pDocManager)->IsThreadListEmpty())
  145. return FALSE;
  146. return TRUE;
  147. }
  148. BOOL CMSDIApp::IsAlreadyRunning(LPCTSTR lpszName)
  149. {
  150. ASSERT(lpszName!=NULL);
  151. LPCTSTR lpszClassName = AfxRegisterWndClass(0, NULL, NULL, NULL);
  152. HWND hWnd = FindWindow(lpszClassName, lpszName);
  153. if (hWnd)
  154. {
  155. ATOM nFileOpen = NULL;
  156. if (m_fCommand & CMD_OPEN)
  157. nFileOpen = GlobalAddAtom(m_strFileOpen);
  158. DWORD dwThreadID = GetWindowThreadProcessId(hWnd, NULL);
  159. ::PostThreadMessage(dwThreadID, MSDIM_NEW_INSTANCE, (WPARAM)nFileOpen, 0);
  160. return TRUE;
  161. }
  162. m_pFrameWnd = (CFrameWnd*)RUNTIME_CLASS(CFrameWnd)->CreateObject();
  163. m_pFrameWnd->Create(lpszClassName, lpszName);
  164. return FALSE;
  165. }
  166. BOOL CMSDIApp::Register()
  167. {
  168. CString strShort;
  169. AfxGetModuleShortFileName(m_hInstance, strShort);
  170. CString strDescr;
  171. strDescr.LoadString(IDR_MAINFRAME);
  172. CString strExt, strID, strName;
  173. AfxExtractSubString(strExt, strDescr, CDocTemplate::filterExt, 'n');
  174. AfxExtractSubString(strID, strDescr, CDocTemplate::regFileTypeId, 'n');
  175. AfxExtractSubString(strName, strDescr, CDocTemplate::regFileTypeName, 'n');
  176. SetRegKey(strExt, strID);
  177. SetRegKey(strID, strName);
  178. SetRegKey(strID + _T("\DefaultIcon"), strShort + _T(",1"));
  179. SetRegKey(strID + _T("\shell\open\command"), strShort + _T(" /dde"));
  180. SetRegKey(strID + _T("\shell\open\ddeexec"), _T("[open("%1")]"));
  181. return TRUE;
  182. }
  183. BOOL CMSDIApp::Unregister()
  184. {
  185. CWinApp::Unregister();
  186. CString strDescr;
  187. strDescr.LoadString(IDR_MAINFRAME);
  188. CString strExt, strID;
  189. AfxExtractSubString(strExt, strDescr, CDocTemplate::filterExt, 'n');
  190. AfxExtractSubString(strID, strDescr, CDocTemplate::regFileTypeId, 'n');
  191. DelRegTree(HKEY_CLASSES_ROOT, strExt);
  192. DelRegTree(HKEY_CLASSES_ROOT, strID);
  193. return TRUE;
  194. }
  195. void CMSDIApp::SetRegKey(LPCTSTR lpszKey, LPCTSTR lpszValue)
  196. {
  197. RegSetValue(HKEY_CLASSES_ROOT, lpszKey, REG_SZ,
  198. lpszValue, (DWORD)_tcslen(lpszValue));
  199. }
  200. BOOL CMSDIApp::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
  201. {
  202. CMSDIThread* pThread = (CMSDIThread*)AfxGetThread();
  203. if (pThread->IsKindOf(RUNTIME_CLASS(CMSDIThread)))
  204. {
  205. if (pThread->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
  206. return TRUE;
  207. }
  208. return CWinApp::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
  209. }
  210. void CMSDIApp::OnAppExit()
  211. {
  212. ((CMSDIDocManager*)m_pDocManager)->CloseAllFrames();
  213. }