⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gridsvw3.cpp

📁 mfc internals 源码 mfc internals 源码
💻 CPP
字号:
// gridsvw3.cpp : implementation of the CGridSample3View class
//

// This is a part of the Objective Grid C++ Library.
// Copyright (C) 1995 ClassWorks, Stefan Hoenig.
// All rights reserved.
//
// This source code is only intended as a supplement to
// the Objective Grid Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding
// the Objective Grid product.
//

#include "stdafx.h"
#include "gridapp.h"

#include "gridsdoc.h"
#include "gridsvw3.h"
#include "dlguser.h"
#include "mainfrm.h"
#include "gridfrms.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGridSample3View
//
// Composition of styles is a very powerful feature of Objective Grid/MFC.
// CGridSample3View shows you how to create and modify base styles which the
// user can modify through the styles-dialog. (Menu: Format->Styles)
// and change some properties, parameters
//
// CGridSample3View also shows you how to inhibit dragging columns
// depending on context (e.g. not to move unfrozen columns to frozen colums).
// See OnSelDragColsStart and OnSelDragColsMove.
//
// Finally, CGridSample3View illustrates how to freeze rows or columns,
// use several rows or columns for headers and the possibility to use
// SetCoveredCellsRowCol with Column headers.
//

IMPLEMENT_DYNCREATE(CGridSample3View, CMyGridView)

static char BASED_CODE szErrorStyle[] = "Error Style";
static char BASED_CODE szComboStyle[] = "Combo Style";

static char BASED_CODE szInstruct[] =
		"This view shows the usage of base styles and the possibility to use "
		"several rows or columns as headers and to freeze columns. "
		"You can call Format->Styles to add or modify base styles.";


#define new DEBUG_NEW

BEGIN_MESSAGE_MAP(CGridSample3View, CMyGridView)
	//{{AFX_MSG_MAP(CGridSample3View)
	ON_COMMAND(ID_VIEW_USERACTIONS, OnViewUseractions)
	ON_COMMAND(ID_VIEW_SPLITTERVIEW, OnViewSplitterview)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGridSample3View construction/destruction

CGridSample3View::CGridSample3View()
{
	// TODO: add construction code here
}

CGridSample3View::~CGridSample3View()
{
}

BOOL CGridSample3View::ConnectParam()
{
	// Note: this method is copied from CGridSampleView
	//

	BOOL bNew = FALSE;

	// Retrive the zero-based worksheet-id if used as worksheet
	if (GetParentTabWnd(this, TRUE))
		m_nViewID = GetParentTabViewID(this);

	// check if it is a new pane in a splitter window
	CSplitterWnd* pSplitterWnd = GetParentDynamicSplitter(this, TRUE);
	if (pSplitterWnd != NULL)
	{
		CGXGridView *pView = (CGXGridView *) pSplitterWnd->GetPane(0, 0);
		if (pView != this)
			m_nViewID = pView->GetViewID();
	}

	// check if parameter-object exist (in document)
	if (GetDocument()->GetParam(m_nViewID) == NULL)
	{
		// create a parameter-object on the heap
		GetDocument()->SetParam(m_nViewID, new CGXGridParam);

		bNew = TRUE;    // this view needs initializing
	}

	// connect parameter-object with grid
	SetParam((CGXGridParam*) GetDocument()->GetParam(m_nViewID), FALSE);

	return bNew;
}

