home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Tricks of the Windows Gam…ming Gurus (2nd Edition)
/
Disc2.iso
/
msdn_vcb
/
samples
/
vc98
/
mfc
/
general
/
dynamenu
/
dmdoc.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1998-03-26
|
10KB
|
322 lines
// dmdoc.cpp
//
// 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.
//
// Purpose: implementation of the CDynaMenuDoc class
//
// Functions:
// Most of this file was generated by AppWizard. The functions
// which contain code specific to this sample are:
//
// CDynaMenuDoc::CDynaMenuDoc() -- document constructor
// CDynaMenuDoc::DoSelectColor() -- handle text color commands
// CDynaMenuDoc::DoUpdateSelectColor() -- update text color UI objects
// CDynaMenuDoc::GetMessageString() -- get status msg for color cmds
// CDynaMenuDoc::OnCmdMsg() -- perform command routing
// CDynaMenuDoc::OnColorOptions() -- display color options dialog
#include "stdafx.h"
#include "dynamenu.h"
#include "dmdoc.h"
#include "coloropt.h" // for CColorOptDlg
#include "mdichild.h" // for CDynaMDIChildWnd
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// This table defines the possible text colors which will be displayed in
// the color options dialog. The colors selected in the options dialog
// for a document will appear on the Color submenu when that document is
// active.
//
DynaMenuDef CDynaMenuDoc::m_aColorDef[NUM_TEXTCOLOR] =
{
{ IDS_BLACK, ID_COLOR1, RGB(0, 0, 0) },
{ IDS_RED, ID_COLOR2, RGB(128, 0, 0) },
{ IDS_PURPLE, ID_COLOR3, RGB(128, 0, 128) },
{ IDS_BLUE, ID_COLOR4, RGB(0, 0, 128) },
};
/////////////////////////////////////////////////////////////////////////////
// CDynaMenuDoc
IMPLEMENT_DYNCREATE(CDynaMenuDoc, CDocument)
BEGIN_MESSAGE_MAP(CDynaMenuDoc, CDocument)
//{{AFX_MSG_MAP(CDynaMenuDoc)
ON_COMMAND(ID_COLOR_OPTIONS, OnColorOptions)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
#define new DEBUG_NEW
/////////////////////////////////////////////////////////////////////////////
// CDynaMenuDoc construction/destruction
CDynaMenuDoc::CDynaMenuDoc()
{
// Initialize document data. Start out by allowing all possible
// text colors and default to using the first one.
m_iColor = 0;
for (int i = 0; i < NUM_TEXTCOLOR; i++)
m_abAllowColor[i] = TRUE;
}
CDynaMenuDoc::~CDynaMenuDoc()
{
}
BOOL CDynaMenuDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CDynaMenuDoc serialization
void CDynaMenuDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
}
else
{
// TODO: add loading code here
}
}
/////////////////////////////////////////////////////////////////////////////
// CDynaMenuDoc diagnostics
#ifdef _DEBUG
void CDynaMenuDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CDynaMenuDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDynaMenuDoc implementation
//***********************************************************************
// Function: CDynaMenuDoc::OnCmdMsg()
//
// Purpose:
// OnCmdMsg() is called by the framework to route and dispatch
// command messages and to handle the update of command
// user-interface objects.
//
// Here we extend the standard command routing to intercept command
// messages with variable command IDs. In this sample, the
// currently defined text color options are stored in
// CDynaMenuDoc::m_aColorDef. Each element of this array contains
// the command ID associated with that color. When a command ID
// is passed to this function, we search m_aColorDef for a matching
// command ID. If one is found, we process the message. Otherwise,
// we route the command to the standard OnCmdMsg processing.
//
// Parameters:
// nID -- contains the command ID
// nCode -- identifies the command notification code
// pExtra -- used according to the value of nCode
// pHandlerInfo -- if not NULL, filled in with pTarget and pmf
// members of CMDHANDLERINFO structure, instead
// of dispatching the command. Typically NULL.
//
// Returns:
// nonzero if message handled, otherwise 0.
//
// Comments:
// See the documentation for CCmdTarget::OnCmdMsg() for further
// information. Command routing is also discussed in tech note #21.
//
//***********************************************************************
BOOL CDynaMenuDoc::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo)
{
// If pHandlerInfo is NULL, then handle the message
if (pHandlerInfo == NULL)
{
// Filter the commands sent to a text color menu option
for (int i = NUM_TEXTCOLOR-1; i >= 0; i--)
{
if (nID == m_aColorDef[i].m_nID)
{
if (nCode == CN_COMMAND)
{
// Handle WM_COMMAND message
DoSelectColor(i);
}
else if (nCode == CN_UPDATE_COMMAND_UI)
{
// Update UI element state
DoUpdateSelectColor(i, (CCmdUI*)pExtra);
}
return TRUE;
}
}
}
// If we didn't process the command, call the base class
// version of OnCmdMsg so the message-map can handle the message
return CDocument::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
//***********************************************************************
// Function: CDynaMenuDoc::DoSelectColor()
//
// Purpose:
// DoSelectColor processes text color command messages for
// CDynaMenuDoc::OnCmdMsg(). It updates the document member variable
// m_iColor and calls UpdateAllViews() to redraw the document's
// views.
//
// Parameters:
// iColor -- index into CDynaMenuDoc::m_aColorDef for new
// color selection
//
// Returns:
// none.
//
// Comments:
// In the debug version, an assert is generated if the index is
// out of bounds or if the specified color is not currently
// enabled for the document.
//
//***********************************************************************
void CDynaMenuDoc::DoSelectColor(int iColor)
{
ASSERT(iColor >= 0 && iColor < NUM_TEXTCOLOR);
ASSERT(m_abAllowColor[iColor] == TRUE);
m_iColor = iColor;
UpdateAllViews(NULL);
}
//***********************************************************************
// Function: CDynaMenuDoc::DoUpdateSelectColor()
//
// Purpose:
// DoUpdateSelectColor handled the updates to user-interface objects
// associated with text color command messages for
// CDynaMenuDoc::OnCmdMsg(). If the item is associated with the
// currently selected text color for the document, the item is checked.
//
// Parameters:
// iColor -- index into CDynaMenuDoc::m_aColorDef for new
// color selection
//
// Returns:
// none.
//
// Comments:
// In the debug version, an assert is generated if the index is
// out of bounds or if the item is disabled for the document.
//
//***********************************************************************
void CDynaMenuDoc::DoUpdateSelectColor(int iColor, CCmdUI* pCmdUI)
{
ASSERT(iColor >= 0 && iColor < NUM_TEXTCOLOR);
ASSERT(m_abAllowColor[iColor] == TRUE);
pCmdUI->SetCheck(m_iColor == iColor);
pCmdUI->Enable(TRUE);
}
//***********************************************************************
// Function: CDynaMenuDoc::GetMessageString()
//
// Purpose:
// GetMessageString formats and returns a string containing the
// message text to display in a status bar for any of the color
// selection commands.
//
// Parameters:
// nID -- command ID to get message for
// strMessage -- buffer to fill with message
//
// Returns:
// TRUE if nID is a color selection command ID, otherwise FALSE.
//
// Comments:
// If the function returns FALSE, strMessage is not changed
//
//***********************************************************************
BOOL CDynaMenuDoc::GetMessageString(UINT nID, CString& strMessage)
{
for (int i = 0; i < NUM_TEXTCOLOR; i++)
{
if (m_aColorDef[i].m_nID == nID)
{
CString strColor;
strColor.LoadString(m_aColorDef[i].m_nString);
AfxFormatString1(strMessage, IDS_COLORHELPFMT, strColor);
return TRUE;
}
}
return FALSE;
}
/////////////////////////////////////////////////////////////////////////////
// CDynaMenuDoc commands
//***********************************************************************
// Function: CDynaMenuDoc::OnColorOptions()
//
// Purpose:
// OnColorOptions displays a dialog which allows the user to pick
// the text colors which should be displayed on the Color submenu
// when the document is active.
//
// Parameters:
// none.
//
// Returns:
// none.
//
// Comments:
// none.
//
//***********************************************************************
void CDynaMenuDoc::OnColorOptions()
{
CColorOptDlg dlg(this);
if (dlg.DoModal())
{
// find the MDI frame window associated with this document
POSITION pos = GetFirstViewPosition();
CView* pview = GetNextView(pos);
ASSERT(pview != NULL);
CDynaMDIChildWnd* pwnd = (CDynaMDIChildWnd*)pview->GetParentFrame();
ASSERT_KINDOF(CDynaMDIChildWnd, pwnd);
// force an update of the Color submenu
pwnd->RefreshColorMenu();
}
}