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

📄 friendsview.cpp

📁 < Visual C++数据库经典开发实例精解>>的实例源码
💻 CPP
字号:
// friendsView.cpp : implementation of the CFriendsView class
//

#include "stdafx.h"
#include "friends.h"

#include "friendsSet.h"
#include "friendsDoc.h"
#include "friendsView.h"

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

/////////////////////////////////////////////////////////////////////////////
// CFriendsView

IMPLEMENT_DYNCREATE(CFriendsView, CDaoRecordView)

BEGIN_MESSAGE_MAP(CFriendsView, CDaoRecordView)
	//{{AFX_MSG_MAP(CFriendsView)
	ON_BN_CLICKED(IDC_BUTTON_QUERY, OnButtonQuery)
	ON_COMMAND(ID_TOOL_NEWRECORD, OnToolNewrecord)
	ON_COMMAND(ID_TOOL_SAVERECORD, OnToolSaverecord)
	ON_COMMAND(ID_TOOL_DELETERECORD, OnToolDeleterecord)
	ON_UPDATE_COMMAND_UI(ID_TOOL_DELETERECORD, OnUpdateToolDeleterecord)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CDaoRecordView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CDaoRecordView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CDaoRecordView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CFriendsView construction/destruction

CFriendsView::CFriendsView()
	: CDaoRecordView(CFriendsView::IDD)
{
	//{{AFX_DATA_INIT(CFriendsView)
	m_pSet = NULL;
	m_querykey = _T("");
	m_recordnews = _T("");
	//}}AFX_DATA_INIT
	// TODO: add construction code here

}

CFriendsView::~CFriendsView()
{
}

void CFriendsView::DoDataExchange(CDataExchange* pDX)
{
	CDaoRecordView::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CFriendsView)
	DDX_Text(pDX, IDC_EDIT_QUERY_KEY, m_querykey);
	DDX_FieldText(pDX, IDC_EDIT_BIRTH, m_pSet->m_birth, m_pSet);
	DDX_FieldText(pDX, IDC_EDIT_EMAIL, m_pSet->m_email, m_pSet);
	DDV_MaxChars(pDX, m_pSet->m_email, 50);
	DDX_FieldText(pDX, IDC_EDIT_HOME, m_pSet->m_home, m_pSet);
	DDV_MaxChars(pDX, m_pSet->m_home, 50);
	DDX_FieldText(pDX, IDC_EDIT_MEMO, m_pSet->m_memo, m_pSet);
	DDV_MaxChars(pDX, m_pSet->m_memo, 255);
	DDX_FieldText(pDX, IDC_EDIT_NAME, m_pSet->m_name, m_pSet);
	DDV_MaxChars(pDX, m_pSet->m_name, 10);
	DDX_FieldText(pDX, IDC_EDIT_PHONE, m_pSet->m_phone, m_pSet);
	DDV_MaxChars(pDX, m_pSet->m_phone, 11);
	DDX_FieldText(pDX, IDC_EDIT_SEX, m_pSet->m_sex, m_pSet);
	DDV_MaxChars(pDX, m_pSet->m_sex, 2);
	DDX_Text(pDX, IDC_EDIT_RECORD, m_recordnews);
	//}}AFX_DATA_MAP
}

BOOL CFriendsView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CDaoRecordView::PreCreateWindow(cs);
}

void CFriendsView::OnInitialUpdate()
{
	m_pSet = &GetDocument()->m_friendsSet;
	CDaoRecordView::OnInitialUpdate();
	GetParentFrame()->RecalcLayout();
	ResizeParentToFit();
	
	m_nRecordNumber=0;//当前记录号初始化为0
	if (!m_pSet->IsEOF()){
		//若记录集不为空,则滚动所有记录,
		//使GetRecordCount函数可以返回准确的记录数
		while(!m_pSet->IsEOF())
			m_pSet->MoveNext();
		m_pSet->MoveFirst();//重新使第一条记录成为当前记录
		m_nRecordNumber=1;//设置当前记录号为1
	}

	CString str;
	//创建记录信息字符串
	str.Format("%d/%d",m_nRecordNumber,m_pSet->GetRecordCount());
	m_recordnews=str;//设置记录信息
	UpdateData(false);//显示新的记录信息
}

