windows-nt/Source/XPSP1/NT/sdktools/unicows/samples/mdidocvw/godot/hellovw.cpp
2020-09-26 16:20:57 +08:00

266 lines
5.6 KiB
C++

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