MAINFRM.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:14k
源码类别:

Windows编程

开发平台:

Visual C++

  1. // mainfrm.cpp : implementation of the CMainFrame class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1998 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12. #include "stdafx.h"
  13. #include "OleView.h"
  14. #include "mainfrm.h"
  15. #include "shadow.h"
  16. #include "obj_vw.h"
  17. #ifdef _DEBUG
  18. #undef THIS_FILE
  19. static char BASED_CODE THIS_FILE[] = __FILE__;
  20. #endif
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CMainFrame
  23. // Create a splitter window which splits an output text view and an input view
  24. //                               |
  25. //    OBJECT VIEW (CObjTreeView)  | INTERFACE VIEW (CRegistryView)
  26. //                               |
  27. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  28. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  29. //{{AFX_MSG_MAP(CMainFrame)
  30. ON_WM_CREATE()
  31. ON_WM_DESTROY()
  32. ON_COMMAND(ID_FILE_RUNREGEDIT, OnFileRunREGEDIT)
  33. ON_COMMAND(ID_VIEW_REFRESH, OnViewRefresh)
  34. ON_UPDATE_COMMAND_UI(ID_VIEW_REFRESH, OnUpdateViewRefresh)
  35. ON_WM_SYSCOLORCHANGE()
  36. ON_COMMAND(ID_OBJECT_DELETE, OnObjectDelete)
  37. ON_UPDATE_COMMAND_UI(ID_OBJECT_DELETE, OnUpdateObjectDelete)
  38. ON_COMMAND(ID_OBJECT_VERIFY, OnObjectVerify)
  39. ON_UPDATE_COMMAND_UI(ID_OBJECT_VERIFY, OnUpdateObjectVerify)
  40. ON_COMMAND(ID_FILE_VIEWTYPELIB, OnFileViewTypeLib)
  41. ON_COMMAND(ID_IFACES_USEINPROCSERVER, OnUseInProcServer)
  42. ON_UPDATE_COMMAND_UI(ID_IFACES_USEINPROCSERVER, OnUpdateUseInProcServer)
  43. ON_COMMAND(ID_IFACES_USEINPROCHANDLER, OnUseInProcHandler)
  44. ON_UPDATE_COMMAND_UI(ID_IFACES_USEINPROCHANDLER, OnUpdateUseInProcHandler)
  45. ON_COMMAND(ID_IFACES_USELOCALSERVER, OnUseLocalServer)
  46. ON_UPDATE_COMMAND_UI(ID_IFACES_USELOCALSERVER, OnUpdateUseLocalServer)
  47. //}}AFX_MSG_MAP
  48. END_MESSAGE_MAP()
  49. /////////////////////////////////////////////////////////////////////////////
  50. // arrays of IDs used to initialize control bars
  51. // toolbar buttons - IDs are command buttons
  52. static UINT BASED_CODE buttons[] =
  53. {
  54. // same order as in the bitmap 'toolbar.bmp'
  55. ID_FILE_BINDTOAFILE,
  56. ID_FILE_VIEWTYPELIB,
  57. ID_SEPARATOR,
  58. ID_FILE_RUNREGEDIT,
  59. ID_SEPARATOR,
  60. ID_OBJECT_DELETE,
  61. ID_OBJECT_VERIFY,
  62. ID_SEPARATOR,
  63. ID_IFACES_USEINPROCSERVER,
  64. ID_IFACES_USEINPROCHANDLER,
  65. ID_IFACES_USELOCALSERVER,
  66. ID_SEPARATOR,
  67. ID_APP_ABOUT
  68. };
  69. static UINT BASED_CODE indicators[] =
  70. {
  71.   ID_SEPARATOR,             // status line indicator
  72. //    ID_INDICATOR_CAPS,
  73. //    ID_INDICATOR_NUM,
  74. //    ID_INDICATOR_SCRL,
  75. };
  76. /////////////////////////////////////////////////////////////////////////////
  77. // CMainFrame construction/destruction
  78. CMainFrame::CMainFrame()
  79. {
  80. m_pObjTreeView = NULL ;
  81. m_pObjectView = NULL ;
  82. }
  83. CMainFrame::~CMainFrame()
  84. {
  85. }
  86. BOOL CMainFrame::LoadFrame(UINT nIDResource, DWORD dwDefaultStyle,
  87. CWnd* pParentWnd, CCreateContext* pContext)
  88. {
  89. // Turn off auto update of title bar
  90. dwDefaultStyle &= ~((DWORD)FWS_ADDTOTITLE) ;
  91. BOOL f = CFrameWnd::LoadFrame(nIDResource, dwDefaultStyle,
  92. pParentWnd, pContext);
  93. return f ;
  94. }
  95. /////////////////////////////////////////////////////////////////////////////
  96. // CMainFrame message handlers
  97. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  98. {
  99. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  100. return -1;
  101. if (!m_wndToolBar.Create(this) ||
  102. !m_wndToolBar.LoadBitmap(IDR_MAINFRAME) ||
  103. !m_wndToolBar.SetButtons(buttons, sizeof(buttons)/sizeof(UINT)))
  104. {
  105. TRACE(_T("Failed to create toolbarn"));
  106. return -1;      // fail to create
  107. }
  108. //    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  109. //    EnableDocking(CBRS_ALIGN_ANY);
  110. //    DockControlBar(&m_wndToolBar);
  111. m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
  112. CBRS_TOOLTIPS | CBRS_FLYBY);
  113. if (!m_wndStatusBar.Create(this) ||
  114. !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)) )
  115. {
  116. TRACE(_T("Failed to create status barn"));
  117. return -1;      // fail to create
  118. }
  119. UINT nID, nStyle ;
  120. int cxWidth ;
  121. m_wndStatusBar.GetPaneInfo( 0, nID, nStyle, cxWidth ) ;
  122. m_wndStatusBar.SetPaneInfo( 0, ID_SEPARATOR, nStyle | SBPS_POPOUT, cxWidth ) ;
  123. // When CStatusBar is created, a font is created and stored
  124. // internally in AFX.  But AFX will clean that font up during
  125. // shutdown, so we don't need to delete it.
  126. m_wndStatusBar.SetFont( theApp.m_pFont ) ;
  127. DragAcceptFiles( TRUE ) ;
  128. return 0;
  129. }
  130. void CMainFrame::OnDestroy()
  131. {
  132. CFrameWnd::OnDestroy();
  133. SavePosition() ;
  134. }
  135. BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
  136.  CCreateContext* pContext)
  137. {
  138. // create a splitter with 1 row, 2 columns
  139. if (!m_wndSplitter.CreateStatic(this, 1, 2))
  140. {
  141. TRACE(_T("Failed to CreateStaticSplittern"));
  142. return FALSE;
  143. }
  144. // add the first splitter pane - the default view in column 0
  145. if (!m_wndSplitter.CreateView(0, 0,
  146. pContext->m_pNewViewClass, CSize(240, 0), pContext))
  147. {
  148. TRACE(_T("Failed to create first panen"));
  149. return FALSE;
  150. }
  151. if (!m_wndSplitter.CreateView(0, 1,
  152. RUNTIME_CLASS(CRegistryView), CSize(0, 0), pContext))
  153. {
  154. TRACE(_T("Failed to create second panen"));
  155. return FALSE;
  156. }
  157. m_pObjTreeView = (CObjTreeView*)m_wndSplitter.GetPane(0, 0) ;
  158. m_pObjectView = (CRegistryView*)m_wndSplitter.GetPane(0,1) ;
  159. // activate the input view
  160. SetActiveView((CView*)m_wndSplitter.GetPane(0, 0));
  161. m_wndSplitter.SetColumnInfo( 0, 240, 0 ) ;
  162. return TRUE;
  163. }
  164. /////////////////////////////////////////////////////////////////////////////
  165. // CMainFrame diagnostics
  166. #ifdef _DEBUG
  167. void CMainFrame::AssertValid() const
  168. {
  169. CFrameWnd::AssertValid();
  170. }
  171. void CMainFrame::Dump(CDumpContext& dc) const
  172. {
  173. CFrameWnd::Dump(dc);
  174. }
  175. #endif //_DEBUG
  176. BOOL CMainFrame::SavePosition()
  177. {
  178. CString szSection ;
  179. CString szKey ;
  180. szSection.LoadString( IDS_INI_CONFIG ) ;
  181. szKey.LoadString( IDS_INI_WNDPOS ) ;
  182. WINDOWPLACEMENT wp;
  183. CString szValue ;
  184. wp.length = sizeof( WINDOWPLACEMENT );
  185. GetWindowPlacement( &wp );
  186. int nWidth, n ;
  187. m_wndSplitter.GetColumnInfo( 0, nWidth, n ) ;
  188. LPTSTR p = szValue.GetBuffer( 255 ) ;
  189. wsprintf( p, _T("%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d"),
  190. wp.showCmd, wp.ptMinPosition.x, wp.ptMinPosition.y,
  191. wp.ptMaxPosition.x, wp.ptMaxPosition.y,
  192. wp.rcNormalPosition.left, wp.rcNormalPosition.top,
  193. wp.rcNormalPosition.right, wp.rcNormalPosition.bottom,
  194. nWidth,
  195. (m_wndToolBar.GetStyle() & WS_VISIBLE) ? TRUE : FALSE,
  196. (m_wndStatusBar.GetStyle() & WS_VISIBLE) ? TRUE : FALSE);
  197. szValue.ReleaseBuffer() ;
  198. theApp.WriteProfileString( szSection, szKey, szValue );
  199. return TRUE ;
  200. }
  201. BOOL CMainFrame::RestorePosition(int nCmdShow)
  202. {
  203. CString sz ;
  204. CString szSection ;
  205. CString szKey ;
  206. BOOL fToolBar = TRUE ;
  207. BOOL fStatusBar = TRUE ;
  208. int  nWidth ;
  209. szSection.LoadString( IDS_INI_CONFIG ) ;
  210. szKey.LoadString( IDS_INI_WNDPOS ) ;
  211. WINDOWPLACEMENT wp;
  212. int     nConv;
  213. wp.length = sizeof( WINDOWPLACEMENT );
  214. wp.flags = 0 ;
  215. TRY
  216. {
  217. sz = theApp.GetProfileString(szSection, szKey, _T("") ) ;
  218. if (sz.IsEmpty())
  219. AfxThrowMemoryException();
  220. LPTSTR   lp = (LPTSTR)sz.GetBuffer( 255 );
  221. wp.showCmd = (WORD)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  222. if (!nConv)
  223. AfxThrowMemoryException();
  224. wp.ptMinPosition.x = (int)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  225. if (!nConv)
  226. AfxThrowMemoryException();
  227. wp.ptMinPosition.y = (int)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  228. if (!nConv)
  229. AfxThrowMemoryException();
  230. wp.ptMaxPosition.x = (int)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  231. if (!nConv)
  232. AfxThrowMemoryException();
  233. wp.ptMaxPosition.y = (int)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  234. if (!nConv)
  235. AfxThrowMemoryException();
  236. wp.rcNormalPosition.left = (int)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  237. if (!nConv)
  238. AfxThrowMemoryException();
  239. wp.rcNormalPosition.top = (int)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  240. if (!nConv)
  241. AfxThrowMemoryException();
  242. wp.rcNormalPosition.right = (int)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  243. if (!nConv)
  244. AfxThrowMemoryException();
  245. wp.rcNormalPosition.bottom = (int)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  246. if (!nConv)
  247. AfxThrowMemoryException();
  248. nWidth = (int)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  249. if (!nConv)
  250. AfxThrowMemoryException();
  251. fToolBar = (BOOL)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  252. if (!nConv)
  253. AfxThrowMemoryException();
  254. fStatusBar = (BOOL)ParseOffNumber( (LPTSTR FAR *)&lp, &nConv );
  255. if (!nConv)
  256. AfxThrowMemoryException();
  257. // Always strip off minimize.
  258. //
  259. if (wp.showCmd == SW_SHOWMINIMIZED)
  260. wp.showCmd = SW_SHOWNORMAL ;
  261. if (nCmdShow != SW_SHOWNORMAL || nCmdShow != SW_NORMAL)
  262. wp.showCmd = nCmdShow ;
  263. m_wndSplitter.SetColumnInfo( 0, nWidth, 0 ) ;
  264. }
  265. CATCH(CException, pException)
  266. {
  267. fToolBar = TRUE ;
  268. fStatusBar = TRUE ;
  269. ShowControlBar( &m_wndToolBar, fToolBar, TRUE ) ;
  270. ShowControlBar( &m_wndStatusBar, fStatusBar, TRUE ) ;
  271. ShowWindow( SW_SHOWNORMAL );
  272. return FALSE ;
  273. }
  274. END_CATCH
  275. ShowControlBar( &m_wndToolBar, fToolBar, TRUE ) ;
  276. ShowControlBar( &m_wndStatusBar, fStatusBar, TRUE ) ;
  277. return (BOOL)SetWindowPlacement( &wp ) ;
  278. }
  279. void CMainFrame::OnFileRunREGEDIT()
  280. {
  281. if (WinExec( "REGEDT32.EXE", SW_SHOWNORMAL ) < 32)
  282. WinExec( "REGEDIT.EXE", SW_SHOWNORMAL ) ;
  283. }
  284. void CMainFrame::OnViewRefresh()
  285. {
  286. COle2ViewDoc*   pDoc = (COle2ViewDoc*)GetActiveDocument() ;
  287. pDoc->UpdateAllViews( NULL, UPD_NORELOAD ) ;
  288. }
  289. void CMainFrame::OnUpdateViewRefresh(CCmdUI* /*pCmdUI*/)
  290. {
  291. }
  292. void CMainFrame::OnSysColorChange()
  293. {
  294. //    Ctl3dColorChange() ;
  295. theApp.LoadBitmaps( TRUE ) ;
  296. CFrameWnd::OnSysColorChange();
  297. }
  298. void CMainFrame::OnObjectDelete()
  299. {
  300. m_pObjTreeView->OnObjectDelete() ;
  301. }
  302. void CMainFrame::OnUpdateObjectDelete(CCmdUI* pCmdUI)
  303. {
  304. pCmdUI->Enable( m_pObjTreeView->IsValidSel() ) ;
  305. }
  306. void CMainFrame::OnObjectVerify()
  307. {
  308. m_pObjTreeView->OnObjectVerify() ;
  309. }
  310. void CMainFrame::OnUpdateObjectVerify(CCmdUI* pCmdUI)
  311. {
  312. pCmdUI->Enable( m_pObjTreeView->IsValidSel() ) ;
  313. }
  314. void CMainFrame::OnFileViewTypeLib()
  315. {
  316. USES_CONVERSION;
  317. static TCHAR szFilter[] = _T("TypeLib Files (*.tlb;*.olb;*.dll;*.ocx;*.exe)|*.tlb;*.olb;*.dll;*.ocx;*.exe|AllFiles(*.*)|*.*|") ;
  318. CFileDialog dlg(TRUE, _T("*.tlb"), NULL,
  319. OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST,
  320. szFilter, this);
  321. if (IDOK != dlg.DoModal())
  322. return ;
  323. // Call LoadTypeLib
  324. LPTYPELIB lpTypeLib;
  325. HRESULT hr = ::LoadTypeLib(T2COLE(dlg.GetPathName()), &lpTypeLib);
  326. if (FAILED(hr))
  327. {
  328. CString szErrorMsg;
  329. szErrorMsg.Format(_T("LoadTypeLib( %s ) failed."),(LPCTSTR)dlg.GetPathName());
  330. ErrorMessage( szErrorMsg, hr );
  331. return ;
  332. }
  333. // call the interface wiewer
  334. ASSERT(lpTypeLib != NULL);
  335. ViewInterface( GetSafeHwnd(), IID_ITypeLib, (IUnknown*)lpTypeLib);
  336. VERIFY(0 == lpTypeLib->Release()) ;
  337. }
  338. void WINAPI ViewInterface( HWND hwnd, REFIID riid, IUnknown *punk )
  339. {
  340. IInterfaceViewer* piv = NULL ;
  341. SCODE sc ;
  342. // Look in the registry for the "Ole2ViewIViewer=" key for this iid
  343. //
  344. TCHAR szKey[128] ;
  345. TCHAR szValue[80] ;
  346. TCHAR szInterface[80] ;
  347. USES_CONVERSION;
  348. // get the string from CLSID in TCHAR format
  349. LPOLESTR lpszOleIID = NULL;
  350. ::StringFromCLSID(riid, &lpszOleIID);
  351. ASSERT(lpszOleIID != NULL);
  352. LPTSTR lpszIID = OLE2T(lpszOleIID);
  353. ASSERT(lpszIID != NULL);
  354. IMalloc* pmal = NULL ;
  355. ::CoGetMalloc( MEMCTX_TASK, &pmal ) ;
  356. pmal->Free( lpszOleIID ) ;
  357. pmal->Release() ;
  358. wsprintf(szKey, _T("Interface\%s"), lpszIID) ;
  359. LONG cb = sizeof(szValue);
  360. if (::RegQueryValue(HKEY_CLASSES_ROOT, szKey, szInterface, &cb) != ERROR_SUCCESS)
  361. {
  362. lstrcpy( szInterface, "<no name>" ) ;
  363. }
  364. wsprintf( szKey, _T("Interface\%s\Ole2ViewIViewerCLSID"), lpszIID );
  365. cb = sizeof(szValue) ;
  366. if (::RegQueryValue(HKEY_CLASSES_ROOT, szKey, szValue, &cb) != ERROR_SUCCESS)
  367. {
  368. CString str;
  369. str.Format(_T("There is no interface viewer for %s installed."), szInterface);
  370. ErrorMessage( str, E_FAIL ) ;
  371. return ;
  372. }
  373. CLSID clsid ;
  374. sc = ::CLSIDFromString( T2OLE(szValue), &clsid ) ;
  375. if (FAILED(sc))
  376. {
  377. CString str;
  378. str.Format(_T("Could not convert the CLSID of the %s interface viewer."), szInterface);
  379. ErrorMessage( str, sc ) ;
  380. return ;
  381. }
  382. sc = ::CoCreateInstance( clsid, NULL, CLSCTX_SERVER, IID_IInterfaceViewer, (void**)&piv ) ;
  383. if (SUCCEEDED(sc))
  384. {
  385. IUnknown* ptemp = NULL ;
  386. HRESULT hr = punk->QueryInterface( riid, (void**)&ptemp ) ;
  387. if (SUCCEEDED(hr))
  388. {
  389. piv->View( hwnd, riid, ptemp ) ;
  390. piv->Release() ;
  391. ptemp->Release() ;
  392. }
  393. }
  394. else
  395. {
  396. CString str;
  397. str.Format(_T("The %s interface viewer failed to load."), szInterface);
  398. ErrorMessage( str, sc ) ;
  399. }
  400. }
  401. void CMainFrame::OnUseInProcServer()
  402. {
  403. m_pObjTreeView->OnUseInProcServer();
  404. }
  405. void CMainFrame::OnUpdateUseInProcServer(CCmdUI* pCmdUI)
  406. {
  407. m_pObjTreeView->OnUpdateUseInProcServer( pCmdUI );
  408. }
  409. void CMainFrame::OnUseInProcHandler()
  410. {
  411.    m_pObjTreeView->OnUseInProcHandler();
  412. }
  413. void CMainFrame::OnUpdateUseInProcHandler(CCmdUI* pCmdUI)
  414. {
  415. m_pObjTreeView->OnUpdateUseInProcHandler( pCmdUI ) ;
  416. }
  417. void CMainFrame::OnUseLocalServer()
  418. {
  419. m_pObjTreeView->OnUseLocalServer() ;
  420. }
  421. void CMainFrame::OnUpdateUseLocalServer(CCmdUI* pCmdUI)
  422. {
  423. m_pObjTreeView->OnUpdateUseLocalServer( pCmdUI ) ;
  424. }
  425. void CMainFrame::OnFileBind()
  426. {
  427. m_pObjTreeView->OnFileBind() ;
  428. }