树视图控件:常用 属性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;
}