void CGridSample3View::SetupBaseStyles()
{
	ASSERT(GetParam()->GetStylesMap() == NULL);
	// ASSERTION-> a stylesmap is already connected to parameter-object ->END

	if (GetParam()->GetStylesMap() != NULL)
		return;

	// create a stylesmap and connect it with the parameter-object
	CGXStylesMap* pStyMap;

	GetParam()->SetStylesMap(pStyMap = new CGXStylesMap);

	// create standard styles
	pStyMap->CreateStandardStyles();

	// Add some base styles

	// "Combo Style" - A style with a combo box and choice list
	pStyMap->RegisterStyle(szComboStyle,
			CGXStyle()
				.SetControl(GX_IDS_CTRL_CBS_DROPDOWNLIST)
				.SetChoiceList("one\r\ntwo\r\nthree\r\nfour\r\nfive\r\nsix\r\n"),
			TRUE    // system-style (non removable)
		);

	// "Error Style" - Yellow text on red backcolor with a bold font
	pStyMap->RegisterStyle(szErrorStyle,
			CGXStyle()
				.SetTextColor(RGB(255,255,0))   // yellow
				.SetInterior(RGB(255,0,0))      // red
				.SetFont(
					CGXFont()
						.SetBold(TRUE)
					),
			TRUE    // system-style (non removable)
		);

	// I do also want to adapt the base styles:

	// StandardStyle() calls pStyMap->LookupStyle(pStyMap->m_wStyleStandard, ...)
	// and returns a reference to the Standard-Style.
	//
	// So, I can simply adapt this style's settings to my needs.

	StandardStyle()
		.SetFont( CGXFont()
			.SetFaceName("Times New Roman")
			.SetSize(9) );

	RowHeaderStyle()
		.SetTextColor(RGB(0,0,255) );

	// Now, read the styles from profile.
	// Note that reading style from profile can override the previous settings.
	// The previous settings are standard settings.

	pStyMap->SetSection("My Base Styles");  // extra profile section

	pStyMap->ReadProfile();
}


/////////////////////////////////////////////////////////////////////////////
// CGridSample3View drawing

void CGridSample3View::OnInitialUpdate()
{
	BOOL bNew = ConnectParam();

	if (bNew)
		SetupBaseStyles();  // Setup base styles and read them from profile

	CMyGridView::OnInitialUpdate(); // Creates all objects and links them to the grid

	// check out identifiers for the styles previously registered with RegisterStyle
	m_wStyleCombo = GetParam()->GetStylesMap()->GetBaseStyleId(szComboStyle);
	m_wStyleError = GetParam()->GetStylesMap()->GetBaseStyleId(szErrorStyle);

	// you could use these identifiers later if you want to change the style
	// e.g.
	//     BaseStyle(m_wStyleCombo)
	//         .SetChoiceList("one\ntwo\nthree");
	//
	// where BaseStyle(id) is a member function of CGXGridCore which returns a
	// reference to the specified base-style.
	//
	// You need this identifier if you want to apply this base-style to cells
	// e.g.
	//  SetStyleRange(
	//      CGXRange(5,2,8,3),
	//      CGXStyle()
	//          .SetBaseStyle(m_wStyleCombo)
	//      );

	if (bNew)
	{
		// Don't create undo-information for the following commands
		GetParam()->EnableUndo(FALSE);
		// (at the end of this procedure, I will reenable it)

		// Number of rows and columns
		SetRowCount(100);
		SetColCount(20);

		// Now you can apply base styles to cells

		SetStyleRange(
			CGXRange(5,2,8,3),
			CGXStyle()
				.SetBaseStyle(m_wStyleCombo)
				.SetValue("one")
			);

		// Optimize row heights
		ResizeRowHeightsToFit(CGXRange(5,2,8,2));

		SetStyleRange(
			CGXRange(5,4,8,5),
			CGXStyle()
				.SetBaseStyle(m_wStyleError)
				.SetValue("ALERT!")
			);

		// ... and row
		SetStyleRange(
			CGXRange().SetRows(10,11),      // Rows 10 to 11
			CGXStyle()
				.SetValue(szErrorStyle)
				.SetBaseStyle(m_wStyleError)
			);

		// Instructions
		SetCoveredCellsRowCol(1, 1, 3, 5);
		SetStyleRange(CGXRange(1,1),
			CGXStyle()
				.SetWrapText(TRUE)
				.SetEnabled(FALSE)
				.SetFont(CGXFont().SetFaceName("Times New Roman"))
				.SetInterior(RGB(255,251,240))   // Off-white
				.SetHorizontalAlignment(DT_CENTER)
				.SetVerticalAlignment(DT_VCENTER)
				.SetControl(GX_IDS_CTRL_STATIC)
				.SetBorders(gxBorderAll, CGXPen().SetWidth(2))
				.SetValue(szInstruct));

		// freeze 3 columns, use 1 extra row as header ( + standard header at column 0)
		SetFrozenCols(3, 1);

		// freeze 3 rows, use 3 extra columns as headers ( + standard header at row 0)
		SetFrozenRows(3, 3);

		// Do not draw column headers pressed when moving the current cell
		GetParam()->GetProperties()->SetMarkColHeader(FALSE);

		// Use covered cells even with row headers
		SetCoveredCellsRowCol(5,0,7,0);

		SetStyleRange(CGXRange(5,0), "Covered Header");

		// Enable ceration of undo-information for user interactions
		GetParam()->EnableUndo(TRUE);
	}

	// Position the current cell

	SetCurrentCell(4, 2, FALSE /* avoid immediate updating */);

	// Enable Update-Hint-Mechanism

	EnableHints();
}

