资源描述
中国地质大学江城学院
VC++ 课程设计
姓 名 黄 宇
班级学号 2611090214
指导教师 刘 艳
2011年6月30日
目 录
设计一 主要控件 2
1 设计内容 2
2 设计准备和说明 2
3 设计步骤 2
4 运行结果 8
设计二 框架窗口界面设计 9
1 设计内容 9
2 设计准备和说明 10
3 设计步骤 10
4 运行结果 12
设计三 文档序列化 12
1 设计内容 12
2 设计准备和说明 13
3 设计步骤 13
4 运行结果 17
设计四 综合 18
1 设计内容 18
2 设计准备和说明 18
3 设计步骤 18
4 运行结果 21
设计一 主要控件
1 设计内容
1)创建一个基于对话框的MFC程序,在主界面上制作一个“用户登录”对话框,当用户输入的“用户名”和“密码”分别是“LiMing ”和“886688”时,显示“学生成绩操作”对话框,否则显示“用户名密码错误,请重新输入!”
2)在1)基础上添加一“学生成绩操作”对话框,当单击“添加”按钮,弹出“学生成绩录入”对话框,输入数据后,学号添加到组合框中,选择组合框中的学号后,学生数据在列表框中显示出来。
3)在1)基础上按本书的“用对话框输入学生成绩”示例创建并设计一个对话框及其CInputDlg类。
4)按本书的“个人通讯簿”实例过程生成一个完整的基于对话框的应用程序,并在对话框中添加三个滚动条来调整对话框的背景颜色。
2 设计准备和说明
1.学习完控件之后开始实验。
2.创建本次实验的工作文件夹。
3 设计步骤
1)至3)学生成绩操作
1.启动Visual C++ 6.0
2.创建一个工程名为Login的基于对话框应用程序
3.按照设计要求在登陆对话框上添加控件并设置好各自的属性
4.为IDD_LOGIN_DIALOG创建对话框类CLoginDlg
5.为CLoginDlg类中的IDC_EDIT1和IDC_EDIT2添加成员变量m_name和m_number
6.为CLoginDlg类中的IDOK和IDCANCEL添加BN_CLICKED的消息映射,并添加下列代码:
21
void CLoginDlg::OnOK()
{
UpdateData(TRUE);
if(m_name=="LiMing"&&m_password=="886688")
{
CScoreDlg dlg;
dlg.DoModal();
}
else MessageBox("没有此用户名或密码错误!","提示");
CDialog::OnOK();
}
void CLoginDlg::OnCancel()
{
m_name="";
m_password="";
UpdateData(FALSE);
}
7.添加一学生成绩输入的对话框,按照设计要求添加控件并设置好各自的属性
8.为IDD_DIALOG1创建对话框类CInputDlg
9.为CInputDlg类中的IDC_EDIT1、IDC_EDIT2、IDC_EDIT3、IDC_EDIT4、IDC_EDIT5、IDC_SPIN1、IDC_SPIN2、IDC_SPIN3依次添加成员变量m_name、m_number、m_score1、m_score2、m_score3、m_spin1、m_spin2、m_spin3
10.为CInputDlg添加WM_INITDIALOG的消息映射,并添加下列代码:
BOOL CInputDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_spin1.SetRange( 0, 100 );
m_spin2.SetRange( 0, 100 );
m_spin3.SetRange( 0, 100 );
return TRUE;
}
11.为CInputDlg添加IDC_SPIN1控件的UDN_DELTAPOS的消息映射,并添加下列代码:
void CInputDlg::OnDeltaposSpin1(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
UpdateData(TRUE);
m_score1 += (float)pNMUpDown->iDelta * 0.5f;
if (m_score1<0.0) m_score1 = 0.0f;
if (m_score1>100.0) m_score1 = 100.0f;
UpdateData(FALSE);
*pResult = 0;
}
12.修改CInputDlg类中IDOK的BN_CLICKED消息映射的代码:
void CInputDlg::OnOK()
{
UpdateData(TRUE);
m_name.TrimLeft();
m_number.TrimLeft();
if(m_name.IsEmpty())
MessageBox("学生姓名不能为空!");
else
if(m_number.IsEmpty())
MessageBox("学生学号不能为空!");
else CDialog::OnOK();
}
13.添加一学生成绩输入的对话框,按照设计要求添加控件并设置好各自的属性
14.为IDD_DIALOG2创建对话框类CScoreDlg
15.为CScoreDlg类中的IDC_LIST1和IDC_COMBO1添加控件变量m_list和m_combo
16.为CScoreDlg类中的IDC_BUTTON1添加BN_CLICKED的消息映射,并添加下列代码:
void CScoreDlg::OnButton1()
{
CInputDlg dlg;
if(IDOK==dlg.DoModal())
{
if(m_combo.FindString(-1,dlg.m_number)<0)
{
int nIndex=m_combo.AddString(dlg.m_number);
STUDATA data;
data.name=dlg.m_name;
data.number=dlg.m_number;
data.score1=dlg.m_score1;
data.score2=dlg.m_score2;
data.score3=dlg.m_score3;
m_combo.SetItemDataPtr(nIndex,new STUDATA(data));
}
m_combo.SetCurSel(0);
OnChangeCombo();
}
}
17.CScoreDlg类中的IDC_COMBO1添加CBN_SELCHANGE的消息映射,将其映射函数改为OnChangeCombo,并添加下列代码:
void CScoreDlg::OnChangeCombo()
{
int nIndex=m_combo.GetCurSel();
if(nIndex!=CB_ERR)
{
m_list.ResetContent();
STUDATA *data;
data=(STUDATA *)m_combo.GetItemDataPtr(nIndex);
CString str;
str="姓名:"+data->name;
m_list.AddString(str);
str="学号:"+data->number;
m_list.AddString(str);
str.Format("成绩1:%4.1f,成绩2:%4.1f,成绩3:%4.1f",
data->score1,data->score2,data->score3);
m_list.AddString(str);
}
}
18.编译并运行整个工程
4)个人通讯簿
1.启动Visual C++ 6.0
2.创建一个工程名为Ex_Address的基于对话框应用程序
3.添加并构造基本情况对话框,创建对话框类CBaseInfoDlg,添加成员变量m_strName、m_strNick、m_timeBirth、m_chSex,添加成员函数变量UpdateSexField
4.添加并构造私人资料对话框,创建对话框类CPrivateDlg,添加成员变量m_strHOME、m_strTEL、m_GSM、m_Email
5.添加并构造单位信息对话框,创建对话框类CWorkDlg,添加成员变量m_strWorkName、m_strADD、m_strTEL、m_strFAX
6.设计主对话框,创建对话框类CEx_AddressDlg,添加成员变量m_List、m_Tab,添加成员函数SetDlgState和DoTab,并添加下列代码:
void CEx_AddressDlg::SetDlgState(CWnd *pWnd, BOOL bShow)
{
pWnd->EnableWindow(bShow);
if (bShow)
{
pWnd->ShowWindow(SW_SHOW);
pWnd->CenterWindow();
}
else pWnd->ShowWindow(SW_HIDE);
}
void CEx_AddressDlg::DoTab(int nSel)
{
if (nSel>2) nSel = 2;
if (nSel<0) nSel = 0;
BOOL bTab[3];
bTab[0] = bTab[1] = bTab[2] = FALSE;
bTab[nSel] = TRUE;
SetDlgState(m_pBaseInfoDlg, bTab[0]);
SetDlgState(m_pPrivateDlg, bTab[1]);
SetDlgState(m_pWorkDlg, bTab[2]);
}
7.为CEx_AddressDlg类中的IDC_TAB1添加TCN_SELCHANGE的消息映射,并添加下列代码:
void CEx_AddressDlg::OnSelchangeTab1
(NMHDR* pNMHDR, LRESULT* pResult)
{
int nSelect = m_Tab.GetCurSel();
if (nSelect >= 0) DoTab(nSelect);
*pResult = 0;
*pResult = 0;
}
8.在CEx_AddressDlg::OnInitDialog中添加下列代码:
m_Tab.SetImageList(&m_ImageList);
m_Tab.InsertItem(0,"基本情况",0);
m_Tab.InsertItem(1,"私人资料",1);
m_Tab.InsertItem(2,"单位信息",2);
m_Tab.SetCurSel(0);
m_pBaseInfoDlg=new CBaseInfoDlg;
m_pBaseInfoDlg->Create
(IDD_DIALOG_BASEINFO,GetDlgItem(IDC_STATIC_DLG));
m_pPrivateDlg=new CPrivateDlg;
m_pPrivateDlg->Create
(IDD_DIALOG_PRIVATE,GetDlgItem(IDC_STATIC_DLG));
m_pWorkDlg=new CWorkDlg;
m_pWorkDlg->Create(IDD_DIALOG_WORK,GetDlgItem(IDC_STATIC_DLG));DoTab(0);
ADDRESS data,data1,data2;
data.strName="LiMing";
data.strNick="Peter";
data.chSex='G';
data.tBirth=CTime(1984,5,6,0,0,0);
data.strHomeAdd="江苏南京";
data.strWorkName="南京师范大学";
data1=data;
data1.strName="WangFang";
data1.strNick="Mary";
data1.chSex='M';
data1.tBirth=CTime(1984,12,5,0,0,0);
int nIndex=m_List.AddString(data.strName);
m_List.SetItemDataPtr(nIndex,new ADDRESS(data));
nIndex=m_List.AddString(data1.strName);
m_List.SetItemDataPtr(nIndex,new ADDRESS(data1));
9.为CEx_AddressDlg类中的IDC_LIST1添加LBN_SELCHANGE的消息映射,并添加下列代码:
void CEx_AddressDlg::OnSelchangeList1()
{
int nIndex = m_List.GetCurSel();
if (nIndex != LB_ERR)
{
ADDRESS *data=(ADDRESS *)m_List.GetItemDataPtr(nIndex);
m_pBaseInfoDlg->m_strName = data->strName;
m_pBaseInfoDlg->m_strNick = data->strNick;
m_pBaseInfoDlg->m_chSex = data->chSex;
m_pBaseInfoDlg->m_timeBirth = data->tBirth;
m_pPrivateDlg->m_strHOME = data->strHomeAdd;
m_pPrivateDlg->m_strTEL = data->strHomeTel;
m_pPrivateDlg->m_strGSM = data->strGSM;
m_pPrivateDlg->m_strEmail = data->strEmail;
m_pWorkDlg->m_strWorkName = data->strWorkName;
m_pWorkDlg->m_strADD = data->strWorkAdd;
m_pWorkDlg->m_strTEL = data->strWorkTel;
m_pWorkDlg->m_strFAX = data->strWorkFax;
m_pBaseInfoDlg->UpdateData( FALSE );
m_pBaseInfoDlg->UpdateSexField();
m_pPrivateDlg->UpdateData( FALSE );
m_pWorkDlg->UpdateData( FALSE );
}
}
10.为CEx_AddressDlg添加成员变量m_nRedValue和m_Brush
11.在CEx_AddressDlg::OnInitDialog中添加下列代码:
m_scrollRed.SetScrollRange(0, 255);
m_sliderBlue.SetRange(0, 255);
m_sliderGreen.SetRange(0, 255);
m_nBlue = m_nGreen = m_nRedValue = 192;
UpdateData( FALSE );
m_scrollRed.SetScrollPos(m_nRedValue);
12.为CEx_AddressDlg添加WM_VSCROLL的消息映射,并添加下列代码:
void CEx_AddressDlg::OnVScroll
(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
int nID = pScrollBar->GetDlgCtrlID();
if (nID == IDC_SCROLLBAR_RED)
{
switch(nSBCode)
{
case SB_LINEUP:m_nRedValue--;break;
case SB_LINEDOWN:m_nRedValue++;break;
case SB_PAGEUP:m_nRedValue -= 10;break;
case SB_PAGEDOWN:m_nRedValue += 10;break;
case SB_THUMBTRACK:m_nRedValue = nPos;break;
}
if (m_nRedValue<0) m_nRedValue = 0;
if (m_nRedValue>255) m_nRedValue = 255;
m_scrollRed.SetScrollPos(m_nRedValue);
}
Invalidate();
CDialog::OnVScroll(nSBCode, nPos, pScrollBar);
}
13.为CEx_AddressDlg添加WM_CTLCOLOR的消息映射,并添加下列代码:
HBRUSH CEx_AddressDlg::OnCtlColor
(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
UpdateData(TRUE);
COLORREF color = RGB(m_nRedValue, m_nGreen, m_nBlue);
m_Brush.Detach();
m_Brush.CreateSolidBrush(color);
pDC->SetBkColor( color );
return (HBRUSH)m_Brush;
}
14. 编译并运行整个工程
4 运行结果
设计二 框架窗口界面设计
1 设计内容
1)创建一个单文档应用程序Ex_SDI,开始运行时主窗口框架的大小为屏幕的1/4大小,并移动到屏幕的右上角。当单击工具栏上的圆圈按钮时,该按钮呈按下状态,此时在窗口的客户区的光标为圆圈。当双击鼠标时,则状态栏上显示“你在(x,y )处双击鼠标”((x ,y)为鼠标在客户区的位置)。若再单击工具栏上的圆圈按钮,则该按钮呈正常状态,光标变成原来的箭形,双击鼠标,状态栏上不再显示任何文本。
2)在上述程序的基础上,改变窗口菜单为一个单一弹出式菜单“测试”,其下包含一菜单项“改变光标”(和工具按钮ID_TEST联动),且该菜单项拥有键盘快捷键“Ctrl+G”,要求右击鼠标时弹出“测试”菜单的子菜单。
3)在上述程序的基础上,为Ex_SDI添加并设计具有动画效果的应用程序图标。
2 设计准备和说明
1.学习完框架窗口界面之后开始实验。
2.创建本次实验的工作文件夹。
3 设计步骤
1.启动Visual C++ 6.0
2.创建一个工程名为Ex_SDI的单文档应用程序
3.在CEx_SDIApp::InitInstance函数的最后添加下列代码:
CRect rcDesktop;
::GetWindowRect(GetDesktopWindow(),rcDesktop);
m_pMainWnd->MoveWindow
(rcDesktop.Width()/2,0,rcDesktop.Width()/2,rcDesktop.Height()/2);
4.为CMainFrame类添加一个成员变量m_hCursor,添加WM_SETCURSOR的消息映射,并添加下列代码:
BOOL CMainFrame::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
BOOL bRes=CFrameWnd::OnSetCursor(pWnd,nHitTest,message);
if((nHitTest==HTCLIENT)&&(m_bIsTest))
{
m_hCursor=AfxGetApp()->LoadCursor(IDC_CURSOR1);
SetCursor(m_hCursor);
bRes=TRUE;
}
return bRes;
}
5.在CEx_SDIView类中添加WM_LBUTTONDBLCLK的消息映射,并添加下列代码:
void CEx_SDIView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CMainFrame*pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd;
CStatusBar*pStatus=&pFrame->m_wndStatusBar;
CString str;
if(pFrame->m_bIsTest)
str.Format("你在(%d,%d)处双击鼠标",point.x,point.y);
else
str.Empty();
if(pStatus)
pStatus->SetPaneText(1,str);
CView::OnLButtonDblClk(nFlags, point);
}
6.删去菜单栏所有的菜单项,添加一个“测试”菜单,在Accelerator的IDR_MAINFRAME创建该菜单项的快捷键
7.为CMainFrame添加WM_CONTEXTMENU的消息映射,并添加下列代码:
void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu* pSysMenu = GetMenu();
pSysMenu->GetSubMenu(0)->TrackPopupMenu
(TPM_LEFTALIGN|TPM_RIGHTBUTTON,point.x,point.y,this);
}
8.添加四个图标资源,并绘制图标
9.为CMainFrame添加一个成员函数ChangeIcon,并添加下列代码:
void CMainFrame::ChangeIcon(UINT nIconID)
{
HICON hIconNew = AfxGetApp()->LoadIcon(nIconID);
HICON hIconOld = (HICON)GetClassLong(m_hWnd, GCL_HICON);
if (hIconNew != hIconOld)
{
DestroyIcon(hIconOld);
SetClassLong(m_hWnd, GCL_HICON, (long)hIconNew);
RedrawWindow();
}
}
10.在CMainFrame::OnCreate函数的最后添加代码:SetTimer(1,500,NULL)
11.为CMainFrame添加WM_TIMER的消息映射,并添加下列代码:
void CMainFrame::OnTimer(UINT nIDEvent)
{
static int icons[] = { IDI_ICON1, IDI_ICON2, IDI_ICON3, IDI_ICON4};
static int index = 0;
ChangeIcon(icons[index]);
index++;
if (index>3)
index = 0;
CFrameWnd::OnTimer(nIDEvent);
}
12. 编译并运行整个工程
4 运行结果
设计三 文档序列化
1 设计内容
1)用MFC AppWizard创建一个单文档应用程序Ex_Student,它首先通过对话框来输入一个学生成绩记录,记录包括学生的姓名、学号和三门成绩。然后将记录内容保存到一个对象数组集合类对象中,最后通过文档序列化将记录保存到一个文件中。当添加记录或打开一个记录文件时,还会将数据显示在文档窗口(即视图)中。
2)在Ex_Student中,还有一个不足的地方,即需要在文件内容的前面加上一个自定义的文件头结构来区分学生成绩记录文件和其他数据文件。这里所用到的文件头结构包含文件类型和注释。为文件头创建一个类CStuHeader,并使该类可序列化,添加操作代码,完善实例Ex_Student。
2 设计准备和说明
1.学习完文档序列化之后开始实验。
2.创建本次实验的工作文件夹。
3 设计步骤
1.启动Visual C++ 6.0
2.创建一个工程名为Ex_Student的单文档应用程序
3.复制设计一中的IDD_DIALOG1对话框,包括对话框类CInputDlg的代码
4.打开CEx_StudentDoc.h文件,在class CEx_StudentDoc前添加下列代码:
class CStudent:public CObject
{
CString strName;
CString strNO;
float fScore1,fScore2,fScore3;
float fAverage;
DECLARE_SERIAL(CStudent)
public:CStudent(){};
CStudent(CString name,CString id,float f1,float f2,float f3);
void Serialize(CArchive &ar);
void Display(int y,CDC *pDC);
};
5.打开CEx_StudentDoc.cpp文件,在文件最后添加CStudent实现代码:
CStudent::CStudent(CString name,CString id,float f1,float f2,float f3)
{
strName=name;
strNO=id;
fScore1=f1;
fScore2=f2;
fScore3=f3;
fAverage=(float)((f1+f2+f3)/3.0);
}
void CStudent::Display(int y,CDC *pDC)
{
CString str;
str.Format("%s %s %f %f %f %f",
strName,strNO,fScore1,fScore2,fScore3,fAverage);
pDC->TextOut(0,y,str);
}
IMPLEMENT_SERIAL(CStudent,CObject,1)
void CStudent::Serialize(CArchive &ar)
{
if(ar.IsStoring())
ar<<strName<<strNO<<fScore1<<fScore2<<fScore3<<fAverage;
else
ar>>strName>>strNO>>fScore1>>fScore2>>fScore3>>fAverage;
}
6.为CEx_StudentDoc类中的ID_STUREC添加COMMAND的消息映射,并添加下列代码:
void CEx_StudentDoc::OnSturecAdd()
{
CInputDlg dlg;
if(IDOK==dlg.DoModal())
{
CStudent *pStudent=new CStudent
(dlg.m_strName,dlg.m_strNO,dlg.m_fScore1,dlg.m_fScore2,dlg.m_fScore3);
m_stuObArray.Add(pStudent);
SetModifiedFlag();
UpdateAllViews(NULL);
}
}
7.为CEx_StudentDoc添加成员函数CStudent * GetStudentAt(int nIndex),并添加下列代码:
CStudent * CEx_StudentDoc::GetStudentAt(int nIndex)
{
if((nIndex<0)||nIndex>m_stuObArray.GetUpperBound())
return 0;
return(CStudent *)m_stuObArray.GetAt(nIndex);
}
8.为CEx_StudentDoc添加成员函数int GetAllRecNum(void),并添加如下代码:
int CEx_StudentDoc::GetAllRecNum()
{return m_stuObArray.GetSize();}
9.在~CEx_StudentDoc中添加下列代码:
CEx_StudentDoc::~CEx_StudentDoc()
{
int nIndex=GetAllRecNum();
while(nIndex--)
delete m_stuObArray.GetAt(nIndex);
m_stuObArray.RemoveAll();
}
10.将CEx_StudentView::OnDraw代码修改如下:
void CEx_StudentView::OnDraw(CDC* pDC)
{
CEx_StudentDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int y=0;
for(int nIndex=0;nIndex<pDoc->GetAllRecNum();nIndex++)
{
pDoc->GetStudentAt(nIndex)->Display(y,pDC);
y+=16;
}
}
11.打开文档的字符串资源IDR_MAINFRAME,将其内容修改为:
Ex_Student\nStudentRec\nEx_Stu\n
记录文件(*.rec)\n.rec\nExStudent.Document\nEx_Stu Document
12.打开CEx_StudentDoc.h文件,在class CStudent:public CObject前添加下列代码:
class CStuHeader:public CObject
{
CString strTypeName;
CString strComment;
DECLARE_SERIAL(CStuHeader)
public:CStuHeader(){};
CStuHeader(CString name,CString comment)
{
strTypeName=name;
strComment=comment;
}
void Serialize(CArchive &ar);
BOOL IsThisFile(CString str)
{
if(str==strTypeName) return TRUE;
else return FALSE;
}
};
13.打开CEx_StudentDoc.cpp文件,在文件最后添加实现代码:
IMPLEMENT_SERIAL(CStuHeader,CObject,2)
void CStuHeader::Serialize(CArchive &ar)
{
if(ar.IsStoring()) ar<<strTypeName<<strComment;
else ar>>strTypeName>>strComment;
}
14.将CEx_StudentDoc::Serialize代码修改如下:
void CEx_StudentDoc::Serialize(CArchive& ar)
{
CStuHeader header("STU","这是学生成绩记录文件!");
if (ar.IsStoring())
{
header.Serialize(ar);
m_stuObArray.Serialize(ar);
}
else
{
header.Serialize(ar);
if(header.IsThisFile("STU"))
m_stuObArray.Serialize(ar);
else AfxMessageBox("打开的文档不是学生成绩记录文件!");
}
}
15. 编译并运行整个工程
4 运行结果
设计四 综合
1 设计内容
1)参照Windows系统自带的计算器,用VC++完成一个简单计算器的设计,要求能实现基本的加减乘除运算。
2)编写一个Windows应用程序,要求窗口上有菜单资源和相应的工具栏,通过选中不同的菜单项或工具栏可以画线段,画矩形和画椭圆,并有对话框对该程序进行介绍。
2 设计准备和说明
1.学习完VC++后开始实验。
2.创建本次实验的工作文件夹。
3 设计步骤
1)计算器
1.启动Visual C++ 6.0
2.创建一个工程名为Computer基于对话框的应用程序
3. 参照Windows系统自带的计算器,画出计算器外观
4.为IDD_COMPUTER_DIALOG创建类对象“ComputerDlg”
5.为ComputerDlg添加成员变量fuhao、m_1、m_2、m_hIcon和m_str
6.为ComputerDlg建立OnCommand的消息映射,然后编辑下列代码:
BOOL CComputerDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
if(LOWORD(wParam)==IDC_BUTTON_0)
{
m_str+="0";
UpdateData(FALSE);
}
if(LOWORD(wParam)==IDC_BUTTON_1)
{
m_str+="1";
UpdateData(FALSE);
}
if(LOWORD(wParam)==IDC_BUTTON_2)
{
m_str+="2";
UpdateData(FALSE);
}
if(LOWORD(wParam)==IDC_BUTTON_3)
{
m_str+="3";
UpdateData(FALSE);
}
if(LOWORD(wParam)==IDC_BUTTON_4)
{
m_str+="4";
UpdateData(FALSE);
}
if(L
展开阅读全文