/////////////////////////////////////////////////////////////////////////////
// CFriendsView printing

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CFriendsView diagnostics

#ifdef _DEBUG
void CFriendsView::AssertValid() const
{
	CDaoRecordView::AssertValid();
}

void CFriendsView::Dump(CDumpContext& dc) const
{
	CDaoRecordView::Dump(dc);
}

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

/////////////////////////////////////////////////////////////////////////////
// CFriendsView database support
CDaoRecordset* CFriendsView::OnGetRecordset()
{
	return m_pSet;
}


/////////////////////////////////////////////////////////////////////////////
// CFriendsView message handlers

void CFriendsView::OnButtonQuery() 
{
	UpdateData(true);//将窗体数据传递给成员变量
	if (m_querykey=="")	
		m_pSet->m_strFilter="";//取消筛选条件
	else		
		m_pSet->m_strFilter="name like'"+ m_querykey + "*'";//设置筛选条件

	m_pSet->Requery();		//应用筛选条件刷新记录集
	m_nRecordNumber=0;		//重新将当前记录号初始化为0
	if (!m_pSet->IsEOF()){
		//若记录集不为空,则滚动所有记录,
		//使GetRecordCount函数可以返回准确的记录数
		while(!m_pSet->IsEOF())
			m_pSet->MoveNext();
		m_pSet->MoveFirst();	//重新使第一条记录成为当前记录
		m_nRecordNumber=1;		//设置当前记录号为1
	}
	CString str;
	//创建记录信息字符串
	str.Format("%d/%d",m_nRecordNumber,m_pSet->GetRecordCount());
	m_recordnews=str;			//设置记录信息
	UpdateData(false);			//显示新的记录信息	
}



BOOL CFriendsView::OnMove(UINT nIDMoveCommand) 
{
	switch (nIDMoveCommand/*记录指针移动命令消息ID*/)
	{
    case ID_RECORD_PREV://向前移动记录指针        
		if(!(m_nRecordNumber==1))			
			m_nRecordNumber-=1;		//使记录号减1
		break;
    case ID_RECORD_FIRST://使指针指向第一条记录        
		m_nRecordNumber=1;//使记录号为1
        break;
    case ID_RECORD_NEXT://向后移动记录指针
        if(!(m_nRecordNumber==m_pSet->GetRecordCount()))		
			m_nRecordNumber+=1;//记录号加1
		break;        
     case ID_RECORD_LAST: //使指针指向最后一条记录       
		m_nRecordNumber=m_pSet->GetRecordCount();//使记录号等于记录数
        break;
    default:        
        ASSERT(false);		//若发生其他情况,则终止程序运行
    }	
	CDaoRecordView::OnMove(nIDMoveCommand);//执行默认的移动操作
	CString str;
	str.Format("%d/%d",m_nRecordNumber,m_pSet->GetRecordCount());
	m_recordnews=str;
	UpdateData(false);		//刷新窗体,显示新的记录信息
	return 1;
}



void CFriendsView::OnToolNewrecord() 
{
	m_pSet->AddNew();//添加新纪录
	UpdateData(true);//用窗体数据更新新添加的记录
	if (m_pSet->CanUpdate())  {
	  m_pSet->Update();//将记录集更新返回数据库
	  m_nRecordNumber++;
	}
	m_pSet->MoveLast();
	m_nRecordNumber=m_pSet->GetRecordCount();
	CString str;
	//创建记录信息字符串
	str.Format("%d/%d",m_nRecordNumber,m_nRecordNumber);
	m_recordnews=str;//设置记录信息
	UpdateData(false);//刷新窗体	
}

void CFriendsView::OnToolSaverecord() 
{
	m_pSet->Edit();		//使当前记录进入编辑状态
    UpdateData(true);	//将窗体中显示的数据存入记录集
    if (m_pSet->CanUpdate()){
      m_pSet->Update();	//将记录集的更新返回数据库
    }	
	
}

