// HelloVw.cpp : implementation of the CHelloView class // // This is a part of the Microsoft Foundation Classes C++ library. // Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Foundation Classes Reference and related // electronic documentation provided with the library. // See these sources for detailed information regarding the // Microsoft Foundation Classes product. #include "stdafx.h" #include "MDI.h" #include "HelloDoc.h" #include "HelloVw.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CHelloView IMPLEMENT_DYNCREATE(CHelloView, CView) BEGIN_MESSAGE_MAP(CHelloView, CView) //{{AFX_MSG_MAP(CHelloView) ON_UPDATE_COMMAND_UI(ID_BLUE, OnUpdateBlue) ON_UPDATE_COMMAND_UI(ID_GREEN, OnUpdateGreen) ON_UPDATE_COMMAND_UI(ID_RED, OnUpdateRed) ON_UPDATE_COMMAND_UI(ID_WHITE, OnUpdateWhite) ON_UPDATE_COMMAND_UI(ID_BLACK, OnUpdateBlack) ON_COMMAND(ID_CUSTOM, OnCustom) ON_UPDATE_COMMAND_UI(ID_CUSTOM, OnUpdateCustom) ON_COMMAND(ID_BLACK, OnColor) ON_COMMAND(ID_BLUE, OnColor) ON_COMMAND(ID_GREEN, OnColor) ON_COMMAND(ID_RED, OnColor) ON_COMMAND(ID_WHITE, OnColor) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CHelloView construction/destruction CHelloView::CHelloView() { } CHelloView::~CHelloView() { } BOOL CHelloView::PreCreateWindow(CREATESTRUCT& cs) { return CView::PreCreateWindow(cs); } ///////////////////////////////////////////////////////////////////////////// // CHelloView drawing void CHelloView::OnDraw(CDC* pDC) { CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CRect rect; COLORREF clr = pDoc->m_clrText; CString tmpStr = pDoc->m_str; pDC->SetTextColor(clr); pDC->SetBkColor(::GetSysColor(COLOR_WINDOW)); GetClientRect(rect); pDC->DrawText(tmpStr, -1, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); } ///////////////////////////////////////////////////////////////////////////// // CHelloView diagnostics #ifdef _DEBUG void CHelloView::AssertValid() const { CView::AssertValid(); } void CHelloView::Dump(CDumpContext& dc) const { CView::Dump(dc); } CHelloDoc* CHelloView::GetDocument() // non-debug version is inline { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHelloDoc))); return (CHelloDoc*)m_pDocument; } #endif //_DEBUG ///////////////////////////////////////////////////////////////////////////// // CHelloView message handlers // Update handlers for each color void CHelloView::OnUpdateBlue(CCmdUI* pCmdUI) { CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pCmdUI->SetCheck(pDoc->m_bBlue); } void CHelloView::OnUpdateGreen(CCmdUI* pCmdUI) { CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pCmdUI->SetCheck(pDoc->m_bGreen); } void CHelloView::OnUpdateRed(CCmdUI* pCmdUI) { CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pCmdUI->SetCheck(pDoc->m_bRed); } void CHelloView::OnUpdateWhite(CCmdUI* pCmdUI) { CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pCmdUI->SetCheck(pDoc->m_bWhite); } void CHelloView::OnUpdateBlack(CCmdUI* pCmdUI) { CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pCmdUI->SetCheck(pDoc->m_bBlack); } void CHelloView::MixColors() { CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); COLORREF tmpClr; int r, g, b; BOOL bSetColor; // Determine which colors are currently chosen. bSetColor = pDoc->m_bRed || pDoc->m_bGreen || pDoc->m_bBlue || pDoc->m_bWhite || pDoc->m_bBlack; // If the current color is custom, ignore mix request. if(!bSetColor && pDoc->m_bCustom) return; // Set color value to black and then add the necessary colors. r = g = b = 0; if(pDoc->m_bRed) r = 255; if(pDoc->m_bGreen) g = 255; if(pDoc->m_bBlue) b = 255; tmpClr = RGB(r, g, b); // NOTE: Because a simple algorithm is used to mix colors // if the current selection contains black or white, the // result will be black or white; respectively. This is due // to the additive method for mixing the colors. if(pDoc->m_bBlack) tmpClr = RGB(0, 0, 0); if(pDoc->m_bWhite) tmpClr = RGB(255, 255, 255); // Once the color has been determined, update document // data, and force repaint of all views. if(!bSetColor) pDoc->m_bBlack = TRUE; pDoc->m_clrText = tmpClr; pDoc->m_bCustom = FALSE; pDoc->UpdateAllViews(NULL); } void CHelloView::OnCustom() { CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CColorDialog dlgColor(pDoc->m_clrText); if (dlgColor.DoModal() == IDOK) { pDoc->m_clrText = dlgColor.GetColor(); pDoc->ClearAllColors(); pDoc->m_bCustom = TRUE; pDoc->UpdateAllViews(NULL); } } void CHelloView::OnUpdateCustom(CCmdUI* pCmdUI) { CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pCmdUI->SetCheck(pDoc->m_bCustom); } void CHelloView::OnColor() { CHelloDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); UINT m_nIDColor; m_nIDColor = LOWORD(GetCurrentMessage()->wParam); // Determines the color being modified // and then updates the color state switch(m_nIDColor) { case ID_BLACK: pDoc->ClearAllColors(); pDoc->m_bBlack = !(pDoc->m_bBlack); break; case ID_WHITE: pDoc->ClearAllColors(); pDoc->m_bWhite = !(pDoc->m_bWhite); break; case ID_RED: pDoc->m_bRed = !(pDoc->m_bRed); pDoc->m_bBlack = FALSE; pDoc->m_bWhite = FALSE; break; case ID_GREEN: pDoc->m_bGreen = !(pDoc->m_bGreen); pDoc->m_bBlack = FALSE; pDoc->m_bWhite = FALSE; break; case ID_BLUE: pDoc->m_bBlue = !(pDoc->m_bBlue); pDoc->m_bBlack = FALSE; pDoc->m_bWhite = FALSE; break; default: AfxMessageBox(IDS_UNKCOLOR); return; } MixColors(); }