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

📄 gridsvw.cpp

📁 mfc internals 源码 mfc internals 源码
💻 CPP
字号:
// gridsvw.cpp : implementation of the CGridSampleView 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 "gridsvw.h"
#include "dlguser.h"
#include "mainfrm.h"
#include "gridfrms.h"

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

/////////////////////////////////////////////////////////////////////////////
// CGridSampleView
//
// CGridSampleView can be used as standalone, splitter or worksheet gridview.
//
// As described in the overview of the programmers guide,
// it is necessary to attach a parameter-object to the grid
// and attach several other objects as a property-object, a data-object,
// a printdevice-object and stylesmap-object to the parameter-object.
//
// CGridSampleDoc maintains an array with parameter objects.
// CGridSampleView initializes m_nViewID with its worksheet id
// or 0 if it is used as standalone view.
// m_nViewID is used as index for the parameters stored in CGridSampleDoc.
//
// CGridSampleView checks if parameter-object exists for the m_nViewID index
// and connects this parameter-object with the gridview. If the parameter
// object is not existing, one is created on the heap.
//
// Next, CGridSampleView calls OnInitialUpdate to initialize all other objects.
// When the view is closed, all these objects will be destroyed.
//
// CGridSampleView enables hint creation by calling EnableHints().
// To avoid setting the document dirty when initial commands are executed,
// EnableHints() is called as last command in OnInitialUpdate.
//
// To prevent the user undoing the initial commands, OnInitialUpdate calls
// GetParam()->EnableUndo(FALSE) and after executing inital commands
// GetParam()->EnableUndo(TRUE).

// CGridSampleView also illustrates how to apply cell some simple formattings.
//

static char BASED_CODE szInstruct[] =
		"This is a simple gridview. You can move the current cell, "
		"edit the cell contents, zoom the view, change the printers settings, "
		"and ...";

IMPLEMENT_DYNCREATE(CGridSampleView, CMyGridView)

#define new DEBUG_NEW

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

/////////////////////////////////////////////////////////////////////////////
// CGridSampleView construction/destruction

CGridSampleView::CGridSampleView()
{
}

CGridSampleView::~CGridSampleView()
{
}

BOOL CGridSampleView::ConnectParam()
{
	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 CGridSampleView::OnInitialUpdate()
{
	BOOL bNew = ConnectParam();

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

	// Now, all objects are connected:
	ASSERT(GetParam() != NULL);                     // parameter object
	ASSERT(GetParam()->GetProperties() != NULL);    // properties object (with header-/footer, colors,...)
	ASSERT(GetParam()->GetStylesMap() != NULL);     // stylesmap object (with base styles)
	ASSERT(GetParam()->GetData() != NULL);          // data object (with cell's data)
	ASSERT(GetParam()->GetPrintDevice() != NULL);   // printdevice object (with printer settings)

	// ... and you can execute commands on the grid

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

		// Change default background color
		//   StandardStyle() returns a reference to the "Standard-Style".
		//   All cells in the grid inherit their attributes from this Standard-Style
		//   The user can change the Standard-Style with menu Format|Styles.

		StandardStyle()
				.SetInterior(RGB(255,255,255));

		// Turn off row-numbers
		//   RowHeaderStyle() returns a reference to the "Row Header-Style".
		RowHeaderStyle()
				.SetValue("");

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

		// Apply some formattings to the cells
		SetStyleRange(CGXRange(5,1), CGXStyle().SetValue("Hello"));

		// You can call SetStyleRange several times on the same cell
		SetStyleRange(CGXRange(6,1), CGXStyle().SetValue("world!"));
		// you could also call:
		//     SetStyleRange(CGXRange(6,1), "world!");

		// .. right alignment is added to the cell's formatting
		SetStyleRange(CGXRange(6,1), CGXStyle().SetHorizontalAlignment(DT_RIGHT));

		// ... or you can call SetStyleRange with several attributes.
		SetStyleRange(
			CGXRange(8,2,12,3),
			CGXStyle()
				.SetValue("ABC")
				.SetTextColor(RGB(255,255,0))   // Bright Yellow
				.SetDraw3dFrame(gxFrameInset)   // "inset" 3d-effect
				.SetInterior(
					CGXBrush()
						.SetPattern(14)         // "////" - Pattern, red lines, blue background
						.SetColor(RGB(255,0,0))
						.SetBkColor(RGB(0,0,255)) )
				.SetMaxLength(4)                // Limit input to 4 chars
				.SetBorders(gxBorderAll,
					CGXPen()
						.SetColor(RGB(192,192,192)) )   // grey border
				.SetHorizontalAlignment(DT_CENTER));

		// Automatically adapt row heights to the previous block of cell
		ResizeRowHeightsToFit( CGXRange(8,2,12,3) );

		// apply a style to rows
		SetStyleRange(CGXRange().SetRows(7, 13),
			CGXStyle()
				.SetAutoSize(TRUE)              // automatically resize cells when user enters text
				.SetInterior(RGB(192,192,192))  // grey background
			);

		// Instructions
		SetCoveredCellsRowCol(1, 1, 3, 5);
		SetStyleRange(CGXRange(1, 1),
			CGXStyle()
				.SetWrapText(TRUE)              // wrap text
				.SetEnabled(FALSE)              // inhibit usage as current cell
				.SetFont(
					CGXFont()
						.SetFaceName("Times New Roman") )
				.SetInterior(RGB(255,251,240))   // Off-white
				.SetHorizontalAlignment(DT_CENTER)
				.SetVerticalAlignment(DT_VCENTER)
				.SetControl(GX_IDS_CTRL_STATIC) // Static Text
				.SetBorders(gxBorderAll,
					CGXPen()
						.SetWidth(2))           // black border, 2-pixels thick
				.SetValue(szInstruct));

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

		// Draw border in current cell
		CGXProperties* pProp = GetParam()->GetProperties();
		pProp->SetUserProperty(GX_IDS_OUTLINECURRENTCELL,
			 (CGXStyle)(pProp->sInvertDrawBorder)); // need cast to compile
	}

	// Position the current cell

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

	// Enable Update-Hint-Mechanism
	// You should put this line as last command into OnInitialUpdate,
	// becaus as long as EnableHints is not called, the modified flag
	// of the document will not be changed.

	EnableHints();
}

/////////////////////////////////////////////////////////////////////////////
// CGridSampleView diagnostics

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

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

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

#endif //_DEBUG


/////////////////////////////////////////////////////////////////////////////
// CGridSampleView message handlers

// Menu handler for View->Splitter View

void CGridSampleView::OnViewSplitterview()
{
	// Creates a new CSplitterMDIChildWnd frame with a CGridSampleView
	// and initializes it with the same view id.

	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;

	CGridSampleView* pView = (CGridSampleView*)
		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 CGridSampleView::OnViewUseractions()
{
/*
	just some performance checking

	((CMDIChildWnd*) GetParentFrame())->MDIMaximize();

	OnViewZoomin();
	OnViewZoomin();
	OnViewZoomin();

	OnViewZoomout();
	OnViewZoomout();
	OnViewZoomout();
	OnViewZoomout();
	OnViewZoomout();

	OnViewZoomin();
	OnViewZoomin();
	OnViewZoomin();
	OnViewZoomin();
	OnViewZoomin();

	OnViewZoomout();
	OnViewZoomout();
	OnViewZoomout();

	ProcessKeys(this, WM_CHAR, 20, 1, 0);
*/

	// 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 + -