1、中南大学面向对象程序设计上机汇报题目: 对话框学生姓名:学号: 专业班级:指导老师:数学科学和计算技术学院11月一、 上机目标、内容:学习向对话框控件联接数据组员及其实现机理;向对话框控关联控件类;利用对话框类组员函数向控件发送消息和获取对话框控件类指针。明白怎样让对话框上文本框在程序开启后立即取得焦点,怎样利用SetWindowLong改变窗口回调函数,经过改变文本框默认回车处理方法进行演示。最终利用对话框制作一个简单计算器。二、 上机程序设计具体内容:对话框利用对话框制作计算器:1.1创建工程(单文档)1.2工程“资源视图”处右击添加资源Dialog新建1.3左键双击上图、设置类名等。1.
2、4添加菜单项,使得点击菜单时出现这个窗口:(1).资源视图menu 双击IDR_MAINFRAME(2).添加菜单名称为“对话框”(3).在右边出现属性中将Popup设置为“false”(4).将ID设置为1.5右击“对话框”添加时间处理器放在View类里编辑添加编辑1.6在view类里添加所需要头文件: #include TestDlg.h1.7在对话框上面添加一个按钮(1) .在最右边点击“工具箱”(2).将一个按钮拖到对话框右击按钮选择属性在属性栏将ID改为IDC_BTN_ADD caption改为Add(3).添加多个静态文本框控件(选择一个控件,再按住Ctrl进行拖动就能“复制”)(
3、4).利用组员变量操控3个编辑框右击文本框添加变量将类别改为value将变量类型改为int设置变量名完成1.8实现“Add”功效右击选择添加事件处理器,在TestDialog里这么加法就实现了1.9再添加3个按钮齐全加减乘除功效:一样将其ID分别改为IDC_BTN_ADD IDC_BTN_JIAN IDC_BTN_CHENG IDC_BTN_CHU分别添加事件处理器UpdateData();/数据切换这么加减乘除功效就全部有了,不过因为我们定义其变量时候是int型,所以可能造成除数原来不为0,但结果为0 。比如: 1/2等于0。最终程序结果图:三、 上机程序设计心得:我们经过学习面向对象程序设
4、计,发觉在VS中添加MFC中消息处理函数和VC6.0是不一样。我们只能经过类视图,右键需要添加处理函数类,选择属性,在属性窗口中,单击“消息”按钮,然后在消息列表框中,选择需要添加消息。而在利用MessageBox时,我们需要用到一个中间类型TEXT对字符进行转换。这些全部是我们所碰到问题,但我们全部能够经过查询MSDN进行处理。四、附录:(3)源程序关键代码/ MainFrm.cpp : CMainFrame 类实现#include stdafx.h#include MyBole.h#include MainFrm.h#ifdef _DEBUG#define new DEBUG_NEW#en
5、dif/ CMainFrameIMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)ON_WM_CREATE()END_MESSAGE_MAP()static UINT indicators =ID_SEPARATOR, / 状态行指示器ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,;/ CMainFrame 结构/析构CMainFrame:CMainFrame()/ TODO: 在此添加组员初始化代码CMainFrame:C
6、MainFrame()int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CFrameWnd:OnCreate(lpCreateStruct) = -1)return -1;if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) |!m_wndToolBar.LoadToolBar(IDR_MAINFR
7、AME)TRACE0(未能创建工具栏n);return -1; / 未能创建if (!m_wndStatusBar.Create(this) |!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)TRACE0(未能创建状态栏n);return -1; / 未能创建/ TODO: 假如不需要工具栏可停靠,则删除这三行m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndT
8、oolBar);return 0;BOOL CMainFrame:PreCreateWindow(CREATESTRUCT& cs)if( !CFrameWnd:PreCreateWindow(cs) )return FALSE;/ TODO: 在此处经过修改/ CREATESTRUCT cs 来修改窗口类或样式return TRUE;/ CMainFrame 诊疗#ifdef _DEBUGvoid CMainFrame:AssertValid() constCFrameWnd:AssertValid();void CMainFrame:Dump(CDumpContext& dc) const
9、CFrameWnd:Dump(dc);#endif /_DEBUG/ CMainFrame 消息处理程序/ MyBole.cpp : 定义应用程序类行为。#include stdafx.h#include MyBole.h#include MainFrm.h#include MyBoleDoc.h#include MyBoleView.h#ifdef _DEBUG#define new DEBUG_NEW#endif/ CMyBoleAppBEGIN_MESSAGE_MAP(CMyBoleApp, CWinApp)ON_COMMAND(ID_APP_ABOUT, &CMyBoleApp:OnA
10、ppAbout)/ 基于文件标准文档命令ON_COMMAND(ID_FILE_NEW, &CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN, &CWinApp:OnFileOpen)/ 标准打印设置命令ON_COMMAND(ID_FILE_PRINT_SETUP, &CWinApp:OnFilePrintSetup)END_MESSAGE_MAP()/ CMyBoleApp 结构CMyBoleApp:CMyBoleApp()/ TODO: 在此处添加结构代码,/ 将全部关键初始化放置在InitInstance 中/ 唯一一个CMyBoleApp 对象CMyBo
11、leApp theApp;/ CMyBoleApp 初始化BOOL CMyBoleApp:InitInstance()/ 假如一个运行在Windows XP 上应用程序清单指定要/ 使用ComCtl32.dll 版本6 或更高版原来启用可视化方法,/则需要InitCommonControlsEx()。不然,将无法创建窗口。INITCOMMONCONTROLSEX InitCtrls;InitCtrls.dwSize = sizeof(InitCtrls);/ 将它设置为包含全部要在应用程序中使用/ 公共控件类。InitCtrls.dwICC = ICC_WIN95_CLASSES;InitCo
12、mmonControlsEx(&InitCtrls);CWinApp:InitInstance();/ 初始化OLE 库if (!AfxOleInit()AfxMessageBox(IDP_OLE_INIT_FAILED);return FALSE;AfxEnableControlContainer();/ 标准初始化/ 假如未使用这些功效并期望减小/ 最终可实施文件大小,则应移除下列/ 不需要特定初始化例程/ 更改用于存放设置注册表项/ TODO: 应合适修改该字符串,/ 比如修改为企业或组织名SetRegistryKey(_T(应用程序向导生成当地应用程序);LoadStdProfileS
13、ettings(4); / 加载标准INI 文件选项(包含MRU)/ 注册应用程序文档模板。文档模板/ 将用作文档、框架窗口和视图之间连接CSingleDocTemplate* pDocTemplate;pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMyBoleDoc),RUNTIME_CLASS(CMainFrame), / 主SDI 框架窗口RUNTIME_CLASS(CMyBoleView);if (!pDocTemplate)return FALSE;AddDocTemplate(pDocTempl
14、ate);/ 分析标准外壳命令、DDE、打开文件操作命令行CCommandLineInfo cmdInfo;ParseCommandLine(cmdInfo);/ 调度在命令行中指定命令。假如/ 用/RegServer、/Register、/Unregserver 或/Unregister 开启应用程序,则返回FALSE。if (!ProcessShellCommand(cmdInfo)return FALSE;/ 唯一一个窗口已初始化,所以显示它并对其进行更新m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow();/ 仅当含有后缀时才
15、调用DragAcceptFiles/ 在SDI 应用程序中,这应在ProcessShellCommand 以后发生return TRUE;/ 用于应用程序“相关”菜单项CAboutDlg 对话框class CAboutDlg : public CDialogpublic:CAboutDlg();/ 对话框数据enum IDD = IDD_ABOUTBOX ;protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持/ 实现protected:DECLARE_MESSAGE_MAP();CAboutDlg:CAb
16、outDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)END_MESSAGE_MAP()/ 用于运行对话框应用程序命令void CMyBoleApp:OnAppAbout()CAboutDlg aboutDlg;aboutDlg.DoModal();/ CMyBoleApp 消息处理程序/ MyBoleDoc.cpp : CMyBoleDoc 类实现#inc
17、lude stdafx.h#include MyBole.h#include MyBoleDoc.h#ifdef _DEBUG#define new DEBUG_NEW#endif/ CMyBoleDocIMPLEMENT_DYNCREATE(CMyBoleDoc, CDocument)BEGIN_MESSAGE_MAP(CMyBoleDoc, CDocument)END_MESSAGE_MAP()/ CMyBoleDoc 结构/析构CMyBoleDoc:CMyBoleDoc()/ TODO: 在此添加一次性结构代码CMyBoleDoc:CMyBoleDoc()BOOL CMyBoleDoc:
18、OnNewDocument()if (!CDocument:OnNewDocument()return FALSE;/ TODO: 在此添加重新初始化代码/ (SDI 文档将重用该文档)return TRUE;/ CMyBoleDoc 序列化void CMyBoleDoc:Serialize(CArchive& ar)if (ar.IsStoring()/ TODO: 在此添加存放代码else/ TODO: 在此添加加载代码/ CMyBoleDoc 诊疗#ifdef _DEBUGvoid CMyBoleDoc:AssertValid() constCDocument:AssertValid()
19、;void CMyBoleDoc:Dump(CDumpContext& dc) constCDocument:Dump(dc);#endif /_DEBUG/ CMyBoleDoc 命令/ MyBoleView.cpp : CMyBoleView 类实现#include stdafx.h#include MyBole.h#include MyBoleDoc.h#include MyBoleView.h#include TestDialog.h#ifdef _DEBUG#define new DEBUG_NEW#endif/ CMyBoleViewIMPLEMENT_DYNCREATE(CMyB
20、oleView, CView)BEGIN_MESSAGE_MAP(CMyBoleView, CView)/ 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView:OnFilePrintPreview)ON_COMMAND(IDM_DIALOG, &CMyBoleView:OnDialog)END_MESSAGE_MAP()/ CMyBoleView 结构/析构CM
21、yBoleView:CMyBoleView()/ TODO: 在此处添加结构代码CMyBoleView:CMyBoleView()BOOL CMyBoleView:PreCreateWindow(CREATESTRUCT& cs)/ TODO: 在此处经过修改/ CREATESTRUCT cs 来修改窗口类或样式return CView:PreCreateWindow(cs);/ CMyBoleView 绘制void CMyBoleView:OnDraw(CDC* /*pDC*/)CMyBoleDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!
22、pDoc)return;/ TODO: 在此处为本机数据添加绘制代码/ CMyBoleView 打印BOOL CMyBoleView:OnPreparePrinting(CPrintInfo* pInfo)/ 默认准备return DoPreparePrinting(pInfo);void CMyBoleView:OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/ TODO: 添加额外打印前进行初始化过程void CMyBoleView:OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)/
23、 TODO: 添加打印后进行清除过程/ CMyBoleView 诊疗#ifdef _DEBUGvoid CMyBoleView:AssertValid() constCView:AssertValid();void CMyBoleView:Dump(CDumpContext& dc) constCView:Dump(dc);CMyBoleDoc* CMyBoleView:GetDocument() const / 非调试版本是内联ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CMyBoleDoc);return (CMyBoleDoc*)m_pDocume
24、nt;#endif /_DEBUG/ CMyBoleView 消息处理程序void CMyBoleView:OnDialog()/TODO: 在此添加命令处理程序代码CTestDialog dlg;dlg.DoModal();/ TestDialog.cpp : 实现文件#include stdafx.h#include MyBole.h#include TestDialog.h/ CTestDialog 对话框IMPLEMENT_DYNAMIC(CTestDialog, CDialog)CTestDialog:CTestDialog(CWnd* pParent /*=NULL*/): CDi
25、alog(CTestDialog:IDD, pParent), m_num1(0), num2(0), m_num3(0)CTestDialog:CTestDialog()void CTestDialog:DoDataExchange(CDataExchange* pDX)CDialog:DoDataExchange(pDX);DDX_Text(pDX, IDC_EDIT1, m_num1);DDX_Text(pDX, IDC_EDIT2, num2);DDX_Text(pDX, IDC_EDIT3, m_num3);BEGIN_MESSAGE_MAP(CTestDialog, CDialog
26、)ON_BN_CLICKED(IDC_BTN_ADD, &CTestDialog:OnBnClickedBtnAdd)ON_BN_CLICKED(IDC_BTN_JIAN, &CTestDialog:OnBnClickedBtnJian)ON_BN_CLICKED(IDC_BTN_CHENG, &CTestDialog:OnBnClickedBtnCheng)ON_BN_CLICKED(IDC_BTN_CHU, &CTestDialog:OnBnClickedBtnChu)END_MESSAGE_MAP()/ CTestDialog 消息处理程序void CTestDialog:OnBnCli
27、ckedBtnAdd()/ TODO: 在此添加控件通知处理程序代码UpdateData();/数据切换m_num3=m_num1+num2;UpdateData(FALSE);void CTestDialog:OnBnClickedBtnJian()/ TODO: 在此添加控件通知处理程序代码UpdateData();/m_num3=m_num1-num2;UpdateData(FALSE);void CTestDialog:OnBnClickedBtnCheng()/ TODO: 在此添加控件通知处理程序代码UpdateData();m_num3=m_num1*num2;UpdateData(FALSE);void CTestDialog:OnBnClickedBtnChu()/ TODO: 在此添加控件通知处理程序代码UpdateData();m_num3=m_num1/num2;UpdateData(FALSE);