资源描述
VC++程序设计实验报告
专业: 医药软件开发 班级:08医软(1)班 学号: 08712028
姓名: 盛理想 日期: 2011/4/16 成绩:
一、 实验目的
掌握MFC编程
二、 实验内容
1. 在对话框里用鼠标左键按下、鼠标左键抬起和鼠标移动画红色的曲线
2. 在对话框里用右键按下和OnChar输入文本
3. 在对话框的菜单项里编写一个日历菜单项弹出一个非模式对话框,用户可以同时在一个程序中弹出多个带有日历控件的对话框
三、 实验步骤
(1) 用AppWizard 创建基于对话框的应用程序lixiang
(2) 创建新的对话框资源和对话框类
1.在资源查看选项卡对话框中的Menu选项中双击它下面的ID号出现一个对话框,选中一个空的菜单项右键选择属性把它的属性说明改为日历。2.选择标题栏中的插入选项选择资源选择对话框添加一个对话框
3.在新插入的对话框资源上单击鼠标右键,在弹出菜单中选择属性选项,然后在弹出的资源属性对话框中将对话框的说明文字改为“非模式对话框”关闭在对话框中添加一个日历控件,如下图。4.用鼠标右键单击对话框资源,在弹出的菜单中选择属性选项,将弹出的属性对话框切换至更多样式选项卡,在选项卡中确认选中可见复选框5.双击对话框资源,在弹出对话框中选择新建对话框类,单击确认按钮。6.在弹出的新建类对话框建立一个类CModellessDlg
(3)添加并修改对话框类CModellessDlg的成员变量和成员函数
1.如图添加两个消息响应函数
2.添加WM_GOODBYE
/////////////////////////////////////////////////////////////////////////////
// CModellessDlg dialog
#define WM_GOODBYE WM_USER+5
3.
4.重载对话框类的构造函数,添加Create()函数代码如下
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代码如下
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::OnCancel()
{
// 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.在视图类声明的前面加上CModellessDlg的类声明代码如下
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。.cpp文件添加#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 point)
{
// 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 message 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, UINT 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::OnDraw(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)计算四边形的周长和面积结果如下图
定义变量代码如下
// 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.问题:怎样在一个界面中既可以画直线又可以画曲线,还可以输入文本?
解决:画曲线时用的消息是左键按下、左键弹起、鼠标移动这三个消息,画直线时用的是右键按下、右键弹起这两个消息,输入文本时用双击左键、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”未定义
解决:它的上一个函数缺少一个}添加就好了
展开阅读全文