MFC(4)

树视图控件:常用 属性1.has buttons 2.has lines 3.lines at root

	// TODO: 在此添加额外的初始化代码
	//加载图标
	HICON icon[4];
	icon[0] = AfxGetApp()->LoadIconW(IDI_ICON1);
	icon[1] = AfxGetApp()->LoadIconW(IDI_ICON2);
	icon[2] = AfxGetApp()->LoadIconW(IDI_ICON3);
	icon[3] = AfxGetApp()->LoadIconW(IDI_ICON4);
	//图像列表,程序不能释放,所以创建成员函数
	//宽度  高度  样式  有多少图片写多少  有多少图片写多少
	m_imageList.Create(30, 30, ILC_COLOR32, 4, 4);
	//给图像列表添加图片
	for (int i = 0;i < 4;i++) {
		//图片列表加载图标
		m_imageList.Add(icon[i]);
	}
	//数控件设置图片列表
	m_treeCtrl.SetImageList(&m_imageList, TVSIL_NORMAL);
	//给树创建节点  根节点 父节点 子节点  列表里面的图标是从0开始的
	HTREEITEM root=m_treeCtrl.InsertItem(TEXT("根节点"), 0, 0, NULL);
	HTREEITEM father = m_treeCtrl.InsertItem(TEXT("父节点"), 1, 1, root);
	HTREEITEM son1 = m_treeCtrl.InsertItem(TEXT("子节点"), 2, 2, father);
	HTREEITEM son2 = m_treeCtrl.InsertItem(TEXT("子节点"), 3, 3, father);
	//设置某个节点被选中
	m_treeCtrl.SelectItem(son2);

文档视图结构
在这里插入图片描述

注意文档类有个Serialize函数时用来存储数据和取出数据的,文档OnNewDocument()每一次新建窗口都会调用,文档DeleteContents()做一些释放资源的操作,每次按键“新建”,会首先调用,是一个虚函数,要重写

//写文件 是MFC单个文档
void CMainFrame::OnCarchiveWrite()
{
	// TODO: 在此添加命令处理程序代码
	/*1.创建文件对象
	2.以写方式打开
	3.创建序列化对象,并且和文件关联在一起CArchive::store把数据保存归档文件中,允许CFile写操作
	4.往数据流写数据
	5.断开数据流和文件的关联CArchive::Close;
	6.关闭文件CFile::Close;
	*/
	CFile file;
	BOOL isOK=file.Open(TEXT("../demo.txt"), CFile::modeCreate | CFile::modeWrite);
	if (isOK == FALSE) {
		return;
	}
	CArchive ar(&file, CArchive::store);
	int a = 10;
	CString str = TEXT("ABC");
	TCHAR ch = 't';
	ar << a << str << ch;
	ar.Close();
	file.Close();
}

//读文件
void CMainFrame::OnCarchiveRead()
{
	// TODO: 在此添加命令处理程序代码
	CFile file;
	BOOL isOK = file.Open(TEXT("../demo.txt"), CFile::modeRead);
	if (isOK == FALSE) {
		return;
	}
	CArchive ar(&file, CArchive::load);
	int a;
	CString str;
	TCHAR ch ;
	ar >> a >> str >> ch;
	CString buf;
	buf.Format(TEXT("%d,%s,%c"), a, str, ch);
	MessageBox(buf);
	ar.Close();
	file.Close();
}

保存图形

void CMy05CArchiveProDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: 在此添加存储代码
		ar << m_num;
		for (int i = 0;i < m_num;i++) {
			ar << m_pt[i];
		}
	}
	else
	{
		// TODO: 在此添加加载代码
		ar >> m_num;
		for (int i = 0;i < m_num;i++) {
			ar >> m_pt[i];
		}
	}
}



