www.pudn.com > dockmenubar_demo.zip > hellovw.cpp


// HelloVw.cpp : implementation of the CHelloView class 
// 
 
// This is a part of the Microsoft Foundation Classes C++ library. 
// Copyright (C) 1992-1997 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(); 
}