我添加了,也调用了OnGetDispInfo()啊: #include "stdafx.h" #include "DEFENDER.h" #include "DEFENDERDoc.h" #include "DEFENDERView.h"#ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif///////////////////////////////////////////////////////////////////////////// // CDEFENDERViewIMPLEMENT_DYNCREATE(CDEFENDERView, CListView)BEGIN_MESSAGE_MAP(CDEFENDERView, CListView) //{{AFX_MSG_MAP(CDEFENDERView) ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo) //}}AFX_MSG_MAP END_MESSAGE_MAP()///////////////////////////////////////////////////////////////////////////// // CDEFENDERView construction/destructionCDEFENDERView::CDEFENDERView() { // TODO: add construction code here}CDEFENDERView::~CDEFENDERView() { }BOOL CDEFENDERView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs cs.lpszName = WC_LISTVIEW; cs.style &= ~LVS_TYPEMASK; cs.style |=LVS_REPORT; cs.style |=LVS_OWNERDATA; return CView::PreCreateWindow(cs); }///////////////////////////////////////////////////////////////////////////// // CDEFENDERView drawingvoid CDEFENDERView::OnDraw(CDC* pDC) { CDEFENDERDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here }void CDEFENDERView::OnInitialUpdate() { CListView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class /*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*/8,16,1,RGB(0,0,0)); //设置扩展风格 GetListCtrl().SetImageList(m_pImageList,LVSIL_SMALL); 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.fmt = LVCFMT_LEFT; lvColumn.cx = 120; int pp=pRecordSet->GetFieldCount(); char oo=pp;
什么意思?不懂!
#include "stdafx.h"
#include "DEFENDER.h"
#include "DEFENDERDoc.h"
#include "DEFENDERView.h"#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif/////////////////////////////////////////////////////////////////////////////
// CDEFENDERViewIMPLEMENT_DYNCREATE(CDEFENDERView, CListView)BEGIN_MESSAGE_MAP(CDEFENDERView, CListView)
//{{AFX_MSG_MAP(CDEFENDERView)
ON_NOTIFY_REFLECT(LVN_GETDISPINFO, OnGetdispinfo)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
// CDEFENDERView construction/destructionCDEFENDERView::CDEFENDERView()
{
// TODO: add construction code here}CDEFENDERView::~CDEFENDERView()
{
}BOOL CDEFENDERView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.lpszName = WC_LISTVIEW;
cs.style &= ~LVS_TYPEMASK;
cs.style |=LVS_REPORT;
cs.style |=LVS_OWNERDATA;
return CView::PreCreateWindow(cs);
}/////////////////////////////////////////////////////////////////////////////
// CDEFENDERView drawingvoid CDEFENDERView::OnDraw(CDC* pDC)
{
CDEFENDERDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}void CDEFENDERView::OnInitialUpdate()
{
CListView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
/*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*/8,16,1,RGB(0,0,0));
//设置扩展风格 GetListCtrl().SetImageList(m_pImageList,LVSIL_SMALL);
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.fmt = LVCFMT_LEFT; lvColumn.cx = 120;
int pp=pRecordSet->GetFieldCount();
char oo=pp;
AfxMessageBox(oo);
for(int i = 0; i<pRecordSet->GetFieldCount();i++)//设置列
{
CDaoFieldInfo m_fieldinfo;
pRecordSet->GetFieldInfo(i,m_fieldinfo);//获取字段名
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);//插入列
delete szBuffer;
}
//设置ListView中的项数
long count = GetRecordCount();//获取记录数
GetListCtrl().SendMessage(LVM_SETITEMCOUNT,(WPARAM)count,
(LPARAM)LVSICF_NOINVALIDATEALL);
}
}/////////////////////////////////////////////////////////////////////////////
// CDEFENDERView diagnostics#ifdef _DEBUG
void CDEFENDERView::AssertValid() const
{
CListView::AssertValid();
}void CDEFENDERView::Dump(CDumpContext& dc) const
{
CListView::Dump(dc);
}CDEFENDERDoc* CDEFENDERView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDEFENDERDoc)));
return (CDEFENDERDoc*)m_pDocument;
}
#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
// CDEFENDERView message handlersvoid CDEFENDERView::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);
}
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,"%f",variant->fltVal);
break;
}
case VT_R8:{
wsprintf(szValue,"%f",variant->dblVal);
break;
}
case VT_CY:{
COleCurrency c(varValue);
CString s = c.Format();
strcpy(szValue,s.GetBuffer(s.GetLength()));
s.ReleaseBuffer();
break;
}
case VT_DATE:{
COleDateTime t(variant->date);
CString s = t.Format("%B %d,%Y" );
strcpy(szValue,s.GetBuffer(s.GetLength()));
s.ReleaseBuffer();
break;
}
case VT_BSTRT :{
CString str = V_BSTRT( &varValue );
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);
}
if(pDispInfo->item.mask & LVIF_IMAGE)
pDispInfo->item.iImage =0;//在列表中的第一项设置图象 *pResult = 0;
/*LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
// TODO: Add your control notification handler code here
*pResult = 0;*/
}long CDEFENDERView::GetRecordCount()
{
CDaoRecordset* pRecordset=GetRecordSet();
if(pRecordset)
return pRecordset->GetRecordCount();
return 0;}CDaoRecordset* CDEFENDERView::GetRecordSet()
{
return GetDocument()->GetRecordSet();}