void CMy05CArchiveProView::OnDraw(CDC* pDC)
{
	CMy05CArchiveProDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	if (!pDoc)
		return;

	// TODO: 在此处为本机数据添加绘制代码
	for (int i = 0;i < pDoc->m_num;i++) {
		pDC->Ellipse(pDoc->m_pt[i].x- 5 , pDoc->m_pt[i].y - 5, pDoc->m_pt[i].x + 5, pDoc->m_pt[i].y + 5 );
	}
}



void CMy05CArchiveProView::OnLButtonDown(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	//获取文档类对象指针
	CMy05CArchiveProDoc *pDoc = GetDocument();
	//不能超过200
	if (pDoc->m_num > 200) {
		pDoc->m_num = 200;
		return;
	}
	pDoc->m_pt[pDoc->m_num] = point;
	pDoc->m_num++;
	//每点击一个点 就开始绘图
	Invalidate();//相当于调用OnDraw()
	CView::OnLButtonDown(nFlags, point);
}


void CMy05CArchiveProDoc::DeleteContents()
{
	// TODO: 在此添加专用代码和/或调用基类
	memset(&m_pt, 0, sizeof(m_pt));
	m_num = 0;
	CDocument::DeleteContents();
}

单个文档有控件:
在这里插入图片描述

//添加按钮
void CMy06DocViewView::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	//获取编辑取得内容更新到对应的变量中
	UpdateData(TRUE);
	Student *stu = new Student(m_uiID, m_uiName, m_uiAge, m_uiScore);
	//获取文档对象指针
	CMy06DocViewDoc*pDoc = GetDocument();
	//从尾部添加节点
	pDoc->m_list.AddTail(stu);
	//获取最后一个元素的节点
	pDoc->m_pos = pDoc->m_list.GetTailPosition();
}

//上一个
void CMy06DocViewView::OnBnClickedButton2()
{
	// TODO: 在此添加控件通知处理程序代码
	Student *stu = new Student(m_uiID, m_uiName, m_uiAge, m_uiScore);
	//获取文档对象指针
	CMy06DocViewDoc*pDoc = GetDocument();
	//获取上一个元素,pDoc->m_pos会自动往上移动
	pDoc->m_list.GetPrev(pDoc->m_pos);
	//移动到头结点的上一个无效节点
	if (pDoc->m_pos == NULL) {
		//设置尾节点
		pDoc->m_pos = pDoc->m_list.GetTailPosition();
	}
	//获取当前位置的元素
	Student * p = pDoc->m_list.GetAt(pDoc->m_pos);
	//把节点的值给变量赋值
	m_uiID = p->m_ID;
	m_uiName = p->m_Name;
	m_uiAge = p->m_Age;
	m_uiScore = p->m_Score;
	UpdateData(FALSE);
}


void CMy06DocViewView::OnBnClickedButton3()
{
	// TODO: 在此添加控件通知处理程序代码
	// TODO: 在此添加控件通知处理程序代码
	Student *stu = new Student(m_uiID, m_uiName, m_uiAge, m_uiScore);
	//获取文档对象指针
	CMy06DocViewDoc*pDoc = GetDocument();
	//获取上一个元素,pDoc->m_pos会自动往上移动
	pDoc->m_list.GetNext(pDoc->m_pos);
	//移动到尾结点的下一个无效节点
	if (pDoc->m_pos == NULL) {
		//设置尾节点
		pDoc->m_pos = pDoc->m_list.GetHeadPosition();
	}
	//获取当前位置的元素
	Student * p = pDoc->m_list.GetAt(pDoc->m_pos);
	//把节点的值给变量赋值
	m_uiID = p->m_ID;
	m_uiName = p->m_Name;
	m_uiAge = p->m_Age;
	m_uiScore = p->m_Score;
	UpdateData(FALSE);
}


void CMy06DocViewDoc::DeleteContents()
{
	// TODO: 在此添加专用代码和/或调用基类
	//每次新建前,应该清空内容
	//只要当前节点不为空,那么久无限析构头结点
	while (m_list.GetHeadPosition() != NULL) {
		//把头结点元素移除
		Student * p = m_list.RemoveHead();
		delete p;
	}
	m_pos = NULL;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值