spwnd.cpp

来自「MFC编程实例」· C++ 代码 · 共 145 行

CPP
145
字号
#include "StdAfx.h"
#include "SpWnd.h"

#define ONE_STEP_MOVE	6

IMPLEMENT_DYNCREATE(MCSplitterWnd, CSplitterWnd)

BEGIN_MESSAGE_MAP(MCSplitterWnd, CSplitterWnd)
	//{{AFX_MSG_MAP(MCSplitterWnd)
	//}}AFX_MSG_MAP
	ON_WM_LBUTTONDOWN()
END_MESSAGE_MAP()

MCSplitterWnd::MCSplitterWnd() : CSplitterWnd()
{
	m_bResizable=TRUE;
}

void MCSplitterWnd::DeleteRow(int rowDelete)
{
	int nNumRows;

	nNumRows=GetRowCount();
	if(nNumRows < 2)
	{
		CSplitterWnd::DeleteRow(rowDelete);
	}
	else
	{
		int nCyCur, nCyMin;
		
		GetRowInfo(0, nCyCur, nCyMin);
		nCyCur+=ONE_STEP_MOVE;
		SetRowInfo(0, nCyCur, nCyMin);
		
		GetRowInfo(1, nCyCur, nCyMin);
		nCyCur-=ONE_STEP_MOVE;
		if(nCyCur < nCyMin)
		{
			CSplitterWnd::DeleteRow(rowDelete);
		}
		else
		{
			SetRowInfo(1, nCyCur, nCyMin);
			RecalcLayout();
		}
	}
}

void MCSplitterWnd::DeleteColumn(int colDelete)
{
	int nNumColumns;

	nNumColumns=GetColumnCount();
	if(nNumColumns < 2)
	{
		CSplitterWnd::DeleteColumn(colDelete);
	}
	else
	{
		int nCxCur, nCxMin;
		
		GetColumnInfo(0, nCxCur, nCxMin);
		nCxCur+=ONE_STEP_MOVE;
		SetColumnInfo(0, nCxCur, nCxMin);
		
		GetColumnInfo(1, nCxCur, nCxMin);
		nCxCur-=ONE_STEP_MOVE;
		if(nCxCur < nCxMin)
		{
			CSplitterWnd::DeleteColumn(colDelete);
		}
		else
		{
			SetColumnInfo(1, nCxCur, nCxMin);
			RecalcLayout();
		}
	}
}

void MCSplitterWnd::OnDrawSplitter
(
	CDC* pDC,
	ESplitType nType,
	const CRect& rect
)
{
	CBrush brush;
	CBrush *ptrBrushOld;

	if(pDC == NULL)
	{
		CSplitterWnd::OnDrawSplitter(pDC, nType, rect);
		return;
	}
	switch(nType)
	{
		case CSplitterWnd::splitBox:
		{
			VERIFY(brush.CreateSolidBrush(RGB(255, 0, 0)));
			break;
		}
		case CSplitterWnd::splitBar:
		{
			VERIFY(brush.CreateSolidBrush(RGB(0, 255, 0)));
			break;
		}
		case CSplitterWnd::splitIntersection:
		case CSplitterWnd::splitBorder:
		{
			CSplitterWnd::OnDrawSplitter(pDC, nType, rect);
			return;
		}
	}
	ptrBrushOld=pDC->SelectObject(&brush);
	pDC->Rectangle(rect);
	pDC->SelectObject(ptrBrushOld);
	brush.DeleteObject();
}

void MCSplitterWnd::OnInvertTracker(const CRect& rect)
{
	CDC* pDC;
	CBrush brush;
	CBrush *ptrBrushOld;

	ASSERT_VALID(this);
	ASSERT(!rect.IsRectEmpty());
	ASSERT((GetStyle() & WS_CLIPCHILDREN) == 0);

	pDC=GetDC();
	brush.CreateSolidBrush(RGB(255, 0, 0));
	ptrBrushOld=pDC->SelectObject(&brush);
	pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(), PATINVERT);
	pDC->SelectObject(ptrBrushOld);
	brush.DeleteObject();
	ReleaseDC(pDC);
}

void MCSplitterWnd::OnLButtonDown(UINT uFlags, CPoint point)
{
	if(m_bResizable == TRUE)CSplitterWnd::OnLButtonDown(uFlags, point);
	else CWnd::OnLButtonDown(uFlags, point);
}

⌨️ 快捷键说明

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