|
|
// 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(); }
|