UIApp.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:9k
源码类别:

图形图象

开发平台:

Visual C++

  1. //*******************************************************************************
  2. // COPYRIGHT NOTES
  3. // ---------------
  4. // You may use this source code, compile or redistribute it as part of your application 
  5. // for free. You cannot redistribute it as a part of a software development 
  6. // library without the agreement of the author. If the sources are 
  7. // distributed along with the application, you should leave the original 
  8. // copyright notes in the source code without any changes.
  9. // This code can be used WITHOUT ANY WARRANTIES at your own risk.
  10. // 
  11. // For the latest updates to this code, check this site:
  12. // http://www.masmex.com 
  13. // after Sept 2000
  14. // 
  15. // Copyright(C) 2000 Philip Oldaker <email: philip@masmex.com>
  16. //*******************************************************************************
  17. #include "stdafx.h"
  18. #include "UIFrameWnd.h"
  19. #include "UIApp.h"
  20. #ifdef _DEBUG
  21. #define new DEBUG_NEW
  22. #undef THIS_FILE
  23. static char THIS_FILE[] = __FILE__;
  24. #endif
  25. /////////////////////////////////////////////////////////////////////////////
  26. // CUIApp
  27. IMPLEMENT_DYNAMIC(CUIApp,CWinApp)
  28. BEGIN_MESSAGE_MAP(CUIApp, CWinApp)
  29. //{{AFX_MSG_MAP(CUIApp)
  30. // NOTE - the ClassWizard will add and remove mapping macros here.
  31. //    DO NOT EDIT what you see in these blocks of generated code!
  32. //}}AFX_MSG_MAP
  33. // Standard file based document commands
  34. END_MESSAGE_MAP()
  35. /////////////////////////////////////////////////////////////////////////////
  36. // CUIApp construction
  37. CUIApp::CUIApp()  
  38. {
  39. // TODO: add construction code here,
  40. // Place all significant initialization in InitInstance
  41. m_IDMyIcon = 0;
  42. m_bMyClassRegistered = false;
  43. }
  44. CDocTemplate *CUIApp::GetFirstDocTemplate()
  45. {
  46. POSITION posTempl = GetFirstDocTemplatePosition();
  47. CDocTemplate *pTempl = GetNextDocTemplate(posTempl);
  48. ASSERT(pTempl);
  49. return pTempl;
  50. }
  51. CFrameWnd *CUIApp::GetMainFrame(CWnd *pWnd)
  52. {
  53. if (pWnd)
  54. return pWnd->GetParentFrame();
  55. return (CFrameWnd*)m_pMainWnd;
  56. }
  57. CString CUIApp::GetRegAppKey()
  58. {
  59. CString sKey;
  60. sKey += _T("Software");
  61. sKey += _T("\");
  62. sKey += m_pszRegistryKey;
  63. sKey += _T("\");
  64. sKey += m_pszProfileName;
  65. sKey += _T("\");
  66. return sKey;
  67. }
  68. BOOL CUIApp::InitInstance()
  69. {
  70. if (!m_sMyClassName.IsEmpty() && !RegisterMyClass())
  71. return FALSE;
  72. return CWinApp::InitInstance();
  73. }
  74. int CUIApp::ExitInstance() 
  75. {
  76. // TODO: Add your specialized code here and/or call the base class
  77.     if(m_bMyClassRegistered)
  78.        ::UnregisterClass(m_sMyClassName,AfxGetInstanceHandle());
  79. return CWinApp::ExitInstance();
  80. }
  81.                                                                       
  82. /////////////////////////////////////////////////////////////////////////////
  83. // The one and only CUIApp object
  84. bool CUIApp::RegisterMyClass()
  85. {
  86. // Register our unique class name so only one instance can be started
  87. //////////////////////////////////////////////////////////////
  88. ASSERT(!m_sMyClassName.IsEmpty());
  89. if (m_sMyClassName.IsEmpty())
  90. return false;
  91. //////////////////////////////////////////////////////////////
  92.     WNDCLASSEX wndcls; 
  93.     memset(&wndcls, 0, sizeof(WNDCLASSEX));    
  94. wndcls.cbSize = sizeof(WNDCLASSEX);
  95.     wndcls.style = CS_DBLCLKS;// | CS_HREDRAW | CS_VREDRAW;
  96.     wndcls.lpfnWndProc = ::DefWindowProc;
  97.     wndcls.hInstance = AfxGetInstanceHandle();
  98. if (m_IDMyIcon)
  99. {
  100. wndcls.hIcon = LoadIcon(m_IDMyIcon); 
  101. wndcls.hIconSm = (HICON)LoadImage(AfxGetInstanceHandle(), 
  102.             MAKEINTRESOURCE(m_IDMyIcon),
  103.             IMAGE_ICON,
  104.             GetSystemMetrics(SM_CXSMICON),
  105.             GetSystemMetrics(SM_CYSMICON),
  106.             0);
  107. if (wndcls.hIconSm == NULL)
  108. {
  109. ErrorMessage(_T("LoadImage failed"));
  110. }
  111. }
  112. wndcls.hCursor = LoadStandardCursor(IDC_ARROW);
  113.     wndcls.hbrBackground = NULL; //(HBRUSH) (COLOR_WINDOW + 1);
  114.     wndcls.lpszMenuName = NULL; 
  115.     // Specify our own class name for using FindWindow later to set focus to running app
  116.     wndcls.lpszClassName = m_sMyClassName; 
  117. WNDCLASSEX wndclsEx;
  118. if (GetClassInfoEx(wndcls.hInstance, wndcls.lpszClassName, &wndclsEx))
  119. {
  120. // class already registered
  121. return true;
  122. }
  123.     // Register new class and exit if it fails
  124.     if(!::RegisterClassEx(&wndcls))
  125.     {
  126. ErrorMessage(_T("Class Registration Failed"));
  127. return false;
  128.     }
  129. else
  130. TRACE(_T("Window class %s was registered in CUIAppn"),GetMyClass());
  131. m_bMyClassRegistered = true;
  132. return true;
  133. }
  134. BOOL CUIApp::FirstInstance()
  135. {
  136. ASSERT(!m_sMyClassName.IsEmpty());
  137. if (m_sMyClassName.IsEmpty())
  138. return TRUE;
  139. CWnd *pWndPrev, *pWndChild;
  140. // Determine if another window with our class name exists...
  141. if (pWndPrev = CWnd::FindWindow(m_sMyClassName,NULL))
  142. {
  143. // if so, does it have any popups?
  144. pWndChild = pWndPrev->GetLastActivePopup();
  145. // If iconic, restore the main window
  146. if (pWndPrev->IsIconic())
  147.    pWndPrev->ShowWindow(SW_RESTORE);
  148. // Bring the main window or its popup to
  149. // the foreground
  150. pWndChild->SetForegroundWindow();
  151. // and we are done activating the previous one.
  152. return FALSE;
  153. }
  154. return TRUE;
  155. }
  156. /////////////////////////////////////////////////////////////////////////////
  157. // CUIApp initialization
  158. void CUIApp::SetStatusBarText(UINT nPaneID,LPCTSTR Text,UINT nIconID)
  159. {
  160. if (m_pMainWnd == NULL)
  161. {
  162. TRACE1("Warning: '%s' SetStatusBarText called before main frame created!n",Text);
  163. return;
  164. }
  165. CUIFrameWnd *pMainFrame = (CUIFrameWnd*)m_pMainWnd;
  166. if (nIconID)
  167. pMainFrame->GetStatusBar().AddIcon(nPaneID,nIconID,false);
  168. pMainFrame->GetStatusBar().SetText(nPaneID,Text,true);     
  169. }
  170. void CUIApp::SetStatusBarText(LPCTSTR Text)
  171. {
  172. SetStatusBarText(0,Text);
  173. }
  174. void CUIApp::SetStatusBarText(UINT nPaneID,LPCTSTR Text,CView *pView,UINT nIconID)
  175. {
  176. if (m_pMainWnd == NULL)
  177. return;
  178. if (((CFrameWnd*)m_pMainWnd)->GetActiveView() == pView)
  179. SetStatusBarText(nPaneID,Text,nIconID);
  180. }
  181. void CUIApp::SetStatusBarText(UINT nPaneID,UINT nResID,UINT nIconID)
  182. {
  183. CString str;
  184. str.LoadString(nResID);
  185. SetStatusBarText(nPaneID,str,nIconID);
  186. }
  187. void CUIApp::SetStatusBarIcon(UINT nPaneID,UINT nIconID,bool bAdd)
  188. {
  189. if (m_pMainWnd == NULL)
  190. return;
  191. CUIFrameWnd *pMainFrame = (CUIFrameWnd*)m_pMainWnd;
  192. if (bAdd)
  193. pMainFrame->GetStatusBar().AddIcon(nPaneID,nIconID);
  194. else
  195. pMainFrame->GetStatusBar().RemoveIcon(nPaneID,nIconID);
  196. pMainFrame->GetStatusBar().RedrawWindow();
  197. }
  198. void CUIApp::SetStatusBarIdleMessage()
  199. {
  200. if (m_pMainWnd == NULL)
  201. return;
  202. CUIFrameWnd *pMainFrame = (CUIFrameWnd*)m_pMainWnd;
  203. pMainFrame->GetStatusBar().RemoveAllIcons(0);
  204. SetStatusBarText(0,AFX_IDS_IDLEMESSAGE);
  205. }
  206. CDocument *CUIApp::GetDocument()
  207. {
  208. CDocTemplate *pTempl = GetFirstDocTemplate();
  209. POSITION posDoc = pTempl->GetFirstDocPosition();
  210. CDocument *pDoc = pTempl->GetNextDoc(posDoc);
  211. ASSERT(pDoc);
  212. return pDoc; 
  213. }
  214. CView *CUIApp::GetView(CRuntimeClass *pClass)
  215. {
  216. CDocTemplate *pTemplate = GetFirstDocTemplate();
  217. POSITION posDoc = pTemplate->GetFirstDocPosition();
  218. while (posDoc)
  219. {
  220.   CDocument *pDoc = pTemplate->GetNextDoc(posDoc); 
  221.   POSITION posView = pDoc->GetFirstViewPosition();
  222.   while (posView) 
  223.   {
  224. CView *pView = pDoc->GetNextView(posView); 
  225. if (pView && pView->IsKindOf(pClass))
  226. return pView;
  227.   }
  228.     }
  229. return NULL;
  230. }
  231. void CUIApp::ChangeProfile(LPCTSTR szRegistryKey,LPCTSTR szProfileName)
  232. {
  233. m_strOldProfileName = m_pszProfileName;
  234. m_strOldRegistryKey = m_pszRegistryKey;
  235. free((void*)m_pszRegistryKey);
  236. m_pszRegistryKey = _tcsdup(szRegistryKey);
  237. free((void*)m_pszProfileName);
  238. m_pszProfileName = _tcsdup(szProfileName);
  239. }
  240. void CUIApp::RestoreProfile()
  241. {
  242. if (!m_strOldProfileName.IsEmpty())
  243. {
  244. free((void*)m_pszProfileName);
  245. m_pszProfileName = _tcsdup(m_strOldProfileName);
  246. }
  247. if (!m_strOldRegistryKey.IsEmpty()) 
  248. {
  249. free((void*)m_pszRegistryKey);
  250. m_pszRegistryKey = _tcsdup(m_strOldRegistryKey);
  251. }
  252. }
  253. /////////////////////////////////////////////////////////////////////////////
  254. // CAppReg
  255. // Tricks MFC into using another application key 
  256. // useful if in HKEY_CURRENT_USER
  257. CAppReg::CAppReg(CWinApp *pApp,LPCTSTR szRegistryKey,LPCTSTR szProfileName) 
  258. {
  259. ASSERT(pApp);
  260. m_pApp = (CUIApp*)pApp;
  261. m_pApp->ChangeProfile(szRegistryKey,szProfileName);
  262. }
  263. CAppReg::~CAppReg()
  264. {
  265. ASSERT(m_pApp);
  266. m_pApp->RestoreProfile();
  267. }
  268. //static 
  269. bool CUIApp::COMMessage(HRESULT hr,UINT nID)
  270. {
  271. CString sMess;
  272. sMess.LoadString(nID);
  273. return COMMessage(hr,sMess);
  274. }
  275. bool CUIApp::COMMessage(HRESULT hr,LPCTSTR szText)
  276. {
  277. if (FAILED(hr))
  278. {
  279. ErrorMessage(szText,(DWORD)hr);
  280. return false;
  281. }
  282. return true;
  283. }
  284. void CUIApp::ErrorMessage(UINT nID,DWORD dwError)
  285. {
  286. CString sMess;
  287. sMess.LoadString(nID);
  288. ErrorMessage(sMess);
  289. }
  290. void CUIApp::ErrorMessage(LPCTSTR szText,DWORD dwError)
  291. {
  292. bool bError=true;
  293. if (dwError == 0)
  294. {
  295. dwError = GetLastError();
  296. bError = true;
  297. }
  298. else
  299. {
  300. bError = FAILED(dwError);
  301. }
  302. LPVOID lpMsgBuf=NULL;
  303. if (bError)
  304. {
  305. FormatMessage( 
  306. FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  307. FORMAT_MESSAGE_FROM_SYSTEM | 
  308. FORMAT_MESSAGE_IGNORE_INSERTS,
  309. NULL,
  310. dwError,
  311. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  312. (LPTSTR) &lpMsgBuf,
  313. 0,
  314. NULL 
  315. );
  316. }
  317. // Process any inserts in lpMsgBuf.
  318. // ...
  319. // Display the string.
  320. CString sMess;
  321. if (lpMsgBuf)
  322. {
  323. sMess = (LPCTSTR)lpMsgBuf;
  324. sMess += _T("n");
  325. LocalFree( lpMsgBuf );
  326. }
  327. if (szText)
  328. {
  329. sMess += szText;
  330. }
  331. AfxMessageBox(sMess, MB_ICONSTOP );
  332. }