void CFriendsView::OnToolDeleterecord() 
{	
	int n=m_pSet->GetRecordCount();
    try {
        if (n>0)
			m_pSet->Delete();//删除当前记录
		else
			return;//没有记录,直接返回
    }
    catch(CDaoException* e) {
		//如果删除操作发生错误,则显示错误信息
        CDaoErrorInfo* einfo=e->m_pErrorInfo;
		MessageBox(einfo->m_strDescription);//显示错误信息
        e->Delete();//删除错误对象
        m_pSet->MoveFirst(); //使第一条记录成为当前记录
        UpdateData(false);//刷新窗口
        return;
    }
 	if (m_nRecordNumber==n && n>1) {		
		//如果删除了最后一条记录后,记录集中还有记录,
		//则使前一条记录成为当前记录
		m_pSet->MovePrev();
		--m_nRecordNumber;	
	}else{		
		//使下一条记录成为当前记录
		m_pSet->MoveNext();
	}

	CString str;
	//创建记录信息字符串
	str.Format("%d/%d",m_nRecordNumber,m_pSet->GetRecordCount());
	m_recordnews=str;//设置记录信息
    UpdateData(false);//刷新窗口	
	return;
}

void CFriendsView::OnUpdateToolDeleterecord(CCmdUI* pCmdUI) 
{
	pCmdUI->Enable(!m_pSet->IsBOF() && !m_pSet->IsEOF()); 	
}

void CFriendsView::OnPrint(CDC* pDC, CPrintInfo* pInfo) 
{	
	CString str;//用于将数值数据转换为字符串,以便使用TextOut函数输出
	CTime time = CTime::GetCurrentTime();//在打印报表时用于在页脚输出日期
	int nLineHeight=0;//用于计算每行数据占用高度
	int y=0;//用于控制TextOut函数中输出位置的y轴坐标
	
	CFont ftitle/*报表标题字体*/,fdetail/*数据字体*/;
	CFont fheader/*字段标题字体*/,ffooter/*报表页脚字体*/;
	//创建报表标题字体
	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(200,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");
	//创建报表页脚字体
	ffooter.CreateFont(80,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(1400,0,"好友信息报表");//输出报表标题	
	
	TEXTMETRIC tm;
	pDC->GetTextMetrics(&tm);
	nLineHeight=tm.tmHeight+tm.tmExternalLeading;//获取行高
	y = nLineHeight+20;//计算字段标题输出的y轴坐标

	pDC->SelectObject(&fheader);//设置字段标题字体
	//输出字段标题,可根据实际页面情况调整输出的x轴坐标
	pDC->TextOut(100,y,"姓名");
	pDC->TextOut(800,y,"出生日期");
	pDC->TextOut(1800,y,"联系电话");
	pDC->TextOut(2800,y,"电子邮件");
	pDC->TextOut(4600,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)>5000){
			//如果是打印或打印预览,不是在窗体中显示数据
			//则在一页打满时增加页数,跳出记录集搜索循环
			pInfo->SetMaxPage(pInfo->m_nCurPage + 1) ;
			break;//记录集搜索循环,停止打印记录数据
		}
		pDC->TextOut(100,y,m_pSet->m_name);//输出姓名
		str=m_pSet->m_birth.Format(LOCALE_NOUSEROVERRIDE,
										LANG_USER_DEFAULT);
		pDC->TextOut(950,y, str);//输出出生日期		
		pDC->TextOut(1900,y, m_pSet->m_phone);//输出联系电话
		pDC->TextOut(2800,y,m_pSet->m_email);//输出电子邮件地址
		pDC->TextOut(4600,y, m_pSet->m_home);//输出家庭住址
		m_pSet->MoveNext();//使下一条记录成为当前记录
		y+=nLineHeight;//计算下一行数据输出的y轴坐标
    }
	if(pInfo){
		//打印报表页脚
		pDC->SelectObject(&ffooter);				
		str.Format("学生信息报表 第 %d 页 %d年%d月%d日",
			pInfo->m_nCurPage,			
			time.GetYear(),time.GetMonth(),time.GetDay());
		pDC->TextOut(2500,4600,str);
	}		
}


⌨️ 快捷键说明

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