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

界面编程

开发平台:

Visual C++

  1. // ipframe.cpp : implementation of the CInPlaceFrame 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 "formatba.h"
  15. #include "ruler.h"
  16. #include "ipframe.h"
  17. #include "wordpdoc.h"
  18. #include "wordpvw.h"
  19. #include "colorlis.h"
  20. #ifdef _DEBUG
  21. #undef THIS_FILE
  22. static char BASED_CODE THIS_FILE[] = __FILE__;
  23. #endif
  24. /////////////////////////////////////////////////////////////////////////////
  25. // CInPlaceFrame
  26. IMPLEMENT_DYNCREATE(CInPlaceFrame, COleIPFrameWnd)
  27. BEGIN_MESSAGE_MAP(CInPlaceFrame, COleIPFrameWnd)
  28. //{{AFX_MSG_MAP(CInPlaceFrame)
  29. ON_WM_CREATE()
  30. ON_WM_DESTROY()
  31. ON_COMMAND(ID_HELP, OnHelpFinder)
  32. ON_COMMAND(ID_CHAR_COLOR, OnCharColor)
  33. ON_COMMAND(ID_HELP_INDEX, OnHelpFinder)
  34. ON_COMMAND(ID_PEN_TOGGLE, OnPenToggle)
  35. //}}AFX_MSG_MAP
  36. ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateControlBarMenu)
  37. ON_COMMAND_EX(ID_VIEW_TOOLBAR, OnBarCheck)
  38. ON_UPDATE_COMMAND_UI(ID_VIEW_FORMATBAR, OnUpdateControlBarMenu)
  39. ON_COMMAND_EX(ID_VIEW_FORMATBAR, OnBarCheck)
  40. ON_UPDATE_COMMAND_UI(ID_VIEW_RULER, OnUpdateControlBarMenu)
  41. ON_COMMAND_EX(ID_VIEW_RULER, OnBarCheck)
  42. ON_MESSAGE(WM_SIZECHILD, OnResizeChild)
  43. ON_MESSAGE(WPM_BARSTATE, OnBarState)
  44. ON_COMMAND(ID_DEFAULT_HELP, OnHelpFinder)
  45. // ON_COMMAND(ID_CONTEXT_HELP, COleIPFrameWnd::OnContextHelp)
  46. END_MESSAGE_MAP()
  47. /////////////////////////////////////////////////////////////////////////////
  48. // arrays of IDs used to initialize control bars
  49. static UINT BASED_CODE toolButtons[] =
  50. {
  51. // same order as in the bitmap 'itoolbar.bmp'
  52. ID_EDIT_CUT,
  53. ID_EDIT_COPY,
  54. ID_EDIT_PASTE,
  55. ID_SEPARATOR,
  56. ID_PEN_TOGGLE,
  57. ID_PEN_PERIOD,
  58. ID_PEN_SPACE,
  59. ID_PEN_BACKSPACE,
  60. ID_PEN_NEWLINE,
  61. ID_PEN_LENS
  62. };
  63. #define NUM_PEN_ITEMS 7
  64. #define NUM_PEN_TOGGLE 5
  65. static UINT BASED_CODE format[] =
  66. {
  67. // same order as in the bitmap 'format.bmp'
  68. ID_SEPARATOR, // font name combo box
  69. ID_SEPARATOR,
  70. ID_SEPARATOR, // font size combo box
  71. ID_SEPARATOR,
  72. ID_CHAR_BOLD,
  73. ID_CHAR_ITALIC,
  74. ID_CHAR_UNDERLINE,
  75. ID_CHAR_COLOR,
  76. ID_SEPARATOR,
  77. ID_PARA_LEFT,
  78. ID_PARA_CENTER,
  79. ID_PARA_RIGHT,
  80. ID_SEPARATOR,
  81. ID_INSERT_BULLET,
  82. };
  83. /////////////////////////////////////////////////////////////////////////////
  84. // CInPlaceFrame construction/destruction
  85. CInPlaceFrame::CInPlaceFrame() : m_wndRulerBar(FALSE)
  86. {
  87. }
  88. int CInPlaceFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
  89. {
  90. if (COleIPFrameWnd::OnCreate(lpCreateStruct) == -1)
  91. return -1;
  92. // CResizeBar implements in-place resizing.
  93. if (!m_wndResizeBar.Create(this))
  94. {
  95. TRACE0("Failed to create resize barn");
  96. return -1;      // fail to create
  97. }
  98. if (!CreateRulerBar(this))
  99. return FALSE;
  100. // By default, it is a good idea to register a drop-target that does
  101. //  nothing with your frame window.  This prevents drops from
  102. //  "falling through" to a container that supports drag-drop.
  103. m_dropTarget.Register(this);
  104. return 0;
  105. }
  106. // OnCreateControlBars is called by the framework to create control bars on the
  107. //  container application's windows.  pWndFrame is the top level frame window of
  108. //  the container and is always non-NULL.  pWndDoc is the doc level frame window
  109. //  and will be NULL when the container is an SDI application.  A server
  110. //  application can place MFC control bars on either window.
  111. BOOL CInPlaceFrame::OnCreateControlBars(CFrameWnd* pWndFrame, CFrameWnd* /*pWndDoc*/)
  112. {
  113. if (!CreateToolBar(pWndFrame))
  114. return FALSE;
  115. if (!CreateFormatBar(pWndFrame))
  116. return FALSE;
  117. // set owner to this window, so messages are delivered to correct app
  118. m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
  119. m_wndFormatBar.EnableDocking(CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM);
  120. pWndFrame->EnableDocking(CBRS_ALIGN_ANY);
  121. pWndFrame->DockControlBar(&m_wndToolBar);
  122. pWndFrame->DockControlBar(&m_wndFormatBar);
  123. m_wndToolBar.SetOwner(this);
  124. m_wndFormatBar.SetOwner(this);
  125. m_wndRulerBar.SetOwner(this);
  126. OnBarState(1, RD_EMBEDDED); //load bar state
  127. return TRUE;
  128. }
  129. BOOL CInPlaceFrame::CreateToolBar(CWnd* pWndFrame)
  130. {
  131. // Create toolbar on client's frame window
  132. ASSERT(m_wndToolBar.m_hWnd == NULL);
  133. int nPen = GetSystemMetrics(SM_PENWINDOWS) ? NUM_PEN_TOGGLE : 
  134. NUM_PEN_ITEMS;
  135. UINT nID = theApp.m_bLargeIcons ? 
  136. IDR_SRVR_INPLACE_BIG : IDR_SRVR_INPLACE;
  137. if (!m_wndToolBar.Create(pWndFrame, WS_CHILD|WS_VISIBLE|CBRS_TOP|
  138. CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
  139. !m_wndToolBar.LoadBitmap(nID) ||
  140. !m_wndToolBar.SetButtons(toolButtons, 
  141. sizeof(toolButtons)/sizeof(UINT) - nPen))
  142. {
  143. TRACE0("Failed to create toolbarn");
  144. return FALSE;      // fail to create
  145. }
  146. if (theApp.m_bLargeIcons)
  147. m_wndToolBar.SetSizes(CSize(31,30), CSize(24,24));
  148. else
  149. m_wndToolBar.SetSizes(CSize(23,22), CSize(16,16));
  150. CString str;
  151. str.LoadString(IDS_TITLE_TOOLBAR);
  152. m_wndToolBar.SetWindowText(str);
  153. return TRUE;
  154. }
  155. BOOL CInPlaceFrame::CreateFormatBar(CWnd* pWndFrame)
  156. {
  157. ASSERT(m_wndFormatBar.m_hWnd == NULL);
  158. m_wndFormatBar.m_hWndOwner = m_hWnd;
  159. UINT nID = theApp.m_bLargeIcons ? IDB_FORMATBAR_BIG : IDB_FORMATBAR;
  160. if (!m_wndFormatBar.Create(pWndFrame, WS_CHILD|WS_VISIBLE|CBRS_TOP|
  161. CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_HIDE_INPLACE|CBRS_SIZE_DYNAMIC, ID_VIEW_FORMATBAR) ||
  162. !m_wndFormatBar.LoadBitmap(nID) ||
  163. !m_wndFormatBar.SetButtons(format, 
  164. sizeof(format)/sizeof(UINT)))
  165. {
  166. TRACE0("Failed to create FormatBarn");
  167. return FALSE;      // fail to create
  168. }
  169. if (theApp.m_bLargeIcons)
  170. m_wndFormatBar.SetSizes(CSize(31,30), CSize(24,24));
  171. else
  172. m_wndFormatBar.SetSizes(CSize(23,22), CSize(16,16));
  173. CString str;
  174. str.LoadString(IDS_TITLE_FORMATBAR);
  175. m_wndFormatBar.SetWindowText(str);
  176. m_wndFormatBar.PositionCombos();
  177. return TRUE;
  178. }
  179. CInPlaceFrame::CreateRulerBar(CWnd* pWndFrame)
  180. {
  181. if (!m_wndRulerBar.Create(pWndFrame, 
  182. WS_CHILD|WS_VISIBLE|CBRS_ALIGN_TOP|CBRS_HIDE_INPLACE, ID_VIEW_RULER))
  183. {
  184. TRACE0("Failed to create rulern");
  185. return FALSE;      // fail to create
  186. }
  187. return TRUE;
  188. }
  189. /////////////////////////////////////////////////////////////////////////////
  190. // CInPlaceFrame Operations
  191. /////////////////////////////////////////////////////////////////////////////
  192. // CInPlaceFrame diagnostics
  193. #ifdef _DEBUG
  194. void CInPlaceFrame::AssertValid() const
  195. {
  196. COleIPFrameWnd::AssertValid();
  197. }
  198. void CInPlaceFrame::Dump(CDumpContext& dc) const
  199. {
  200. COleIPFrameWnd::Dump(dc);
  201. }
  202. #endif //_DEBUG
  203. /////////////////////////////////////////////////////////////////////////////
  204. // CInPlaceFrame commands
  205. void CInPlaceFrame::OnDestroy()
  206. {
  207. m_wndToolBar.DestroyWindow();
  208. m_wndFormatBar.DestroyWindow();
  209. COleIPFrameWnd::OnDestroy();
  210. }
  211. void CInPlaceFrame::RepositionFrame(LPCRECT lpPosRect, LPCRECT lpClipRect)
  212. {
  213. CRect rectNew = lpPosRect;
  214. rectNew.left -= HORZ_TEXTOFFSET;
  215. rectNew.top -= VERT_TEXTOFFSET;
  216. m_wndResizeBar.BringWindowToTop();
  217. COleIPFrameWnd::RepositionFrame(&rectNew, lpClipRect);
  218. CWnd* pWnd = GetActiveView();
  219. if (pWnd != NULL)
  220. pWnd->BringWindowToTop();
  221. m_wndRulerBar.BringWindowToTop();
  222. }
  223. void CInPlaceFrame::RecalcLayout(BOOL bNotify)
  224. {
  225. if (m_wndResizeBar.m_hWnd != NULL)
  226. m_wndResizeBar.BringWindowToTop();
  227. COleIPFrameWnd::RecalcLayout(bNotify);
  228. CWnd* pWnd = GetActiveView();
  229. if (pWnd != NULL)
  230. pWnd->BringWindowToTop();
  231. if (m_wndRulerBar.m_hWnd != NULL)
  232. m_wndRulerBar.BringWindowToTop();
  233. // at least 12 pt region plus ruler if it exists
  234. CDisplayIC dc;
  235. CSize size;
  236. size.cy = MulDiv(12, dc.GetDeviceCaps(LOGPIXELSY), 72)+1;
  237. size.cx = dc.GetDeviceCaps(LOGPIXELSX)/4; // 1/4"
  238. size.cx += HORZ_TEXTOFFSET; //adjust for offset
  239. size.cy += VERT_TEXTOFFSET;
  240. if (m_wndRulerBar.m_hWnd != NULL && m_wndRulerBar.IsVisible())
  241. {
  242. CRect rect;
  243. m_wndRulerBar.GetWindowRect(&rect);
  244. size.cy += rect.Height();
  245. }
  246. m_wndResizeBar.SetMinSize(size);
  247. }
  248. void CInPlaceFrame::CalcWindowRect(LPRECT lpClientRect, UINT nAdjustType)
  249. {
  250. COleIPFrameWnd::CalcWindowRect(lpClientRect, nAdjustType);
  251. }
  252. LRESULT CInPlaceFrame::OnResizeChild(WPARAM /*wParam*/, LPARAM lParam)
  253. {
  254. // notify the container that the rectangle has changed!
  255. CWordPadDoc* pDoc = (CWordPadDoc*)GetActiveDocument();
  256. if (pDoc == NULL)
  257. return 0;
  258. ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CWordPadDoc)));
  259. // get new rect and parent
  260. CRect rectNew;
  261. rectNew.CopyRect((LPCRECT)lParam);
  262. CWnd* pParentWnd = GetParent();
  263. ASSERT_VALID(pParentWnd);
  264. // convert rectNew relative to pParentWnd
  265. ClientToScreen(&rectNew);
  266. pParentWnd->ScreenToClient(&rectNew);
  267. if (m_wndRulerBar.GetStyle()&WS_VISIBLE)
  268. {
  269. CRect rect;
  270. m_wndRulerBar.GetWindowRect(&rect);
  271. rectNew.top += rect.Height();
  272. }
  273. rectNew.left += HORZ_TEXTOFFSET;
  274. rectNew.top += VERT_TEXTOFFSET;
  275. // adjust the new rectangle for the current control bars
  276. CWnd* pLeftOver = GetDlgItem(AFX_IDW_PANE_FIRST);
  277. ASSERT(pLeftOver != NULL);
  278. CRect rectCur = m_rectPos;
  279. pLeftOver->CalcWindowRect(&rectCur, CWnd::adjustOutside);
  280. rectNew.left += m_rectPos.left - rectCur.left;
  281. rectNew.top += m_rectPos.top - rectCur.top;
  282. rectNew.right -= rectCur.right - m_rectPos.right;
  283. rectNew.bottom -= rectCur.bottom - m_rectPos.bottom;
  284. OnRequestPositionChange(rectNew);
  285. return 0;
  286. }
  287. LONG CInPlaceFrame::OnBarState(UINT wParam, LONG lParam)
  288. {
  289. if (lParam == -1)
  290. return 0L;
  291. if (wParam == 0)
  292. {
  293. GetDockState(theApp.GetDockState(RD_EMBEDDED));
  294. ASSERT(m_pMainFrame != NULL);
  295. m_pMainFrame->GetDockState(theApp.GetDockState(RD_EMBEDDED, FALSE));
  296. }
  297. else
  298. {
  299. SetDockState(theApp.GetDockState(RD_EMBEDDED));
  300. m_pMainFrame->SetDockState(theApp.GetDockState(RD_EMBEDDED, FALSE));
  301. }
  302. return 0L;
  303. }
  304. void CInPlaceFrame::OnHelpFinder() 
  305. {
  306. theApp.WinHelp(0, HELP_FINDER);
  307. }
  308. void CInPlaceFrame::OnCharColor() 
  309. {
  310. CColorMenu colorMenu;
  311. CRect rc;
  312. int index = m_wndFormatBar.CommandToIndex(ID_CHAR_COLOR);
  313. m_wndFormatBar.GetItemRect(index, &rc);
  314. m_wndFormatBar.ClientToScreen(rc);
  315. colorMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,rc.left,rc.bottom, this);
  316. }
  317. void CInPlaceFrame::OnPenToggle() 
  318. {
  319. static int nPen = 0;
  320. m_wndToolBar.SetButtons(toolButtons, sizeof(toolButtons)/sizeof(UINT) - nPen);
  321. nPen = (nPen == 0) ? NUM_PEN_TOGGLE : 0;
  322. m_wndToolBar.Invalidate();
  323. m_wndToolBar.GetParentFrame()->RecalcLayout();
  324. }