1、 VC++程序设计实验报告 专业: 医药软件开发 班级:08医软(1)班 学号: 08712028 姓名: 盛理想 日期: 2011/4/16 成绩: 一、 实验目的 掌握MFC编程 二、 实验内容 1. 在对话框里用鼠标左键按下、鼠标左键抬起和鼠标移动画红色的曲线 2. 在对话框里用右键按下和OnChar输入文本 3. 在对话框的菜单项里编写一个日历菜单项弹出一个非模式对话框,用户可以同时在一个程序中弹出多个带有日历控件的对话框 三、 实验步骤 (1) 用AppWizard 创建基
2、于对话框的应用程序lixiang (2) 创建新的对话框资源和对话框类 1.在资源查看选项卡对话框中的Menu选项中双击它下面的ID号出现一个对话框,选中一个空的菜单项右键选择属性把它的属性说明改为日历。2.选择标题栏中的插入选项选择资源选择对话框添加一个对话框 3.在新插入的对话框资源上单击鼠标右键,在弹出菜单中选择属性选项,然后在弹出的资源属性对话框中将对话框的说明文字改为“非模式对话框”关闭在对话框中添加一个日历控件,如下图。4.用鼠标右键单击对话框资源,在弹出的菜单中选择属性选项,将弹出的属性对话框切换至更多样式选项卡,在选项卡中确认选中可见复选框5.双击对话框资源,在弹出对话
3、框中选择新建对话框类,单击确认按钮。6.在弹出的新建类对话框建立一个类CModellessDlg (3)添加并修改对话框类CModellessDlg的成员变量和成员函数 1.如图添加两个消息响应函数 2.添加WM_GOODBYE ///////////////////////////////////////////////////////////////////////////// // CModellessDlg dialog #define WM_GOODBYE WM_USER+5 3. 4.重载对话框类的构造函数,添加Create()函数代码如下
4、 public: CModellessDlg(CView* pView); BOOL Create(); 5.在modellessdlg.cpp中添加对话框类CModellessDlg新的函数代码如下 CModellessDlg::CModellessDlg(CView* pView)//modeless constructor { m_pView=pView; } BOOL CModellessDlg::Create() { return CDialog::Create(CModellessDlg::IDD); } 修改消息响应函数OnOK和OnCancel代码
5、如下 Void CModellessDlg::OnOK() { // TODO: Add extra validation here If (m_pView !=NULL) { //modeless cass --do not call base class OnOK UpdateData(TRUE); m_pView->PostMessage(WM_GOODBYE,IDOK); } else { CDialog::OnOK(); } CDialog::OnOK(); } Void CModellessDlg::OnCa
6、ncel() { // TODO: Add extra cleanup here if(m_pView !=NULL) { //modeless Cass --do not call base class OnCancle UpdateData(TRUE); m_pView->PostMessage(WM_GOODBYE,IDCANCEL); } else { CDialog::OnCancel(); } CDialog::OnCancel(); } (4) 添加并修改视图类的成员变量和成员函数 1.在视图类声明的前面加上CM
7、odellessDlg的类声明代码如下 class CModellessDlg; 2.在视图类的pravite字段加两个私有成员 3.在视图类里添加一个用户自定义的消息处理函数OnGoodbye代码如下 protected: //{{AFX_MSG(CLixiangView) t) //}}AFX_MSG afx_msg LRESULT OnGoodbye(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP() 4. 在视图类里添加一个三个消息处理函数如下 5. 在lixiangview。.cp
8、p文件添加#include “modellessdlg.h” 6. 修改视图类的构造函数和析构函数 CLixiangView::CLixiangView() { // TODO: add construction code here pt=0; m_pDlg=new CModellessDlg(this); } CLixiangView::~CLixiangView() { delete m_pDlg; } 7. 接着修改几个消息响应函数 void CLixiangView::OnLButtonDown(UINT nFlags, CPoint po
9、int) { // TODO: Add your message handler code here and/or call default pt=point; mb=true; if(m_pDlg->GetSafeHwnd()==0) { m_pDlg->Create();//显示非模式对话框 } CView::OnLButtonDown(nFlags, point); void CLixiangView::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your mes
10、sage handler code here and/or call default m_pDlg->DestroyWindow(); CView::OnLButtonDblClk(nFlags, point); } LRESULT CLixiangView::OnGoodbye(WPARAM wParam,LPARAM lParam) { //非模式对话框单击确定或者取消的消息响应函数 m_pDlg->DestroyWindow(); return 0L; } void CLixiangView::OnKeyDown(UINT nChar, U
11、INT nRepCnt, UINT nFlags) { // TODO: Add your message handler code here and/or call default m_ModelDlg=new CModellessDlg(CWnd::GetDlgItem(IDD_DIALOG1)); m_ModelDlg->DoModal(); delete m_ModelDlg; CView::OnKeyDown(nChar, nRepCnt, nFlags); } 8. 最后修改视图类的OnDraw函数 void CLixiangView::OnDr
12、aw(CDC* pDC) { CLixiangDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->TextOut(0,0,"请在窗口内单击鼠标左键生成非模式对话框!单击右键关闭非模式对话框!"); pDC->TextOut(0,50,"按下任何非系统键出现模式对话框!"); } (5)三个功能一起运行结果如下图所示 (4)计算四边形的周长和面积结果如下图 定义变量代码如下
13、 // Dialog Data //{{AFX_DATA(CAddDlg) enum { IDD = IDD_DIALOG2 }; float m_a; double C; double m_area; //}}AFX_DATA 计算的代码如下 void CAddDlg::OnCalculate() { UpdateData(TRUE); C=4*m_a; m_area=m_a*m_a; UpdateData(FALSE); } 四、出现问题及解决方 1.问题:怎样在一个界面中既可以画直线又可以画曲线,还可以输入文本?
14、 解决:画曲线时用的消息是左键按下、左键弹起、鼠标移动这三个消息,画直线时用的是右键按下、右键弹起这两个消息,输入文本时用双击左键、onChar()、OnCreate()这三个消息,所以上述三种功能是可以在一个界面中实现。 2.将字符O与数字常量0混淆出现了出现了2056错误,‘OL’没有定义。 解决:把O换成0就解决了这个问题。 3.fatal error 1010:寻找预编译头文件路径时出现了不该出现的文件尾。 解决:在头文件lixiang.h里添加头文件#include”modeless.h” 4.errorC2011 ‘CModellessdlg’class type redefinition 解决:删除一个CModellessdlg类 5.error C2056 “WM_GOODBYE”未定义 解决:它的上一个函数缺少一个}添加就好了






