📄 odbcemailbookview.cpp
字号:
// ODBCEmailBookView.cpp : implementation of the CODBCEmailBookView class
//
#include "stdafx.h"
#include "ODBCEmailBook.h"
#include "MainFrm.h"
#include "ClassInfoSet.h"
#include "ODBCEmailBookSet.h"
#include "ODBCEmailBookDoc.h"
#include "ODBCEmailBookView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CODBCEmailBookView
IMPLEMENT_DYNCREATE(CODBCEmailBookView, CRecordView)
BEGIN_MESSAGE_MAP(CODBCEmailBookView, CRecordView)
//{{AFX_MSG_MAP(CODBCEmailBookView)
ON_COMMAND(ID_MENU_CLEAR, OnMenuClearClick)
ON_COMMAND(ID_MENU_DELETE, OnMenuDeleteClick)
ON_COMMAND(ID_MENU_UPDATE, OnMenuUpdateClick)
ON_UPDATE_COMMAND_UI(ID_MENU_UPDATE, OnUpdateMenuUpdate)
ON_UPDATE_COMMAND_UI(ID_MENU_DELETE, OnUpdateMenuDelete)
ON_COMMAND(ID_MENU_ADD, OnMenuAddClick)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CODBCEmailBookView construction/destruction
CODBCEmailBookView::CODBCEmailBookView()
: CRecordView(CODBCEmailBookView::IDD)
{
//{{AFX_DATA_INIT(CODBCEmailBookView)
m_pSet = NULL;
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CODBCEmailBookView::~CODBCEmailBookView()
{
}
void CODBCEmailBookView::DoDataExchange(CDataExchange* pDX)
{
CRecordView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CODBCEmailBookView)
DDX_FieldText(pDX, IDC_STUEMAIL, m_pSet->m_email, m_pSet);
DDV_MaxChars(pDX, m_pSet->m_email, 50);
DDX_FieldText(pDX, IDC_STUSEX, m_pSet->m_sex, m_pSet);
DDV_MaxChars(pDX, m_pSet->m_sex, 2);
DDX_FieldText(pDX, IDC_STUCLASSID, m_pSet->m_stuclassid, m_pSet);
DDX_FieldText(pDX, IDC_STUID, m_pSet->m_stuid, m_pSet);
DDX_FieldText(pDX, IDC_STUMEMO, m_pSet->m_stumemo, m_pSet);
DDX_FieldText(pDX, IDC_STUNAME, m_pSet->m_stuname, m_pSet);
DDX_FieldText(pDX, IDC_STUAGE, m_pSet->m_age, m_pSet);
DDV_MinMaxInt(pDX, m_pSet->m_age, 15, 45);
//}}AFX_DATA_MAP
}
BOOL CODBCEmailBookView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CRecordView::PreCreateWindow(cs);
}
void CODBCEmailBookView::OnInitialUpdate()
{
m_pSet = &GetDocument()->m_ODBCEmailBookSet;//获得记录集对象引用,该对象已自动打开
m_pClassSet = &GetDocument()->m_ClassInfoSet;//获得记录集对象引用
if(!(m_pClassSet->IsOpen()))//打开记录集
m_pClassSet->Open();
//初始化视图,显示数据显示窗口
CRecordView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
if (m_pSet->IsEOF()){//计算当前记录号
m_nRecordNumber=0;
}
else
{
m_nRecordNumber=1;
//滚动记录集,使GetRecordCount函数能够返回总记录数
while(!m_pSet->IsEOF()){m_pSet->MoveNext();}
m_pSet->MoveFirst(); //恢复当前记录位置
}
ShowRecordNews();//显示记录号、记录总数及当前学生班级名称
}
/////////////////////////////////////////////////////////////////////////////
// CODBCEmailBookView printing
BOOL CODBCEmailBookView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CODBCEmailBookView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CODBCEmailBookView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CODBCEmailBookView diagnostics
#ifdef _DEBUG
void CODBCEmailBookView::AssertValid() const
{
CRecordView::AssertValid();
}
void CODBCEmailBookView::Dump(CDumpContext& dc) const
{
CRecordView::Dump(dc);
}
CODBCEmailBookDoc* CODBCEmailBookView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CODBCEmailBookDoc)));
return (CODBCEmailBookDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CODBCEmailBookView database support
CRecordset* CODBCEmailBookView::OnGetRecordset()
{
return m_pSet;
}
/////////////////////////////////////////////////////////////////////////////
// CODBCEmailBookView message handlers
void CODBCEmailBookView::OnMenuAddClick()
{
m_pSet->AddNew();
UpdateData(true);//用窗体数据更新记录集
if (m_pSet->CanUpdate()) {
m_pSet->Update();//将记录集更新返回数据库
m_nRecordNumber++;
}
m_pSet->Requery(); //重新执行查询,刷新记录集
//浏览整个记录集,使GetRecordCount可以返回准确的记录数
while(!m_pSet->IsEOF()){m_pSet->MoveNext();}
ShowRecordNews();//显示记录号和记录数
UpdateData(false);//刷新窗体
}
void CODBCEmailBookView::OnMenuClearClick()
{
m_pSet->SetFieldNull(NULL);//清除字段
UpdateData(false); //刷新窗体
}
void CODBCEmailBookView::OnMenuDeleteClick()
{
CRecordsetStatus status;//定义记录集状态变量
try {
m_pSet->Delete();//删除当前记录
}
catch(CDBException* e) {
//如果删除操作发生错误,则显示错误信息
AfxMessageBox(e->m_strError);//显示错误信息
e->Delete();//删除错误对象
m_pSet->MoveFirst(); //使第一条记录成为当前记录
UpdateData(false);//刷新窗口
return;
}
m_pSet->GetStatus(status);//获得记录集状态
if (status.m_lCurrentRecord == 0) {
//如果删除的是最后两条记录中的第2条,
//则使第一条记录成为当前记录
m_pSet->MoveFirst();
}
else {
m_pSet->MoveNext();//使下一条记录成为当前记录
}
UpdateData(false);//刷新窗口
}
void CODBCEmailBookView::OnMenuUpdateClick()
{
m_pSet->Edit();//使当前记录进入编辑状态
UpdateData(true);//将窗体中显示的数据存入记录集
if (m_pSet->CanUpdate()){
m_pSet->Update();//将记录集的更新返回数据库
}
}
void CODBCEmailBookView::OnUpdateMenuUpdate(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!m_pSet->IsEOF());
}
void CODBCEmailBookView::OnUpdateMenuDelete(CCmdUI* pCmdUI)
{
pCmdUI->Enable(!m_pSet->IsEOF());
}
BOOL CODBCEmailBookView::OnMove(UINT nIDMoveCommand)
{
switch (nIDMoveCommand/*记录指针移动命令消息ID*/)
{
case ID_RECORD_PREV:
//若第一条记录已经是当前记录,则不再向前移动记录指针
if(!(m_nRecordNumber==1)){
m_pSet->MovePrev(); //使前一条记录成为当前记录
m_nRecordNumber-=1; //使记录号减1
}
break;
case ID_RECORD_FIRST:
m_pSet->MoveFirst();//使第一条记录成为当前记录
m_nRecordNumber=1;//使记录号为1
break;
case ID_RECORD_NEXT:
//若最后一条记录已经是当前记录,则不再向后移动记录指针
if(!(m_nRecordNumber==m_pSet->GetRecordCount())){
m_pSet->MoveNext();//使下一条记录成为当前记录
m_nRecordNumber+=1;//记录号加1
}
break;
case ID_RECORD_LAST:
m_pSet->MoveLast();//使最后一条记录成为当前记录
m_nRecordNumber=m_pSet->GetRecordCount();//使记录号等于记录数
break;
default:
ASSERT(false); //若发生其他情况,则终止程序运行
}
ShowRecordNews();//显示记录号、记录数和当前学生班级名称
UpdateData(false);//刷新窗体,显示新的当前记录数据
return 1;
}
void CODBCEmailBookView::ShowRecordNews(){
CMainFrame* pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;//获得主窗口引用
CStatusBar* pStatus=&pFrame->m_wndStatusBar;//获得状态栏引用
CString str;
pStatus->SetPaneText(1,"");
str.Format("记录号:%d",m_nRecordNumber);//构造记录号字符串
pStatus->SetPaneText(1,str);//显示记录号字符串
str.Format("记录数:%d",m_pSet->GetRecordCount());//构造记录数字符串
pStatus->SetPaneText(2,str);//显示记录号字符串
CEdit* pName=(CEdit*)GetDlgItem(IDC_STUCLASSNAME);//获得班级名称显示编辑框控件引用
m_pClassSet->m_strFilter.Format("id=%d",m_pSet->m_stuclassid);//用当前学生班级编号设置过滤条件
m_pClassSet->Requery();//使用过滤条件重新检索数据
pName->SetWindowText(m_pClassSet->m_name);//显示班级名称
return;
}
void CODBCEmailBookView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
CString str;
int nLineHeight=0;
int y=0;
CFont ftitle,fdetail,fheader;
ftitle.CreateFont(300,0,0,0,FW_BOLD,0,0,0,
DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH | FF_ROMAN,"楷体_GB2312");
fheader.CreateFont(150,0,0,0,FW_SEMIBOLD,0,1,0,
DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH | FF_ROMAN,"楷体_GB2312");
fdetail.CreateFont(100,0,0,0,FW_NORMAL,0,0,0,
DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
DEFAULT_QUALITY,DEFAULT_PITCH | FF_ROMAN,"楷体_GB2312");
if (m_pSet->IsBOF()){
return;
}
if (!pInfo || pInfo->m_nCurPage==1){
m_pSet->Requery();//刷新记录集,第一条记录自动成为当前记录输出
}
pDC->SelectObject(&ftitle);//设置报表标题字体
pDC->TextOut(650,0,"ODBCEmail通讯簿");//输出报表标题
TEXTMETRIC tm;
pDC->GetTextMetrics(&tm);
nLineHeight=tm.tmHeight+tm.tmExternalLeading;//获取行高
y = nLineHeight+20;//计算字段标题输出的y轴坐标
pDC->SelectObject(&fheader);//设置字段标题字体
//输出字段标题,可根据实际页面情况调整输出的x轴坐标
pDC->TextOut(100,y,"学号");
pDC->TextOut(700,y,"姓名");
pDC->TextOut(1300,y,"年龄");
pDC->TextOut(1700,y,"性别");
pDC->TextOut(2100,y,"电子邮件");
pDC->GetTextMetrics(&tm);
nLineHeight=tm.tmHeight+tm.tmExternalLeading;//获取新字体下的行高
y+=nLineHeight-20;//计算第一行记录输出的y轴坐标
pDC->SelectObject(&fdetail);//设置记录数据显示字体
pDC->GetTextMetrics(&tm);
nLineHeight=tm.tmHeight+tm.tmExternalLeading;//获取新字体下的行高
//输出数据库表StudentInfo数据
while (!m_pSet->IsEOF())
{
if (pInfo && abs(y)>2700){
//如果是打印或打印预览,不是在窗体中显示数据
//则在一页打满时增加页数,跳出记录集搜索循环
pInfo->SetMaxPage(pInfo->m_nCurPage + 1) ;
break;//记录集搜索循环,停止打印记录数据
}
pDC->TextOut(100,y, m_pSet->m_stuid);//输出学号
pDC->TextOut(700,y, m_pSet->m_stuname);//输出姓名
str.Format("%d",m_pSet->m_age);//将年龄数值转换为字符串
pDC->TextOut(1300,y, str);//输出年龄
pDC->TextOut(1700,y, m_pSet->m_sex);//输出数值
pDC->TextOut(2100,y, m_pSet->m_email);
m_pSet->MoveNext();//使下一条记录成为当前记录
y+=nLineHeight;//计算下一行数据输出的y轴坐标
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -