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

📄 source.cpp

📁 在视图里实现链表
💻 CPP
字号:
// Source.cpp : implementation file
//

#include "stdafx.h"
#include "MyHeader.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CNode

IMPLEMENT_DYNCREATE(CNode, CCmdTarget)

CNode::CNode()
{
	m_nLVal=m_nRVal=0;
	m_nXPos=m_nYPos=0;
	m_pNext=m_pPrev=NULL;
	m_bCurrent=FALSE;
}

CNode::~CNode()
{
}


BEGIN_MESSAGE_MAP(CNode, CCmdTarget)
	//{{AFX_MSG_MAP(CNode)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CNode message handlers
/////////////////////////////////////////////////////////////////////////////
// CDataList

IMPLEMENT_DYNCREATE(CDataList, CCmdTarget)

CDataList::CDataList()
{
	m_pHead=m_pTail=m_pCurrent=NULL;
	m_nNodeCount=0;
}

CDataList::~CDataList()
{
}


BEGIN_MESSAGE_MAP(CDataList, CCmdTarget)
	//{{AFX_MSG_MAP(CDataList)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CDataList message handlers

void CDataList::Add(CNode *pNode)
{
	if(m_nNodeCount==0)
	{
		m_pHead=m_pTail=m_pCurrent=pNode;
		m_pCurrent->SetCurrent(TRUE);
	}
	else
	{
		m_pTail->m_pNext=pNode;
		pNode->m_pPrev=m_pTail;
		m_pTail=pNode;
	}
	m_nNodeCount++;
}
/////////////////////////////////////////////////////////////////////////////
// CInputDlg dialog


CInputDlg::CInputDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CInputDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CInputDlg)
	m_LVal = 0;
	m_RVal = 0;
	m_strInfo = _T("");
	//}}AFX_DATA_INIT
}


void CInputDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CInputDlg)
	DDX_Text(pDX, IDC_LVAL, m_LVal);
	DDX_Text(pDX, IDC_RVAL, m_RVal);
	DDX_Text(pDX, IDC_INFO, m_strInfo);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CInputDlg, CDialog)
	//{{AFX_MSG_MAP(CInputDlg)
	ON_BN_CLICKED(ID_UPDATE, OnUpdate)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CInputDlg message handlers

void CNode::SetData(int lVal, int rVal)
{
	m_nLVal=lVal;
	m_nRVal=rVal;
}

void CNode::SetPos(int xPos, int yPos)
{
	m_nXPos=xPos;
	m_nYPos=yPos;
}

void CDataList::Draw(CDC *pDC)
{
	if(m_nNodeCount==0) return;
	for(CNode* pNode=m_pHead;pNode!=NULL;pNode=pNode->m_pNext)
	{
		pNode->Draw(pDC);
	}
}

void CNode::Draw(CDC *pDC)
{
	CPen aPen;
	if(m_bCurrent)
		aPen.CreatePen(PS_SOLID,10,RGB(255,0,0));
	else
		aPen.CreatePen(PS_SOLID,10,RGB(0,0,0));
	pDC->SelectObject(&aPen);

	pDC->MoveTo(m_nXPos,m_nYPos);
	pDC->LineTo(m_nXPos+NODEWIDTH,m_nYPos);
	pDC->LineTo(m_nXPos+NODEWIDTH,m_nYPos-NODEHEIGHT);
	pDC->LineTo(m_nXPos,m_nYPos-NODEHEIGHT);
	pDC->LineTo(m_nXPos,m_nYPos);

	pDC->MoveTo(m_nXPos+NODEWIDTH/4,m_nYPos);
	pDC->LineTo(m_nXPos+NODEWIDTH/4,m_nYPos-NODEHEIGHT);

	pDC->MoveTo(m_nXPos+NODEWIDTH*2/4,m_nYPos);
	pDC->LineTo(m_nXPos+NODEWIDTH*2/4,m_nYPos-NODEHEIGHT);
	
	pDC->MoveTo(m_nXPos+NODEWIDTH*3/4,m_nYPos);
	pDC->LineTo(m_nXPos+NODEWIDTH*3/4,m_nYPos-NODEHEIGHT);


	pDC->Ellipse(m_nXPos+NODEWIDTH/8-SPOINTSIZE,
			m_nYPos-NODEHEIGHT/2+SPOINTSIZE,
			m_nXPos+NODEWIDTH/8+SPOINTSIZE,
			m_nYPos-NODEHEIGHT/2-SPOINTSIZE);

	pDC->Ellipse(m_nXPos+NODEWIDTH*7/8-SPOINTSIZE,
			m_nYPos-NODEHEIGHT/2+SPOINTSIZE,
			m_nXPos+NODEWIDTH*7/8+SPOINTSIZE,
			m_nYPos-NODEHEIGHT/2-SPOINTSIZE);

	CString str;
	str.Format("%3d",m_nLVal);

	int xDPos,yDPos;
	xDPos=m_nXPos+NODEWIDTH/4+10;
	yDPos=m_nYPos-10;
	pDC->TextOut(xDPos,yDPos,str);

	str.Format("%3d",m_nRVal);
	xDPos=m_nXPos+NODEWIDTH/2+10;
	yDPos=m_nYPos-10;
	pDC->TextOut(xDPos,yDPos,str);

	if(m_pPrev!=NULL)
	{
		xDPos=m_nXPos+NODEWIDTH/8;
		yDPos=m_nYPos-NODEHEIGHT/2;
		int exPos=m_pPrev->m_nXPos+NODEWIDTH/2;
		int eyPos=m_pPrev->m_nYPos-NODEHEIGHT;
		pDC->MoveTo(xDPos,yDPos);
		pDC->LineTo(exPos,eyPos);
	}
	if(m_pNext!=NULL)
	{
		xDPos=m_nXPos+NODEWIDTH*7/8;
		yDPos=m_nYPos-NODEHEIGHT/2;
		int exPos=m_pNext->m_nXPos+NODEWIDTH/2;
		int eyPos=m_pNext->m_nYPos;
		pDC->MoveTo(xDPos,yDPos);
		pDC->LineTo(exPos,eyPos);

	}
}

void CInputDlg::SetParent(CEx702View *pParent)
{
	m_pParent=pParent;
}

void CInputDlg::OnUpdate() 
{
	// TODO: Add your control notification handler code here
	m_pParent->SendMessage(MSG_UPDATE,0,0L);

}

void CNode::SetCurrent(BOOL bCurrent)
{
	m_bCurrent=bCurrent;
}

BOOL CDataList::SetCurrent(CDC *pDC, CPoint point)
{

	BOOL bRet=FALSE;
	if(m_nNodeCount==0) return FALSE;
	for(CNode* pNode=m_pHead;pNode!=NULL;pNode=pNode->m_pNext)
	{
		if(pNode->TestTouch(pDC,point))
		{
			m_pCurrent->SetCurrent(FALSE);
			m_pCurrent=pNode;
			m_pCurrent->SetCurrent(TRUE);			
			bRet=TRUE;
			break;
		}
	}
	return bRet;
}

BOOL CNode::TestTouch(CDC *pDC, CPoint point)
{
	CRect rect=CRect(m_nXPos,m_nYPos,
		m_nXPos+NODEWIDTH,m_nYPos-NODEHEIGHT);
	pDC->LPtoDP(&rect);
	if(rect.PtInRect(point))
		return TRUE;
	return FALSE;
}

void CDataList::DeleteNode()
{
	if(m_nNodeCount==0)return;
	m_nNodeCount--;
	if(m_nNodeCount==0)
		;
	else if(m_nNodeCount==1)
		;
	else
	{
	}
	if(m_pCurrent!=NULL)
	{
		CNode* pNext=m_pCurrent->m_pNext;
		CNode* pPrev=m_pCurrent->m_pPrev;
		delete m_pCurrent;
		
		m_pCurrent=NULL;

		if(pPrev!=NULL)
		{
			m_pCurrent=pPrev;
			pPrev->m_pNext=pNext;
			pNext->m_pPrev=pPrev;
		}
		else if(pNext!=NULL)
		{
			m_pCurrent=pNext;
			pNext->m_pPrev=pPrev;
		}
		else
		{
			m_pHead=m_pTail=m_pCurrent=NULL;
		}
	}
}

void CDataList::Offset(int xoff, int yOff)
{

}

⌨️ 快捷键说明

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