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

📄 rightlistview.cpp

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

#include "stdafx.h"
#include "Chapter20.h"
#include "RightListView.h"
#include "MainFrm.h"
#include "vfw.h"
#include "EditSong.h"

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

/////////////////////////////////////////////////////////////////////////////
// CRightListView

IMPLEMENT_DYNCREATE(CRightListView, CListView)

CRightListView::CRightListView()
{
}

CRightListView::~CRightListView()
{
}


BEGIN_MESSAGE_MAP(CRightListView, CListView)
	//{{AFX_MSG_MAP(CRightListView)
	ON_WM_LBUTTONDBLCLK()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRightListView drawing

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

/////////////////////////////////////////////////////////////////////////////
// CRightListView diagnostics

#ifdef _DEBUG
void CRightListView::AssertValid() const
{
	CListView::AssertValid();
}

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

/////////////////////////////////////////////////////////////////////////////
// CRightListView message handlers

void CRightListView::OnInitialUpdate() 
{
	CListView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	CListCtrl& ctl=GetListCtrl();
	// TODO: Add your specialized code here and/or call the base class	
	//设置列表控件风格
	DWORD dwStyle=::GetWindowLong(m_hWnd,GWL_STYLE);
    dwStyle|=LVS_REPORT|LVS_SHOWSELALWAYS|LVS_EDITLABELS;	
	::SetWindowLong(m_hWnd,GWL_STYLE,dwStyle);
	dwStyle=ctl.GetExtendedStyle();
	dwStyle|=LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT;
    //设置扩展风格
	ctl.SetExtendedStyle(dwStyle);
//	ctl.SetBkColor(RGB(232,232,232));
	//列表控件头内容
	TCHAR tittle[10][10] = {_T("文件名"),_T("演唱"),_T("专辑"),_T("标题"),
		_T("备注"),_T("艺术家"),_T("年代"),_T("流派"),_T("文件夹"),_T("性别")};	
	LV_COLUMN lvcolumn;
	CRect rect;
	GetWindowRect(&rect);	
	//填充列表控件头
	for(int i=0;i<10;i++)
	{
		lvcolumn.mask =LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT 
			|LVCF_WIDTH|LVCF_ORDER;
		lvcolumn.fmt = LVCFMT_LEFT;
		lvcolumn.pszText = tittle[i];
		lvcolumn.iSubItem = i;
		lvcolumn.iOrder = i;
		lvcolumn.cx = rect.Height()/4;
		GetListCtrl().InsertColumn(i, &lvcolumn);
	}
}

void CRightListView::AddToList(CSongRecordSet &db,CString& strSql)
{
	CListCtrl& listCtrl=GetListCtrl();
	listCtrl.DeleteAllItems();
	//将数据库中记录插入
	try
	{
		if(db.IsOpen())
			db.Close();
		//设置查询条件
		db.m_strFilter=strSql;
		//执行查询
		db.Open(CRecordset::snapshot,NULL,CRecordset::none);
		int mCur=0;
		while(!db.IsEOF())
		{			
			//添加条目
			AddItem(db,mCur,0);
			mCur++;
			//记录游标移到下一条记录
			db.MoveNext();
		}	
		db.Close();
	}
	//意外捕获
	catch(CDBException*e)
	{
		e->ReportError ();
		return;
	}
}

void CRightListView::AddItem(CSongRecordSet& db,int iItem,UINT uMethod)
{
	CListCtrl& listCtrl=GetListCtrl();
	//以下是插入列表控件条目的几种方法,可以试着不同的方法调用
	switch(uMethod)
	{
	case 0:
		{
			//循环插入
			CString strFieldValue;
			listCtrl.InsertItem(iItem,strFieldValue);
			listCtrl.SetItemText(iItem,0,db.m_strFileName);
			listCtrl.SetItemText(iItem,1,db.m_Singer);
			listCtrl.SetItemText(iItem,2,db.m_Album);
			listCtrl.SetItemText(iItem,3,db.m_Title);
			listCtrl.SetItemText(iItem,4,db.m_Comment);
			listCtrl.SetItemText(iItem,5,db.m_Artist);
			listCtrl.SetItemText(iItem,6,db.m_Year);
			listCtrl.SetItemText(iItem,7,db.m_Genre);
			listCtrl.SetItemText(iItem,8,db.m_Folder);
			listCtrl.SetItemText(iItem,9,db.m_SingerSex);
			return;
		}
	case 1:
		{
			UINT uField;
			uField=listCtrl.GetHeaderCtrl()->GetItemCount();
			//循环插入
			CString strFieldValue;
			//负责插入条目(行)
			listCtrl.InsertItem (iItem,strFieldValue);
			//0-8
			for(UINT nColumn=1;nColumn<uField; nColumn++)
			{
				//获取字段值
				db.GetFieldValue(nColumn,strFieldValue);
				listCtrl.SetItemText(iItem, nColumn, strFieldValue);			
			}
			return;
		}
	case 2:
		{
			//循环插入
			CString strFieldValue;
			//负责插入条目(行)
			listCtrl.InsertItem (iItem,strFieldValue);
			for(UINT nColumn=0;nColumn<db.m_nFields; nColumn++)
			{
				//获取字段值
				db.GetFieldValue(nColumn,strFieldValue);
				listCtrl.SetItemText (iItem, nColumn, strFieldValue);			
			}
			return;
		}
	default:
		return;
	}
}

void CRightListView::EditSong()
{
	CListCtrl& listCtrl=GetListCtrl();
	POSITION pos=listCtrl.GetFirstSelectedItemPosition();
	if (pos==NULL)
	{
		//如果没有选择记录,则提示并退出
		AfxMessageBox("请选中要编辑的歌曲!:)");
		return;
	}
	//获取当前记录的位置游标
	int iSelCur=listCtrl.GetNextSelectedItem(pos);
	CString strNameText,strDirText;
	//寻找要删除的歌曲信息
	strNameText=listCtrl.GetItemText(iSelCur,0);
	strDirText=listCtrl.GetItemText(iSelCur,8);
	//编辑对话框对象
	CEditSong dlg;
	dlg.m_strEditAlbum=listCtrl.GetItemText(iSelCur,2);
	dlg.m_strEditTittle=listCtrl.GetItemText(iSelCur,3);
	dlg.m_strEditComment=listCtrl.GetItemText(iSelCur,4);
	if(dlg.DoModal()!=IDOK)
	{
		//如果用户选择取消按钮,则退出
		return;
	}
	//将数据库中记录插入
	CSongRecordSet db;
	try
	{
		if(db.IsOpen())
			db.Close();
		//设置查询条件
		db.m_strFilter.Format("文件名='%s' and 文件夹='%s'",
			strNameText,strDirText);
		//执行查询
		db.Open(CRecordset::snapshot,NULL,CRecordset::none);
		if(!db.IsEOF())
		{			
			//删除歌曲信息
			db.Edit();
			db.m_Album=dlg.m_strEditAlbum;
			db.m_Title=dlg.m_strEditTittle;
			db.m_Comment=dlg.m_strEditComment;
		}
		if(db.CanUpdate())
		{
			db.Update();			
		}
		db.Close();
	}
	//意外捕获
	catch(CDBException*e)
	{
		e->ReportError ();
		return;
	}
	//在ListCtrl中刷新信息		
	listCtrl.SetItemText(0,2,db.m_Album);
	listCtrl.SetItemText(0,3,db.m_Title);
	listCtrl.SetItemText(0,4,db.m_Comment);	
	//提示用户,编辑成功
	AfxMessageBox("编辑成功!:)");
}

void CRightListView::DeleteSong()
{
	CListCtrl& listCtrl=GetListCtrl();
	POSITION pos=listCtrl.GetFirstSelectedItemPosition();
	if (pos==NULL)
	{
		//如果没有选择记录,则提示并退出
		AfxMessageBox("请选中要删除的歌曲!:)");
		return;
	}
	else
	{
		//获取当前记录的位置游标
		int iSelCur=listCtrl.GetNextSelectedItem(pos);
		CString strNameText,strDirText;
		//寻找要删除的歌曲信息
		strNameText=listCtrl.GetItemText(iSelCur,0);
		strDirText=listCtrl.GetItemText(iSelCur,8);

		//将数据库中记录删除
		CSongRecordSet db;
		try
		{
			if(db.IsOpen())
				db.Close();
			//设置查询条件
			db.m_strFilter.Format("文件名='%s' and 文件夹='%s'",strNameText,strDirText);
			//执行查询
			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;
		}
		//在ListCtrl中删除当前选中的歌曲信息
		listCtrl.DeleteItem(iSelCur);
		//提示用户,删除成功
		AfxMessageBox("删除成功!:)");
	}
}

void CRightListView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CListCtrl& listCtrl=GetListCtrl();
	POSITION pos=listCtrl.GetFirstSelectedItemPosition();
	if (pos==NULL)
	{
		//如果没有选择记录,则提示并退出
		AfxMessageBox("请选中要播放的歌曲!:)");
		return;
	}
	else
	{
		//获取当前记录的位置游标
		int iSelCur=listCtrl.GetNextSelectedItem(pos);
		CString strNameText,strDirText,strFullPath;
		strFullPath.Empty();
		//初始化想要播放的歌曲信息
		strNameText=listCtrl.GetItemText(iSelCur,0);
		strDirText=listCtrl.GetItemText(iSelCur,8);
		strFullPath=strDirText+"\\"+strNameText+".mp3";
		//检测该文件的存在性,如不存在自然不能播放
		CString strTittle;
		strTittle.Format("歌曲:<<%s>>已丢失",strNameText);
		OFSTRUCT ofs;
		HFILE hf = OpenFile(strFullPath,&ofs,OF_EXIST);
		if(hf==HFILE_ERROR)
		{
			int iReturn=::MessageBox(GetSafeHwnd(),"删除该记录吗?",
				strTittle,MB_YESNO|MB_ICONQUESTION);
			if(iReturn==IDYES)
			{
				DeleteSong();
			}
			return;
		}
		//播放选定的文件
		CMainFrame* pMainFrm=(CMainFrame*)AfxGetMainWnd();
		//先停止播放
		MCIWndStop(pMainFrm->m_PlayBar.m_hMp3);
		if(pMainFrm->m_PlayBar.m_hMp3!=NULL)
		{
			//销毁播放窗口
			MCIWndDestroy(pMainFrm->m_PlayBar.m_hMp3);
			//将播放窗口句柄置空
			pMainFrm->m_PlayBar.m_hMp3=NULL;
		}
		//播放选中的歌曲
		pMainFrm->m_PlayBar.Play(strFullPath);
	}

	CListView::OnLButtonDblClk(nFlags, point);
}

⌨️ 快捷键说明

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