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

📄 lefttreeview.cpp

📁 一个学习ODBC访问Access数据库的好例子
💻 CPP
字号:
// LeftTreeView.cpp : implementation file
//

#include "stdafx.h"
#include "Chapter20.h"
#include "LeftTreeView.h"
#include "SongRecordSet.h"
#include "RightListView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CLeftTreeView

IMPLEMENT_DYNCREATE(CLeftTreeView, CTreeView)

CLeftTreeView::CLeftTreeView()
{
}

CLeftTreeView::~CLeftTreeView()
{
}


BEGIN_MESSAGE_MAP(CLeftTreeView, CTreeView)
	//{{AFX_MSG_MAP(CLeftTreeView)
	ON_NOTIFY_REFLECT(TVN_SELCHANGED, OnSelchanged)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLeftTreeView drawing

void CLeftTreeView::OnDraw(CDC* pDC)
{
	CDocument* pDoc = GetDocument();
	// TODO: add draw code here
}

/////////////////////////////////////////////////////////////////////////////
// CLeftTreeView diagnostics

#ifdef _DEBUG
void CLeftTreeView::AssertValid() const
{
	CTreeView::AssertValid();
}

void CLeftTreeView::Dump(CDumpContext& dc) const
{
	CTreeView::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CLeftTreeView message handlers

void CLeftTreeView::OnInitialUpdate() 
{
	CTreeView::OnInitialUpdate();	
	// TODO: Add your specialized code here and/or call the base class
	//设置树风格
	::SetWindowLong(m_hWnd,GWL_STYLE,WS_VISIBLE|WS_TABSTOP 
		|WS_CHILD|WS_BORDER|TVS_HASBUTTONS 
		|TVS_LINESATROOT|TVS_HASLINES);
	CTreeCtrl& treeCtrl=GetTreeCtrl();
	//创建图像列表
	m_ImageList.Create(IDB_BITMAP, 32, 1, RGB(255, 0, 255));	
	treeCtrl.SetImageList(&m_ImageList, LVSIL_NORMAL);
	treeCtrl.SetBkColor(RGB(232,232,232));
	//插入树项-歌手列表
	treeCtrl.InsertItem("歌手列表", 0, 1);
	//将数据库中记录插入
	CSongRecordSet db;
	//////////////////////////////////////
	try
	{
		if(db.IsOpen())
			db.Close();
		//设置查询条件
		CString strSQL="select * from songMp3";
		//执行查询
		db.Open(CRecordset::snapshot,NULL,CRecordset::none);
		while(!db.IsEOF())
		{
			AddSingerToTree(db.m_Singer,db.m_SingerSex);
			m_strSinger=db.m_Singer;
			//记录游标移到下一条记录
			db.MoveNext();
		}	
		db.Close();
	}
	//意外捕获
	catch(CDBException*e)
	{
		e->ReportError ();
		return;
	}
}


void CLeftTreeView::AddSingerToTree(CString &strSinger,CString &strMan)
{
	//插入树项-根据是否为男歌手
	CTreeCtrl& treeCtrl=GetTreeCtrl();
	BOOL bMan;
	bMan=strMan.Find("女")==-1?1:0;
	//判断是否已经存在指定的歌手
	HTREEITEM hSingerItem =treeCtrl.GetRootItem();	
	if(hSingerItem)
	{
		while(hSingerItem)
		{
			CString strItemText =treeCtrl.GetItemText(hSingerItem);
			//若存在,则直接返回
			if(strItemText==m_strSinger)
			{
				return;
			}
			//否则继续往下找
			hSingerItem=treeCtrl.GetNextSiblingItem(hSingerItem);
		}
	}	
	//依据歌手性别不同设置不同的树项图标
	if(bMan)
	{
		treeCtrl.InsertItem(strSinger, 4, 5);
	}
	else
	{
		treeCtrl.InsertItem(strSinger, 2, 3);
	}	
}

void CLeftTreeView::OnSelchanged(NMHDR* pNMHDR, LRESULT* pResult)
{
	NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	HTREEITEM hSelItem;
	CString strSelItem;
	CTreeCtrl& treeCtrl=GetTreeCtrl();
	//获取选中的树项
	hSelItem=pNMTreeView->itemNew.hItem;
	strSelItem=treeCtrl.GetItemText(hSelItem);
	CSplitterWnd* pSplitWnd=(CSplitterWnd*)GetParent();
	CRightListView* pListView=(CRightListView*)pSplitWnd->GetPane(0,1);
	//将该歌手的歌曲全部显示在列表中
	CSongRecordSet db;
	CString strSql;
	strSql.Format("演唱='%s'",strSelItem);
	pListView->AddToList(db,strSql);
	*pResult = 0;
}


void CLeftTreeView::DelSinger()
{
	CTreeCtrl& treeCtrl=GetTreeCtrl();
	HTREEITEM hSelCur=treeCtrl.GetSelectedItem();
	if(hSelCur==NULL)
	{
		AfxMessageBox("请先选择要删除的歌手:)");
		return;
	}
	CString strCurSel;
	strCurSel=treeCtrl.GetItemText(hSelCur);
	//歌手列表树项不可以删除
	if(strCurSel.Find("歌手列表")!=-1)
	{
		AfxMessageBox("您要选择的不是歌手:)");
		return;
	}
	//将数据库中记录删除
	CSongRecordSet db;
	try
	{
		if(db.IsOpen())
			db.Close();
		//设置查询条件
		db.m_strFilter.Format("演唱='%s'",strCurSel);
		//执行查询
		db.Open(CRecordset::snapshot,NULL,CRecordset::none);
		int mCur=0;
		while(!db.IsEOF())
		{			
			//删除歌曲信息
			db.Delete();
			//记录游标移到下一条记录
			db.MoveNext();
		}	
		db.Close();
	}
	//意外捕获
	catch(CDBException*e)
	{
		e->ReportError ();
		return;
	}
	//在treeCtrl中删除当前选中的歌手信息
	treeCtrl.DeleteItem(hSelCur);
	//提示用户,修改成功
	AfxMessageBox("删除歌手成功!:)");
}

⌨️ 快捷键说明

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