// Inhibit dragging frozen columns.

BOOL CGridSample3View::OnSelDragColsStart(ROWCOL nFirstCol, ROWCOL)
{
	return nFirstCol > GetFrozenCols();

}

// Inhibit dragging columns to nonfrozen columns.
// The grid will display a "no drop"-cursor if OnSelDragColsMove returns FALSE.

BOOL CGridSample3View::OnSelDragColsMove(ROWCOL, ROWCOL, ROWCOL nDestCol)
{
	return nDestCol > GetFrozenCols();
}

/////////////////////////////////////////////////////////////////////////////
// CGridSample3View diagnostics

#ifdef _DEBUG
void CGridSample3View::AssertValid() const
{
	CMyGridView::AssertValid();
}

void CGridSample3View::Dump(CDumpContext& dc) const
{
	CMyGridView::Dump(dc);
}

CGridSampleDoc* CGridSample3View::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGridSampleDoc)));
	return (CGridSampleDoc*) m_pDocument;
}

#endif //_DEBUG


/////////////////////////////////////////////////////////////////////////////
// CGridSample3View message handlers

// Menu handler for View->Splitter View

void CGridSample3View::OnViewSplitterview()
{
	CDocument* pDoc = GetDocument();

	CMyMultiDocTemplate* pTemplate
		= (CMyMultiDocTemplate*) ((CGridSampleApp*) AfxGetApp())->m_pSplitterTemplate;

	pTemplate->SetViewClass(GetRuntimeClass());

	CMDIChildWnd* pNewFrame
		= (CMDIChildWnd*) pTemplate->CreateNewFrame(GetDocument(), NULL);

	if (pNewFrame == NULL)
		return;     // not created

	ASSERT(pNewFrame->IsKindOf(RUNTIME_CLASS(CSplitterMDIChildWnd)));

	CSplitterWnd& splitter = (CSplitterWnd&)
		((CSplitterMDIChildWnd *) pNewFrame)->m_wndSplitter;

	CGridSample3View* pView = (CGridSample3View*)
		splitter.GetPane(0, 0);

	// Set view id to active tab view id
	pView->m_nViewID = m_nViewID;

	pTemplate->InitialUpdateFrame(pNewFrame, pDoc);

	pNewFrame->GetActiveView();
	ASSERT(pView);
}

// Menu handler for View->User Actions...

void CGridSample3View::OnViewUseractions()
{
	// Note: this method is copied from CGridSampleView
	//
	// Shows a dialog with some attributes of the parameter-object
	// where you can experiment with some attributes
	// such as allowing the user to track columns, select cells
	// or use the grid as a listbox.

	// Transfer Current Cell's Data to grid
	if (!TransferCurrentCell())
		return;

	CUserActionsDialog dlg(GetParam());

	if (dlg.DoModal() == IDOK)
	{
		// Redraw the grid
		Redraw();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -