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

📄 virtuallistview.cpp

📁 VC++程序设计100例 配套光盘 在动态集中使用虚拟列表
💻 CPP
字号:
// VirtualListView.cpp : implementation of the CVirtualListView class
//

#include "stdafx.h"
#include "VirtualList.h"

#include "VirtualListDoc.h"
#include "VirtualListView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CVirtualListView

IMPLEMENT_DYNCREATE(CVirtualListView, CListView)

BEGIN_MESSAGE_MAP(CVirtualListView, CListView)
	//{{AFX_MSG_MAP(CVirtualListView)
	ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetDispInfo)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CListView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CListView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CListView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CVirtualListView construction/destruction

CVirtualListView::CVirtualListView()
{
	// TODO: add construction code here

}

CVirtualListView::~CVirtualListView()
{
}

BOOL CVirtualListView::PreCreateWindow(CREATESTRUCT& cs)
{
	cs.lpszName = WC_LISTVIEW;
	cs.style &= ~LVS_TYPEMASK;
	cs.style |= LVS_REPORT;
	cs.style |= LVS_OWNERDATA;
	return CListView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CVirtualListView drawing

void CVirtualListView::OnDraw(CDC* pDC)
{
	CVirtualListDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
}

void CVirtualListView::OnInitialUpdate()
{
	CListView::OnInitialUpdate();
	/*set number of items in list to number of items in RecordSet*/	
	/* create image list*/
	CDaoRecordset* pRecordSet = GetRecordSet();
	if(pRecordSet != NULL)
	{
		m_pImageList = new CImageList();
		m_pImageList->Create(IDB_IMAGELIST, 16, 1, RGB(0,0,0));
		GetListCtrl().SetImageList(m_pImageList, LVSIL_SMALL);	/* set extended stlyes*/
		
		DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | /*LVS_EX_SUBITEMIMAGES |*/
							LVS_EX_HEADERDRAGDROP | LVS_EX_TRACKSELECT;
		GetListCtrl().SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LPARAM(dwExStyle));	
		
		LV_COLUMN lvColumn;
		lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
		lvColumn.fmt = LVCFMT_LEFT;	lvColumn.cx = 120;
		for(int i = 0; i < pRecordSet->GetFieldCount(); i++) // set up columns
		{
			CDaoFieldInfo m_fieldinfo;
			pRecordSet->GetFieldInfo(i, m_fieldinfo);//get field name
			int len = m_fieldinfo.m_strName.GetLength();
			CString temp = m_fieldinfo.m_strName;
			TCHAR* szBuffer = new TCHAR[len + 1];
			strcpy(szBuffer, temp.GetBuffer(len));
			temp.ReleaseBuffer();
			lvColumn.pszText = szBuffer;
			GetListCtrl().InsertColumn(i, &lvColumn);//insert column		
			delete szBuffer;
		}
		/*set number of items in ListView*/
		long count = GetRecordCount();//Get number of records
		GetListCtrl().SendMessage(LVM_SETITEMCOUNT, (WPARAM)count, (LPARAM)LVSICF_NOINVALIDATEALL);
	}
}

/////////////////////////////////////////////////////////////////////////////
// CVirtualListView printing

BOOL CVirtualListView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CVirtualListView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CVirtualListView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CVirtualListView diagnostics

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

void CVirtualListView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}

CVirtualListDoc* CVirtualListView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CVirtualListDoc)));
	return (CVirtualListDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CVirtualListView message handlers

void CVirtualListView::OnGetDispInfo(NMHDR* pNMHDR, LRESULT* pResult) 
{
	LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
	TCHAR szValue[MAX_PATH];
	szValue[0] = '\0';
	CDaoRecordset* pRecordSet = GetRecordSet();
	if(!pRecordSet)
		return;

	COleVariant varValue;
	long index = pDispInfo->item.iItem;
	long subItem = 	pDispInfo->item.iSubItem;


	if(pDispInfo->item.mask & LVIF_TEXT)
	{
		try
		{
			pRecordSet->SetAbsolutePosition(index);//Set the file to desired index
		}
		catch(CDaoException* e)
		{
			AfxMessageBox(e->m_pErrorInfo->m_strDescription, 
				    MB_ICONEXCLAMATION );
			e->Delete();
			return;
		}
		
		try
		{
			if(subItem)	
				pRecordSet->GetFieldValue(subItem, varValue);
			else
				pRecordSet->GetFieldValue(0, varValue);
		}
		catch(CDaoException* e)
		{
			AfxMessageBox(e->m_pErrorInfo->m_strDescription, 
				    MB_ICONEXCLAMATION );
			e->Delete();
			return;
		}

		const VARIANT* variant = LPCVARIANT(varValue);
		
		if(variant->vt & VT_BYREF)
			return;
		
		switch(variant->vt)
		{
			case VT_ERROR:{	
							strcpy(szValue, "Error");					
							break;
						  }
			case VT_I2:{	wsprintf(szValue, "%d", variant->iVal);
							break;
					   }
			case VT_I4:{	wsprintf(szValue, "%d", variant->lVal);
							break;
					   }
			case VT_R4:{	wsprintf(szValue, "%f", variant->fltVal);
							break;
					   }	
			case VT_R8:{	wsprintf(szValue, "%f", variant->dblVal);
							break;
					   }
			case VT_CY:{	COleCurrency c(varValue);
							CString s = c.Format();//ie. 1.00
							strcpy(szValue, s.GetBuffer(s.GetLength()));
							s.ReleaseBuffer();
							break;
					   }
			case VT_DATE:{	COleDateTime t(variant->date);
							CString s = t.Format( "%B %d, %Y" );//Day of Week, Month Day, Year
							strcpy(szValue, s.GetBuffer(s.GetLength()));
							s.ReleaseBuffer();
							break;
						 }
			case VT_BSTR:{  CString str = V_BSTRT( &varValue );//convert BSTR to CString
							strcpy(szValue, str.GetBuffer(str.GetLength()));
							str.ReleaseBuffer();
							break;
						}
			case VT_BOOL:{	if(variant->boolVal)
								strcpy(szValue, "TRUE");
							else
								strcpy(szValue, "FALSE");
							break;
						 }
			case VT_UI1:{	strcpy(szValue, (char*)variant->bVal);
							break;
						}

				default:{
							szValue[0] = '\0';
							break;
						}

		}
		lstrcpyn(pDispInfo->item.pszText, szValue, pDispInfo->item.cchTextMax);//set item text
	}
	
	if(pDispInfo->item.mask & LVIF_IMAGE)
		pDispInfo->item.iImage = 0;//set image to first in list

	*pResult = 0;
} 


CDaoRecordset* CVirtualListView::GetRecordSet()
{
	return GetDocument()->GetRecordSet();
}

long CVirtualListView::GetRecordCount()
{
	CDaoRecordset* pRecordset = GetRecordSet();
	if(pRecordset)
		return pRecordset->GetRecordCount();

	return 0;
}


⌨️ 快捷键说明

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