MAINFRM.CPP
上传用户:aakk678
上传日期:2022-07-09
资源大小:406k
文件大小:11k
源码类别:

界面编程

开发平台:

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-1997 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 "wordpad.h"
  14. #include "mainfrm.h"
  15. #include "wordpdoc.h"
  16. #include "wordpvw.h"
  17. #include "strings.h"
  18. #include "colorlis.h"
  19. #ifdef _DEBUG
  20. #undef THIS_FILE
  21. static char BASED_CODE THIS_FILE[] = __FILE__;
  22. #endif
  23. /////////////////////////////////////////////////////////////////////////////
  24. // CMainFrame
  25. IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)
  26. BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
  27. //{{AFX_MSG_MAP(CMainFrame)
  28. ON_WM_CREATE()
  29. ON_WM_SYSCOLORCHANGE()
  30. ON_WM_SIZE()
  31. ON_WM_MOVE()
  32. ON_COMMAND(ID_HELP, OnHelpFinder)
  33. ON_WM_DROPFILES()
  34. ON_COMMAND(ID_CHAR_COLOR, OnCharColor)
  35. ON_COMMAND(ID_PEN_TOGGLE, OnPenToggle)
  36. ON_WM_FONTCHANGE()
  37. ON_WM_QUERYNEWPALETTE()
  38. ON_WM_PALETTECHANGED()
  39. ON_WM_DEVMODECHANGE()
  40. ON_COMMAND(ID_HELP_INDEX, OnHelpFinder)
  41. //}}AFX_MSG_MAP
  42. // Global help commands
  43. // ON_COMMAND(ID_CONTEXT_HELP, CFrameWnd::OnContextHelp)
  44. ON_COMMAND(ID_DEFAULT_HELP, OnHelpFinder)
  45. ON_UPDATE_COMMAND_UI(ID_VIEW_FORMATBAR, OnUpdateControlBarMenu)
  46. ON_UPDATE_COMMAND_UI(ID_VIEW_RULER, OnUpdateControlBarMenu)
  47. ON_MESSAGE(WPM_BARSTATE, OnBarState)
  48. ON_REGISTERED_MESSAGE(CWordPadApp::m_nOpenMsg, OnOpenMsg)
  49. ON_COMMAND_EX(ID_VIEW_STATUS_BAR, OnBarCheck)
  50. ON_COMMAND_EX(ID_VIEW_TOOLBAR, OnBarCheck)
  51. ON_COMMAND_EX(ID_VIEW_FORMATBAR, OnBarCheck)
  52. ON_COMMAND_EX(ID_VIEW_RULER, OnBarCheck)
  53. END_MESSAGE_MAP()
  54. /////////////////////////////////////////////////////////////////////////////
  55. // arrays of IDs used to initialize control bars
  56. // toolbar buttons - IDs are command buttons
  57. static UINT BASED_CODE toolbar[] =
  58. {
  59. // same order as in the bitmap 'toolbar.bmp'
  60. // (int nBitmap, int nCommand, BYTE byteState, BYTE byteStyle, DWORD dw, int nString)
  61. ID_FILE_NEW,
  62. ID_FILE_OPEN,
  63. ID_FILE_SAVE,
  64. ID_SEPARATOR,
  65. ID_FILE_PRINT_DIRECT,
  66. ID_FILE_PRINT_PREVIEW,
  67. ID_SEPARATOR,
  68. ID_EDIT_FIND,
  69. ID_SEPARATOR,
  70. ID_EDIT_CUT,
  71. ID_EDIT_COPY,
  72. ID_EDIT_PASTE,
  73. ID_EDIT_UNDO,
  74. ID_SEPARATOR,
  75. ID_INSERT_DATE_TIME,
  76. ID_SEPARATOR,
  77. ID_PEN_TOGGLE,
  78. ID_PEN_PERIOD,
  79. ID_PEN_SPACE,
  80. ID_PEN_BACKSPACE,
  81. ID_PEN_NEWLINE,
  82. ID_PEN_LENS
  83. };
  84. #define NUM_PEN_ITEMS 7
  85. #define NUM_PEN_TOGGLE 5
  86. static UINT BASED_CODE format[] =
  87. {
  88. // same order as in the bitmap 'format.bmp'
  89. ID_SEPARATOR, // font name combo box
  90. ID_SEPARATOR,
  91. ID_SEPARATOR, // font size combo box
  92. ID_SEPARATOR,
  93. ID_CHAR_BOLD,
  94. ID_CHAR_ITALIC,
  95. ID_CHAR_UNDERLINE,
  96. ID_CHAR_COLOR,
  97. ID_SEPARATOR,
  98. ID_PARA_LEFT,
  99. ID_PARA_CENTER,
  100. ID_PARA_RIGHT,
  101. ID_SEPARATOR,
  102. ID_INSERT_BULLET,
  103. };
  104. static UINT BASED_CODE indicators[] =
  105. {
  106. ID_SEPARATOR,           // status line indicator
  107. ID_INDICATOR_CAPS,
  108. ID_INDICATOR_NUM,
  109. };
  110. /////////////////////////////////////////////////////////////////////////////
  111. // CMainFrame construction/destruction
  112. CMainFrame::CMainFrame()
  113. {
  114. m_hIconDoc = theApp.LoadIcon(IDI_ICON_DOC);
  115. m_hIconText = theApp.LoadIcon(IDI_ICON_TEXT);
  116. m_hIconWrite = theApp.LoadIcon(IDI_ICON_WRITE);
  117. }
  118. CMainFrame::~CMainFrame()
  119. {
  120. }
  121. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) 
  122. {
  123. WNDCLASS wndcls;
  124. BOOL bRes = CFrameWnd::PreCreateWindow(cs);
  125. HINSTANCE hInst = AfxGetInstanceHandle();
  126. // see if the class already exists
  127. if (!::GetClassInfo(hInst, szWordPadClass, &wndcls))
  128. {
  129. // get default stuff
  130. ::GetClassInfo(hInst, cs.lpszClass, &wndcls);
  131. wndcls.style &= ~(CS_HREDRAW|CS_VREDRAW);
  132. // register a new class
  133. wndcls.lpszClassName = szWordPadClass;
  134. wndcls.hIcon = ::LoadIcon(hInst, MAKEINTRESOURCE(IDR_MAINFRAME));
  135. ASSERT(wndcls.hIcon != NULL);
  136. if (!AfxRegisterClass(&wndcls))
  137. AfxThrowResourceException();
  138. }
  139. cs.lpszClass = szWordPadClass;
  140. CRect rect = theApp.m_rectInitialFrame;
  141. if (rect.Width() > 0 && rect.Height() > 0)
  142. {
  143. // make sure window will be visible
  144. CDisplayIC dc;
  145. CRect rectDisplay(0, 0, dc.GetDeviceCaps(HORZRES), 
  146. dc.GetDeviceCaps(VERTRES));
  147. if (rectDisplay.PtInRect(rect.TopLeft()) && 
  148. rectDisplay.PtInRect(rect.BottomRight()))
  149. {
  150. cs.x = rect.left;
  151. cs.y = rect.top;
  152. cs.cx = rect.Width();
  153. cs.cy = rect.Height();
  154. }
  155. }
  156. return bRes;
  157. }
  158. int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  159. {
  160. if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  161. return -1;
  162. if (!CreateToolBar())
  163. return -1;
  164. if (!CreateFormatBar())
  165. return -1;
  166. if (!CreateStatusBar())
  167. return -1;
  168. EnableDocking(CBRS_ALIGN_ANY);
  169. if (!CreateRulerBar())
  170. return -1;
  171. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  172. m_wndFormatBar.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM);
  173. DockControlBar(&m_wndToolBar);
  174. DockControlBar(&m_wndFormatBar);
  175. CWnd* pView = GetDlgItem(AFX_IDW_PANE_FIRST);
  176. if (pView != NULL)
  177. {
  178. pView->SetWindowPos(&wndBottom, 0, 0, 0, 0, 
  179. SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE);
  180. }
  181. return 0;
  182. }
  183. BOOL CMainFrame::CreateToolBar()
  184. {
  185. int nPen = GetSystemMetrics(SM_PENWINDOWS) ? NUM_PEN_TOGGLE : 
  186. NUM_PEN_ITEMS;
  187. UINT nID = theApp.m_bLargeIcons ? IDR_MAINFRAME1_BIG : 
  188. IDR_MAINFRAME1;
  189. if (!m_wndToolBar.Create(this, 
  190. WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
  191. !m_wndToolBar.LoadBitmap(nID) ||
  192. !m_wndToolBar.SetButtons(toolbar, sizeof(toolbar)/sizeof(UINT) - nPen))
  193. {
  194. TRACE0("Failed to create toolbarn");
  195. return FALSE;      // fail to create
  196. }
  197. if (theApp.m_bLargeIcons)
  198. m_wndToolBar.SetSizes(CSize(31,30), CSize(24,24));
  199. else
  200. m_wndToolBar.SetSizes(CSize(23,22), CSize(16,16));
  201. CString str;
  202. str.LoadString(IDS_TITLE_TOOLBAR);
  203. m_wndToolBar.SetWindowText(str);
  204. return TRUE;
  205. }
  206. BOOL CMainFrame::CreateFormatBar()
  207. {
  208. UINT nID = theApp.m_bLargeIcons ? IDB_FORMATBAR_BIG : IDB_FORMATBAR;
  209. if (!m_wndFormatBar.Create(this, 
  210. WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_HIDE_INPLACE|CBRS_SIZE_DYNAMIC,
  211. ID_VIEW_FORMATBAR) ||
  212. !m_wndFormatBar.LoadBitmap(nID) ||
  213. !m_wndFormatBar.SetButtons(format, sizeof(format)/sizeof(UINT)))
  214. {
  215. TRACE0("Failed to create FormatBarn");
  216. return FALSE;      // fail to create
  217. }
  218. if (theApp.m_bLargeIcons)
  219. m_wndFormatBar.SetSizes(CSize(31,30), CSize(24,24));
  220. else
  221. m_wndFormatBar.SetSizes(CSize(23,22), CSize(16,16));
  222. CString str;
  223. str.LoadString(IDS_TITLE_FORMATBAR);
  224. m_wndFormatBar.SetWindowText(str);
  225. m_wndFormatBar.PositionCombos();
  226. return TRUE;
  227. }
  228. BOOL CMainFrame::CreateRulerBar()
  229. {
  230. if (!m_wndRulerBar.Create(this, 
  231. WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_HIDE_INPLACE, ID_VIEW_RULER))
  232. {
  233. TRACE0("Failed to create rulern");
  234. return FALSE;      // fail to create
  235. }
  236. return TRUE;
  237. }
  238. BOOL CMainFrame::CreateStatusBar()
  239. {
  240. if (!m_wndStatusBar.Create(this) ||
  241. !m_wndStatusBar.SetIndicators(indicators,
  242.   sizeof(indicators)/sizeof(UINT)))
  243. {
  244. TRACE0("Failed to create status barn");
  245. return FALSE;      // fail to create
  246. }
  247. return TRUE;
  248. }
  249. /////////////////////////////////////////////////////////////////////////////
  250. // CMainFrame Operations
  251. HICON CMainFrame::GetIcon(int nDocType)
  252. {
  253. switch (nDocType)
  254. {
  255. case RD_WINWORD6:
  256. case RD_WORDPAD:
  257. case RD_EMBEDDED:
  258. case RD_RICHTEXT:
  259. return m_hIconDoc;
  260. case RD_TEXT:
  261. case RD_OEMTEXT:
  262. return m_hIconText;
  263. case RD_WRITE:
  264. return m_hIconWrite;
  265. }
  266. return m_hIconDoc;
  267. }
  268. /////////////////////////////////////////////////////////////////////////////
  269. // CMainFrame diagnostics
  270. #ifdef _DEBUG
  271. void CMainFrame::AssertValid() const
  272. {
  273. CFrameWnd::AssertValid();
  274. }
  275. void CMainFrame::Dump(CDumpContext& dc) const
  276. {
  277. CFrameWnd::Dump(dc);
  278. }
  279. #endif //_DEBUG
  280. /////////////////////////////////////////////////////////////////////////////
  281. // CMainFrame message handlers
  282. void CMainFrame::OnFontChange() 
  283. {
  284. m_wndFormatBar.SendMessage(CWordPadApp::m_nPrinterChangedMsg);
  285. }
  286. void CMainFrame::OnDevModeChange(LPTSTR lpDeviceName) 
  287. {
  288. theApp.NotifyPrinterChanged();
  289. CFrameWnd::OnDevModeChange(lpDeviceName); //sends message to descendants
  290. }
  291. void CMainFrame::OnSysColorChange()
  292. {
  293. CFrameWnd::OnSysColorChange();
  294. m_wndRulerBar.SendMessage(WM_SYSCOLORCHANGE);
  295. }
  296. void CMainFrame::ActivateFrame(int nCmdShow) 
  297. {
  298. CFrameWnd::ActivateFrame(nCmdShow);
  299. // make sure and display the toolbar, ruler, etc while loading a document.
  300. OnIdleUpdateCmdUI();
  301. UpdateWindow();
  302. }
  303. void CMainFrame::OnSize(UINT nType, int cx, int cy) 
  304. {
  305. CFrameWnd::OnSize(nType, cx, cy);
  306. theApp.m_bMaximized = (nType == SIZE_MAXIMIZED);
  307. if (nType == SIZE_RESTORED)
  308. GetWindowRect(theApp.m_rectInitialFrame);
  309. }
  310. LONG CMainFrame::OnBarState(UINT wParam, LONG lParam)
  311. {
  312. if (lParam == -1)
  313. return 0L;
  314. ASSERT(lParam != RD_EMBEDDED);
  315. if (wParam == 0)
  316. {
  317. CDockState& ds = theApp.GetDockState(lParam);
  318. ds.Clear(); // empty out the dock state
  319. GetDockState(ds);
  320. }
  321. else
  322. {
  323. if (IsTextType(lParam))
  324. {
  325. // in text mode hide the ruler and format bar so that it is the default
  326. CControlBar* pBar = GetControlBar(ID_VIEW_FORMATBAR);
  327. if (pBar != NULL)
  328. pBar->ShowWindow(SW_HIDE);
  329. pBar = GetControlBar(ID_VIEW_RULER);
  330. if (pBar != NULL)
  331. pBar->ShowWindow(SW_HIDE);
  332. }
  333. HICON hIcon = GetIcon((int)lParam);
  334. SendMessage(WM_SETICON, TRUE, (LPARAM)hIcon);
  335. SetDockState(theApp.GetDockState(lParam));
  336. }
  337. return 0L;
  338. }
  339. void CMainFrame::OnMove(int x, int y) 
  340. {
  341. CFrameWnd::OnMove(x, y);
  342. WINDOWPLACEMENT wp;
  343. wp.length = sizeof(wp);
  344. GetWindowPlacement(&wp);
  345. theApp.m_rectInitialFrame = wp.rcNormalPosition;
  346. CView* pView = GetActiveView();
  347. if (pView != NULL)
  348. pView->SendMessage(WM_MOVE);
  349. }
  350. LONG CMainFrame::OnOpenMsg(UINT, LONG lParam)
  351. {
  352. TCHAR szAtomName[256];
  353. szAtomName[0] = NULL;
  354. GlobalGetAtomName((ATOM)lParam, szAtomName, 256);
  355. CWordPadDoc* pDoc = (CWordPadDoc*)GetActiveDocument();
  356. if (szAtomName[0] != NULL && pDoc != NULL)
  357. {
  358. if (lstrcmpi(szAtomName, pDoc->GetPathName()) == 0)
  359. return TRUE;
  360. }
  361. return FALSE;
  362. }
  363. void CMainFrame::OnHelpFinder() 
  364. {
  365. theApp.WinHelp(0, HELP_FINDER);
  366. }
  367. void CMainFrame::OnDropFiles(HDROP hDropInfo) 
  368. {
  369. TCHAR szFileName[_MAX_PATH];
  370. ::DragQueryFile(hDropInfo, 0, szFileName, _MAX_PATH);
  371. ::DragFinish(hDropInfo);
  372. theApp.OpenDocumentFile(szFileName);
  373. }
  374. void CMainFrame::OnCharColor() 
  375. {
  376. CColorMenu colorMenu;
  377. CRect rc;
  378. int index = m_wndFormatBar.CommandToIndex(ID_CHAR_COLOR);
  379. m_wndFormatBar.GetItemRect(index, &rc);
  380. m_wndFormatBar.ClientToScreen(rc);
  381. colorMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,rc.left,rc.bottom, this);
  382. }
  383. void CMainFrame::OnPenToggle() 
  384. {
  385. static int nPen = 0;
  386. m_wndToolBar.SetButtons(toolbar, sizeof(toolbar)/sizeof(UINT) - nPen);
  387. nPen = (nPen == 0) ? NUM_PEN_TOGGLE : 0;
  388. m_wndToolBar.Invalidate();
  389. m_wndToolBar.GetParentFrame()->RecalcLayout();
  390. }
  391. BOOL CMainFrame::OnQueryNewPalette() 
  392. {
  393. CView* pView = GetActiveView();
  394. if (pView != NULL)
  395. return pView->SendMessage(WM_QUERYNEWPALETTE);
  396. return FALSE;
  397. }
  398. void CMainFrame::OnPaletteChanged(CWnd* pFocusWnd) 
  399. {
  400. CView* pView = GetActiveView();
  401. if (pView != NULL)
  402. pView->SendMessage(WM_PALETTECHANGED, (WPARAM)pFocusWnd->GetSafeHwnd());
  403. }