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

📄 gridsvw4.cpp

📁 mfc internals 源码 mfc internals 源码
💻 CPP
字号:

// gridsvw4.cpp : implementation of the CGridSample4View 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 "gridsvw4.h"
#include "dlguser.h"
#include "mainfrm.h"
#include "gridfrms.h"

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

/////////////////////////////////////////////////////////////////////////////
// CGridSample4View
//
// CGridSample4View illustrates how to override CGXPrintProperties,
// use own tokens for header and footers and connect the derived
// properties object with the grid.
//
// CGridSample4View also illustrates how to register a bitmap control
// and display it in a covered cell
//

IMPLEMENT_DYNCREATE(CGridSample4View, CMyGridView)
IMPLEMENT_SERIAL(CMyProperties, CGXProperties, 0)

static char BASED_CODE szInstruct[] =
		"This view shows a bitmap, some 3d-effects and has registered some header/footer tokens. "
		"Call File->Header/Footer and File->Print Preview to see the tokens. "
		"The bitmap can be applied to cells with Format->Cells->Control.";

#define new DEBUG_NEW

CMyProperties::CMyProperties()
{
	m_nTokDate = AddToken("#DATE#");
	m_nTokText = AddToken("$T");

	CGXData& mapDataHeader = GetDataHeader();
	CGXData& mapDataFooter = GetDataFooter();

	mapDataHeader.DeleteContents();

	mapDataHeader.StoreStyleRowCol(1, 2, CGXStyle()
		.SetValue("Header")
		.SetFont(CGXFont().SetSize(10))
		, gxCopy
		);

	mapDataHeader.StoreStyleRowCol(2, 2, CGXStyle()
		.SetValue("$R")
		.SetFont(CGXFont()
			.SetBold(TRUE)
			.SetSize(16))
		, gxCopy
		);

	mapDataHeader.StoreStyleRowCol(2, 3, CGXStyle()
		.SetValue("Datum: #DATE#{%x, %X}")  // see  GXIntlStrFTime for date formatting
		.SetFont(CGXFont().SetSize(10))
		, gxCopy
		);


	mapDataFooter.DeleteContents();

	mapDataFooter.StoreStyleRowCol(1, 2, CGXStyle()
		.SetValue("Footer")
		.SetFont(CGXFont().SetSize(10).SetBold(TRUE))
		, gxCopy
		);
	mapDataFooter.StoreStyleRowCol(2, 2, CGXStyle()
		.SetValue("- $T -")
		, gxCopy
		);
}

CString CMyProperties::SubstTokenText(int nToken, CString& sRest)
{
	if (nToken == m_nTokDate)
	{
		CString args = GetTokenArgs(sRest);
		if (args.IsEmpty())
			args = "%c";

		char    szBuffer[255];

		// GetCurrentTime
		time_t ti = time(NULL);
		struct tm* ptmTemp = localtime(&ti);
		ASSERT(ptmTemp != NULL); // make sure the time has been initialized!

		if (!GXIntlStrFtime(AfxGetResourceHandle(), GX_IDS_TIME_ADAY1,
				szBuffer, sizeof(szBuffer), args, ptmTemp))
			szBuffer[0] = '\0';
		return szBuffer;
	}
	else if (nToken == m_nTokText)
	{
		return "Text-Token";
	}

	return CGXProperties::SubstTokenText(nToken, sRest);
}

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

/////////////////////////////////////////////////////////////////////////////
// CGridSample4View construction/destruction

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

CGridSample4View::~CGridSample4View()
{
}

BOOL CGridSample4View::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 CGridSample4View::SetupProperties()
{
	ASSERT(GetParam()->GetProperties() == NULL);
	// ASSERTION-> a property object is already connected to parameter-object ->END

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

	// create a property object and connect it with the parameter-object
	CMyProperties* pProp;

	GetParam()->SetProperties(pProp = new CMyProperties);
	pProp->AddDefaultUserProperties();

	pProp->SetCenterHorizontal(TRUE);
	pProp->SetDisplayHorzLines(FALSE);
	pProp->SetPrintHorzLines(FALSE);
	pProp->SetDisplayVertLines(FALSE);
	pProp->SetPrintVertLines(FALSE);
	pProp->SetBlackWhite(TRUE);
	pProp->SetPrintFrame(FALSE);

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

	pProp->SetSection("My Properties"); // extra profile section

	pProp->ReadProfile();
}


/////////////////////////////////////////////////////////////////////////////
// CGridSample4View drawing

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

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

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

	// Register the welcome bitmap
	RegisterControl(IDS_CTRL_BITMAP, new CGXBitmapButton(this, IDB_WELCOME));
	// You can apply this bitmap to cells with Format->Cells->Control

	if (bNew)
	{
		GetParam()->EnableUndo(FALSE);

		SetRowCount(100);
		SetColCount(20);

		// Hide the row header
		SetRowHeight(0, 0, 0);

		// Hide the column header
		SetColWidth(0, 0, 0);

		// Disable tracking column header size
		GetParam()->EnableTrackRowHeight(GX_TRACK_INDIVIDUAL | GX_TRACK_EXTHITTEST | GX_TRACK_NOTHEADER);
			// you can drop GX_TRACK_EXTHITTEST if you don't want the extended size feature

		GetParam()->EnableTrackColWidth(GX_TRACK_INDIVIDUAL | GX_TRACK_EXTHITTEST | GX_TRACK_NOTHEADER);

		// disable selecting cells
		GetParam()->EnableSelection(GX_SELNONE);

		// give the cells some 3d inset effect and a pattern
		StandardStyle()
			.SetDraw3dFrame(gxFrameInset)
			.SetInterior(
				CGXBrush()
					.SetPattern(4)
					.SetColor(RGB(0,0,255)) )   // blue dots
			.SetBorders(gxBorderAll, CGXPen(PS_SOLID, 3, RGB(192,192,192)));

		// ... add the extra width used by borders to the default row-height
		SetDefaultRowHeight(GetDefaultRowHeight()+6);

		// Display the welcome bitmap
		SetCoveredCellsRowCol(5, 2, 16, 6);
		SetStyleRange(CGXRange(5, 2), CGXStyle()
				.SetControl(IDS_CTRL_BITMAP)
				.SetInterior(RGB(192,192,192))
			);

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

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

	// Position the current cell

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

	// Enable Update-Hint-Mechanism

	EnableHints();
}

/////////////////////////////////////////////////////////////////////////////
// CGridSample4View diagnostics

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

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

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

#endif //_DEBUG


/////////////////////////////////////////////////////////////////////////////
// CGridSample4View message handlers

// Menu handler for View->Splitter View

void CGridSample4View::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;

	CGridSample4View* pView = (CGridSample4View*)
		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 CGridSample4View::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 + -