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

Windows编程

开发平台:

Visual C++

  1. // dmdoc.cpp
  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. //
  13. // Purpose: implementation of the CDynaMenuDoc class
  14. //
  15. // Functions:
  16. //      Most of this file was generated by AppWizard.  The functions
  17. //      which contain code specific to this sample are:
  18. //
  19. //      CDynaMenuDoc::CDynaMenuDoc()         -- document constructor
  20. //      CDynaMenuDoc::DoSelectColor()        -- handle text color commands
  21. //      CDynaMenuDoc::DoUpdateSelectColor()  -- update text color UI objects
  22. //      CDynaMenuDoc::GetMessageString()     -- get status msg for color cmds
  23. //      CDynaMenuDoc::OnCmdMsg()             -- perform command routing
  24. //      CDynaMenuDoc::OnColorOptions()       -- display color options dialog
  25. #include "stdafx.h"
  26. #include "dynamenu.h"
  27. #include "dmdoc.h"
  28. #include "coloropt.h"  // for CColorOptDlg
  29. #include "mdichild.h"  // for CDynaMDIChildWnd
  30. #ifdef _DEBUG
  31. #undef THIS_FILE
  32. static char BASED_CODE THIS_FILE[] = __FILE__;
  33. #endif
  34. /////////////////////////////////////////////////////////////////////////////
  35. // This table defines the possible text colors which will be displayed in
  36. // the color options dialog.  The colors selected in the options dialog
  37. // for a document will appear on the Color submenu when that document is
  38. // active.
  39. //
  40. DynaMenuDef CDynaMenuDoc::m_aColorDef[NUM_TEXTCOLOR] =
  41. {
  42. { IDS_BLACK,    ID_COLOR1, RGB(0,   0, 0) },
  43. { IDS_RED,      ID_COLOR2, RGB(128, 0, 0) },
  44. { IDS_PURPLE,   ID_COLOR3, RGB(128, 0, 128) },
  45. { IDS_BLUE,     ID_COLOR4, RGB(0, 0, 128) },
  46. };
  47. /////////////////////////////////////////////////////////////////////////////
  48. // CDynaMenuDoc
  49. IMPLEMENT_DYNCREATE(CDynaMenuDoc, CDocument)
  50. BEGIN_MESSAGE_MAP(CDynaMenuDoc, CDocument)
  51. //{{AFX_MSG_MAP(CDynaMenuDoc)
  52. ON_COMMAND(ID_COLOR_OPTIONS, OnColorOptions)
  53. //}}AFX_MSG_MAP
  54. END_MESSAGE_MAP()
  55. #define new DEBUG_NEW
  56. /////////////////////////////////////////////////////////////////////////////
  57. // CDynaMenuDoc construction/destruction
  58. CDynaMenuDoc::CDynaMenuDoc()
  59. {
  60. // Initialize document data.  Start out by allowing all possible
  61. // text colors and default to using the first one.
  62. m_iColor = 0;
  63. for (int i = 0; i < NUM_TEXTCOLOR; i++)
  64.    m_abAllowColor[i] = TRUE;
  65. }
  66. CDynaMenuDoc::~CDynaMenuDoc()
  67. {
  68. }
  69. BOOL CDynaMenuDoc::OnNewDocument()
  70. {
  71. if (!CDocument::OnNewDocument())
  72. return FALSE;
  73. // TODO: add reinitialization code here
  74. // (SDI documents will reuse this document)
  75. return TRUE;
  76. }
  77. /////////////////////////////////////////////////////////////////////////////
  78. // CDynaMenuDoc serialization
  79. void CDynaMenuDoc::Serialize(CArchive& ar)
  80. {
  81. if (ar.IsStoring())
  82. {
  83. // TODO: add storing code here
  84. }
  85. else
  86. {
  87. // TODO: add loading code here
  88. }
  89. }
  90. /////////////////////////////////////////////////////////////////////////////
  91. // CDynaMenuDoc diagnostics
  92. #ifdef _DEBUG
  93. void CDynaMenuDoc::AssertValid() const
  94. {
  95. CDocument::AssertValid();
  96. }
  97. void CDynaMenuDoc::Dump(CDumpContext& dc) const
  98. {
  99. CDocument::Dump(dc);
  100. }
  101. #endif //_DEBUG
  102. /////////////////////////////////////////////////////////////////////////////
  103. // CDynaMenuDoc implementation
  104. //***********************************************************************
  105. // Function: CDynaMenuDoc::OnCmdMsg()
  106. //
  107. // Purpose:
  108. //    OnCmdMsg() is called by the framework to route and dispatch
  109. //    command messages and to handle the update of command
  110. //    user-interface objects.
  111. //
  112. //    Here we extend the standard command routing to intercept command
  113. //    messages with variable command IDs.  In this sample, the
  114. //    currently defined text color options are stored in
  115. //    CDynaMenuDoc::m_aColorDef.  Each element of this array contains
  116. //    the command ID associated with that color.  When a command ID
  117. //    is passed to this function, we search m_aColorDef for a matching
  118. //    command ID.  If one is found, we process the message.  Otherwise,
  119. //    we route the command to the standard OnCmdMsg processing.
  120. //
  121. // Parameters:
  122. //    nID           -- contains the command ID
  123. //    nCode         -- identifies the command notification code
  124. //    pExtra        -- used according to the value of nCode
  125. //    pHandlerInfo  -- if not NULL, filled in with pTarget and pmf
  126. //                     members of CMDHANDLERINFO structure, instead
  127. //                     of dispatching the command.  Typically NULL.
  128. //
  129. // Returns:
  130. //    nonzero if message handled, otherwise 0.
  131. //
  132. // Comments:
  133. //    See the documentation for CCmdTarget::OnCmdMsg() for further
  134. //    information.  Command routing is also discussed in tech note #21.
  135. //
  136. //***********************************************************************
  137. BOOL CDynaMenuDoc::OnCmdMsg(UINT nID, int nCode, void* pExtra,
  138. AFX_CMDHANDLERINFO* pHandlerInfo)
  139. {
  140. // If pHandlerInfo is NULL, then handle the message
  141. if (pHandlerInfo == NULL)
  142. {
  143. // Filter the commands sent to a text color menu option
  144. for (int i = NUM_TEXTCOLOR-1; i >= 0; i--)
  145. {
  146. if (nID == m_aColorDef[i].m_nID)
  147. {
  148. if (nCode == CN_COMMAND)
  149. {
  150. // Handle WM_COMMAND message
  151. DoSelectColor(i);
  152. }
  153. else if (nCode == CN_UPDATE_COMMAND_UI)
  154. {
  155. // Update UI element state
  156. DoUpdateSelectColor(i, (CCmdUI*)pExtra);
  157. }
  158. return TRUE;
  159. }
  160. }
  161. }
  162. // If we didn't process the command, call the base class
  163. // version of OnCmdMsg so the message-map can handle the message
  164. return CDocument::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
  165. }
  166. //***********************************************************************
  167. // Function: CDynaMenuDoc::DoSelectColor()
  168. //
  169. // Purpose:
  170. //    DoSelectColor processes text color command messages for
  171. //    CDynaMenuDoc::OnCmdMsg(). It updates the document member variable
  172. //    m_iColor and calls UpdateAllViews() to redraw the document's
  173. //    views.
  174. //
  175. // Parameters:
  176. //    iColor -- index into CDynaMenuDoc::m_aColorDef for new
  177. //              color selection
  178. //
  179. // Returns:
  180. //    none.
  181. //
  182. // Comments:
  183. //    In the debug version, an assert is generated if the index is
  184. //    out of bounds or if the specified color is not currently
  185. //    enabled for the document.
  186. //
  187. //***********************************************************************
  188. void CDynaMenuDoc::DoSelectColor(int iColor)
  189. {
  190. ASSERT(iColor >= 0 && iColor < NUM_TEXTCOLOR);
  191. ASSERT(m_abAllowColor[iColor] == TRUE);
  192. m_iColor = iColor;
  193. UpdateAllViews(NULL);
  194. }
  195. //***********************************************************************
  196. // Function: CDynaMenuDoc::DoUpdateSelectColor()
  197. //
  198. // Purpose:
  199. //    DoUpdateSelectColor handled the updates to user-interface objects
  200. //    associated with text color command messages for
  201. //    CDynaMenuDoc::OnCmdMsg(). If the item is associated with the
  202. //    currently selected text color for the document, the item is checked.
  203. //
  204. // Parameters:
  205. //    iColor -- index into CDynaMenuDoc::m_aColorDef for new
  206. //              color selection
  207. //
  208. // Returns:
  209. //    none.
  210. //
  211. // Comments:
  212. //    In the debug version, an assert is generated if the index is
  213. //    out of bounds or if the item is disabled for the document.
  214. //
  215. //***********************************************************************
  216. void CDynaMenuDoc::DoUpdateSelectColor(int iColor, CCmdUI* pCmdUI)
  217. {
  218. ASSERT(iColor >= 0 && iColor < NUM_TEXTCOLOR);
  219. ASSERT(m_abAllowColor[iColor] == TRUE);
  220. pCmdUI->SetCheck(m_iColor == iColor);
  221. pCmdUI->Enable(TRUE);
  222. }
  223. //***********************************************************************
  224. // Function: CDynaMenuDoc::GetMessageString()
  225. //
  226. // Purpose:
  227. //    GetMessageString formats and returns a string containing the
  228. //    message text to display in a status bar for any of the color
  229. //    selection commands.
  230. //
  231. // Parameters:
  232. //    nID        -- command ID to get message for
  233. //    strMessage -- buffer to fill with message
  234. //
  235. // Returns:
  236. //    TRUE if nID is a color selection command ID, otherwise FALSE.
  237. //
  238. // Comments:
  239. //    If the function returns FALSE, strMessage is not changed
  240. //
  241. //***********************************************************************
  242. BOOL CDynaMenuDoc::GetMessageString(UINT nID, CString& strMessage)
  243. {
  244. for (int i = 0; i < NUM_TEXTCOLOR; i++)
  245. {
  246. if (m_aColorDef[i].m_nID == nID)
  247. {
  248. CString strColor;
  249. strColor.LoadString(m_aColorDef[i].m_nString);
  250. AfxFormatString1(strMessage, IDS_COLORHELPFMT, strColor);
  251. return TRUE;
  252. }
  253. }
  254. return FALSE;
  255. }
  256. /////////////////////////////////////////////////////////////////////////////
  257. // CDynaMenuDoc commands
  258. //***********************************************************************
  259. // Function: CDynaMenuDoc::OnColorOptions()
  260. //
  261. // Purpose:
  262. //    OnColorOptions displays a dialog which allows the user to pick
  263. //    the text colors which should be displayed on the Color submenu
  264. //    when the document is active.
  265. //
  266. // Parameters:
  267. //    none.
  268. //
  269. // Returns:
  270. //    none.
  271. //
  272. // Comments:
  273. //    none.
  274. //
  275. //***********************************************************************
  276. void CDynaMenuDoc::OnColorOptions()
  277. {
  278. CColorOptDlg dlg(this);
  279. if (dlg.DoModal())
  280. {
  281. // find the MDI frame window associated with this document
  282. POSITION pos = GetFirstViewPosition();
  283. CView* pview = GetNextView(pos);
  284. ASSERT(pview != NULL);
  285. CDynaMDIChildWnd* pwnd = (CDynaMDIChildWnd*)pview->GetParentFrame();
  286. ASSERT_KINDOF(CDynaMDIChildWnd, pwnd);
  287. // force an update of the Color submenu
  288. pwnd->RefreshColorMenu();
  289. }
  290. }