hellovw.cpp
上传用户:liudazhe
上传日期:2007-01-02
资源大小:51k
文件大小:6k
源码类别:

菜单

开发平台:

Visual C++

  1. // HelloVw.cpp : implementation of the CHelloView 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 "MDI.h"
  14. #include "HelloDoc.h"
  15. #include "HelloVw.h"
  16. #ifdef _DEBUG
  17. #define new DEBUG_NEW
  18. #undef THIS_FILE
  19. static char THIS_FILE[] = __FILE__;
  20. #endif
  21. /////////////////////////////////////////////////////////////////////////////
  22. // CHelloView
  23. IMPLEMENT_DYNCREATE(CHelloView, CView)
  24. BEGIN_MESSAGE_MAP(CHelloView, CView)
  25. //{{AFX_MSG_MAP(CHelloView)
  26. ON_UPDATE_COMMAND_UI(ID_BLUE, OnUpdateBlue)
  27. ON_UPDATE_COMMAND_UI(ID_GREEN, OnUpdateGreen)
  28. ON_UPDATE_COMMAND_UI(ID_RED, OnUpdateRed)
  29. ON_UPDATE_COMMAND_UI(ID_WHITE, OnUpdateWhite)
  30. ON_UPDATE_COMMAND_UI(ID_BLACK, OnUpdateBlack)
  31. ON_COMMAND(ID_CUSTOM, OnCustom)
  32. ON_UPDATE_COMMAND_UI(ID_CUSTOM, OnUpdateCustom)
  33. ON_COMMAND(ID_BLACK, OnColor)
  34. ON_COMMAND(ID_BLUE, OnColor)
  35. ON_COMMAND(ID_GREEN, OnColor)
  36. ON_COMMAND(ID_RED, OnColor)
  37. ON_COMMAND(ID_WHITE, OnColor)
  38. //}}AFX_MSG_MAP
  39. END_MESSAGE_MAP()
  40. /////////////////////////////////////////////////////////////////////////////
  41. // CHelloView construction/destruction
  42. CHelloView::CHelloView()
  43. {
  44. }
  45. CHelloView::~CHelloView()
  46. {
  47. }
  48. BOOL CHelloView::PreCreateWindow(CREATESTRUCT& cs)
  49. {
  50. return CView::PreCreateWindow(cs);
  51. }
  52. /////////////////////////////////////////////////////////////////////////////
  53. // CHelloView drawing
  54. void CHelloView::OnDraw(CDC* pDC)
  55. {
  56. CHelloDoc* pDoc = GetDocument();
  57. ASSERT_VALID(pDoc);
  58. CRect rect;
  59. COLORREF clr = pDoc->m_clrText;
  60. CString tmpStr = pDoc->m_str;
  61. pDC->SetTextColor(clr);
  62. pDC->SetBkColor(::GetSysColor(COLOR_WINDOW));
  63. GetClientRect(rect);
  64. pDC->DrawText(tmpStr, -1, rect,
  65. DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  66. }
  67. /////////////////////////////////////////////////////////////////////////////
  68. // CHelloView diagnostics
  69. #ifdef _DEBUG
  70. void CHelloView::AssertValid() const
  71. {
  72. CView::AssertValid();
  73. }
  74. void CHelloView::Dump(CDumpContext& dc) const
  75. {
  76. CView::Dump(dc);
  77. }
  78. CHelloDoc* CHelloView::GetDocument() // non-debug version is inline
  79. {
  80. ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHelloDoc)));
  81. return (CHelloDoc*)m_pDocument;
  82. }
  83. #endif //_DEBUG
  84. /////////////////////////////////////////////////////////////////////////////
  85. // CHelloView message handlers
  86. // Update handlers for each color
  87. void CHelloView::OnUpdateBlue(CCmdUI* pCmdUI) 
  88. {
  89. CHelloDoc* pDoc = GetDocument();
  90. ASSERT_VALID(pDoc);
  91. pCmdUI->SetCheck(pDoc->m_bBlue);
  92. }
  93. void CHelloView::OnUpdateGreen(CCmdUI* pCmdUI) 
  94. {
  95. CHelloDoc* pDoc = GetDocument();
  96. ASSERT_VALID(pDoc);
  97. pCmdUI->SetCheck(pDoc->m_bGreen);
  98. }
  99. void CHelloView::OnUpdateRed(CCmdUI* pCmdUI) 
  100. {
  101. CHelloDoc* pDoc = GetDocument();
  102. ASSERT_VALID(pDoc);
  103. pCmdUI->SetCheck(pDoc->m_bRed);
  104. }
  105. void CHelloView::OnUpdateWhite(CCmdUI* pCmdUI) 
  106. {
  107. CHelloDoc* pDoc = GetDocument();
  108. ASSERT_VALID(pDoc);
  109. pCmdUI->SetCheck(pDoc->m_bWhite);
  110. }
  111. void CHelloView::OnUpdateBlack(CCmdUI* pCmdUI) 
  112. {
  113. CHelloDoc* pDoc = GetDocument();
  114. ASSERT_VALID(pDoc);
  115. pCmdUI->SetCheck(pDoc->m_bBlack);
  116. }
  117. void CHelloView::MixColors() 
  118. {
  119. CHelloDoc* pDoc = GetDocument();
  120. ASSERT_VALID(pDoc);
  121. COLORREF tmpClr;
  122. int r, g, b;
  123. BOOL bSetColor;
  124. // Determine which colors are currently chosen.
  125. bSetColor = pDoc->m_bRed || pDoc->m_bGreen || pDoc->m_bBlue
  126. || pDoc->m_bWhite || pDoc->m_bBlack;
  127.     // If the current color is custom, ignore mix request.
  128. if(!bSetColor && pDoc->m_bCustom)
  129. return;
  130.     // Set color value to black and then add the necessary colors.
  131. r = g = b = 0;
  132. if(pDoc->m_bRed)
  133.  r = 255;
  134. if(pDoc->m_bGreen)
  135.  g = 255;
  136. if(pDoc->m_bBlue)
  137.  b = 255;
  138. tmpClr = RGB(r, g, b);
  139. // NOTE: Because a simple algorithm is used to mix colors
  140. // if the current selection contains black or white, the 
  141. // result will be black or white; respectively. This is due
  142. // to the additive method for mixing the colors.
  143. if(pDoc->m_bBlack)
  144.  tmpClr = RGB(0, 0, 0);
  145. if(pDoc->m_bWhite)
  146.  tmpClr = RGB(255, 255, 255);
  147.     // Once the color has been determined, update document 
  148. // data, and force repaint of all views.
  149. if(!bSetColor)
  150. pDoc->m_bBlack = TRUE;
  151. pDoc->m_clrText = tmpClr;
  152. pDoc->m_bCustom = FALSE;
  153. pDoc->UpdateAllViews(NULL);
  154. }
  155. void CHelloView::OnCustom() 
  156. {
  157. CHelloDoc* pDoc = GetDocument();
  158. ASSERT_VALID(pDoc);
  159. CColorDialog dlgColor(pDoc->m_clrText);
  160. if (dlgColor.DoModal() == IDOK)
  161. {
  162. pDoc->m_clrText = dlgColor.GetColor();
  163. pDoc->ClearAllColors();
  164. pDoc->m_bCustom = TRUE;
  165. pDoc->UpdateAllViews(NULL);
  166. }
  167. }
  168. void CHelloView::OnUpdateCustom(CCmdUI* pCmdUI) 
  169. {
  170. CHelloDoc* pDoc = GetDocument();
  171. ASSERT_VALID(pDoc);
  172. pCmdUI->SetCheck(pDoc->m_bCustom);
  173. }
  174. void CHelloView::OnColor() 
  175. {
  176. CHelloDoc* pDoc = GetDocument();
  177. ASSERT_VALID(pDoc);
  178. UINT m_nIDColor;
  179. m_nIDColor = LOWORD(GetCurrentMessage()->wParam);
  180. // Determines the color being modified
  181. // and then updates the color state
  182. switch(m_nIDColor)
  183. {
  184.  case ID_BLACK:
  185. pDoc->ClearAllColors();
  186. pDoc->m_bBlack = !(pDoc->m_bBlack);
  187. break;
  188.  case ID_WHITE:
  189. pDoc->ClearAllColors();
  190. pDoc->m_bWhite = !(pDoc->m_bWhite);
  191. break;
  192.  case ID_RED:
  193. pDoc->m_bRed = !(pDoc->m_bRed);
  194. pDoc->m_bBlack = FALSE;
  195. pDoc->m_bWhite = FALSE;
  196. break;
  197.  case ID_GREEN:
  198. pDoc->m_bGreen = !(pDoc->m_bGreen);
  199. pDoc->m_bBlack = FALSE;
  200. pDoc->m_bWhite = FALSE;
  201. break;
  202.  case ID_BLUE:
  203. pDoc->m_bBlue = !(pDoc->m_bBlue);
  204. pDoc->m_bBlack = FALSE;
  205. pDoc->m_bWhite = FALSE;
  206. break;
  207.  default:
  208.  AfxMessageBox(IDS_UNKCOLOR);
  209.  return;
  210. }
  211. MixColors();
  212. }