设置如下图所示:
为对话框中的各个控件添加消息处理函数。
第五步:
打开类向导窗口,在类名下拉列表中选择CtsuView选项,在对象ID列表框中选择ID_RECORD_FIRST选项然后再消息列表中选择COMMAND选项,单击添加处理程序,添加响应函数OnRecordFirst
6 / 16
数OnRecordLast,OnRecordNext,OnRecordPrev;
第六步:程序代码编写
用同样的方法分别为ID_RECORD_FLAST,ID_RECORD_NEXT,ID_RECORD_PREV添加事件处理函
CtsuSet类的接口定义,定义有积累Crecordset派生的CtsuSet类:
class CtsuSet : public CRecordset { public: // 重写 // 实现 #ifdef _DEBUG };
7 / 16
CtsuSet(CDatabase* pDatabase = NULL); DECLARE_DYNAMIC(CtsuSet) long m_ID; CStringW column1; CStringW column2; CStringW column3; CStringW column4;
// 向导生成的虚函数重写 public:
virtual CString GetDefaultConnect();
// 默认连接字符串
virtual CString GetDefaultSQL(); // 记录集的默认 SQL
virtual void DoFieldExchange(CFieldExchange* pFX); // RFX 支持
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
源文件CtsuSet.cpp。实现CtsuSet类的功能,初始化成员变量和数据库默认连接 CtsuSet::CtsuSet(CDatabase* pdb) { }
//数据库的默认连接
CString CtsuSet::GetDefaultConnect() { }
//数据库的默认查询
CString CtsuSet::GetDefaultSQL() { }
//数据库表格内容与成员变量的数据教皇
void CtsuSet::DoFieldExchange(CFieldExchange* pFX) {
pFX->SetFieldType(CFieldExchange::outputColumn); // RFX_Text() 和 RFX_Int() 这类宏依赖的是 // 成员变量的类型,而不是数据库字段的类型。 // ODBC 尝试自动将列值转换为所请求的类型 }
/////////////////////////////////////////////////////////////////////////////
定义CtsuView类,在CTXLView.h头文件中定义CtsuView类的接口,定义由基类CrecordView派生的类CtsuView
8 / 16
: CRecordset(pdb) m_ID = 0; column1 = L\; column2 = L\; column3 = L\; column4 = L\; m_nFields = 5;
m_nDefaultType = dynaset;
return _T(\);
return _T(\通讯录]\);
RFX_Long(pFX, _T(\通讯录ID]\), m_ID); RFX_Text(pFX, _T(\姓名]\), column1); RFX_Text(pFX, _T(\分类]\), column2); RFX_Text(pFX, _T(\电子邮件地址]\), column3); RFX_Text(pFX, _T(\联系方式]\), column4);
class CtsuView : public CRecordView {
protected: // 仅从序列化创建 public: // 特性 public: // 操作 public: // 重写 public: // 实现 public:
protected:
// 生成的消息映射函数 protected:
afx_msg void OnFilePrintPreview();
afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); DECLARE_MESSAGE_MAP() virtual ~CtsuView();
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const; #ifdef _DEBUG
virtual CRecordset* OnGetRecordset();
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 virtual void OnInitialUpdate(); // 构造后第一次调用 CtsuDoc* GetDocument() const; enum{ IDD = IDD_TSU_FORM }; CtsuSet* m_pSet; CtsuView();
DECLARE_DYNCREATE(CtsuView)
protected:
#endif
public:
9 / 16
};
afx_msg void OnButtonModify(); afx_msg void OnButtonDelete(); afx_msg void OnButtonAdd(); CString m_name; CString m_type; CString m_mail; CString m_address;
afx_msg void OnRecordFirst(); afx_msg void OnRecordLast(); afx_msg void OnRecordNext(); afx_msg void OnRecordPrev(); void RefreshData(void);
protected:
#ifndef _DEBUG // tsuView.cpp 中的调试版本 inline CtsuDoc* CtsuView::GetDocument() const
{ return reinterpret_cast
源文件CtsuView.cpp,实现类CtsuView视图显示功能:
消息映射:
IMPLEMENT_DYNCREATE(CtsuView, CRecordView)
BEGIN_MESSAGE_MAP(CtsuView, CRecordView)
// CtsuView 构造/析构
CtsuView::CtsuView()
: CRecordView(CtsuView::IDD) , m_name(_T(\)) , m_type(_T(\)) ON_WM_CONTEXTMENU() ON_WM_RBUTTONUP()
ON_BN_CLICKED(IDC_BUTTON_MODIFY, &CtsuView::OnButtonModify) ON_BN_CLICKED(IDC_BUTTON_DELETE, &CtsuView::OnButtonDelete) ON_BN_CLICKED(IDC_BUTTON_ADD, &CtsuView::OnButtonAdd) ON_COMMAND(ID_RECORD_FIRST, &CtsuView::OnRecordFirst) ON_COMMAND(ID_RECORD_LAST, &CtsuView::OnRecordLast) ON_COMMAND(ID_RECORD_NEXT, &CtsuView::OnRecordNext) ON_COMMAND(ID_RECORD_PREV, &CtsuView::OnRecordPrev)
END_MESSAGE_MAP()
10 / 16