📄 friendsview.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 + -