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

📄 odbcemailbookview.cpp

📁 < Visual C++数据库经典开发实例精解>>的实例源码
💻 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 + -