(已读)第十四章 单文档界面的程序
- 格式:doc
- 大小:179.50 KB
- 文档页数:5
绪论单元测试1.以下对C语言程序的描述,正确的是()。
A:C语言程序从包含的第一个头文件开始执行B:C语言程序总是从main函数开始执行C:C语言程序从定义的第一个函数开始执行D:C语言程序首先执行main函数前的语句答案:B2.C语言属于()语言。
A:汇编语言B:机器语言C:面对对象语言D:高级语言答案:D3.以下对C语言程序工作过程的描述,错误的是()。
A:程序中的指令、数据均以二进制形式存储在存储器中B:程序编译链接为可执行文件后存储在磁盘中C:执行程序时通过解释器,逐行边解释为机器可理解的指令边执行这些指令D:程序执行时将按照程序指定的逻辑从存储器中获取指令,并逐条执行答案:C4.以下关于计算机语言的描述,错误的是()。
A:计算机可以不需要解析直接使用高级语言B:汇编语言中使用了助记符来帮助开发人员开发C:计算机可以直接使用机器语言D:计算机高级语言(如C语言)更具有可读性,开发效率进一步提升答案:A5.C语言的功能和用途有()。
A:编写嵌入式系统B:直接与硬件交互C:编写操作系统底层调度算法D:开发其他计算机高级语言答案:ABCD6.C语言程序中包含()。
A:main函数B:定义的变量C:助记符D:头文件答案:ABCD7.C语言程序中可以没有main函数,也可以执行。
()A:错B:对答案:A第一章测试1.以下不是算法的特征是()A:可行性B:确切性C:简洁性D:有穷性答案:C2.以下不是评价一个算法的指标()A:时间复杂度B:问题的规模C:空间复杂度D:健壮性答案:B3.以下哪种图形表示选择结构()A:B:C:D:答案:B4.变量n初始为1,以下代码中哪个n最终可以为10()A:while(n<10){n=n+1;}B:while(n<=10){n=n+1}C:while(int i=0; i<=10; i++){n=n i}D:while(int i=10; i>=0; i–){n=n i}答案:A5.实现x和y的值交换,能够实现此功能的是()A:int t; t=x; x=y; y=t;B:x=y; y=x;C:x=y;D:x=y; y=x; x=x;答案:A6.结构程序化设计不应该使用()A:自顶向下,逐步细化的方法B:模块化设计C:灵活、简洁的goto结构D:三种基本结构:顺序结构、选择结构、循环结构的编码方法答案:C7.程序的基本结构包括()A:选择结构B:逻辑结构C:顺序结构D:循环结构答案:ACD8.结构化程序设计方法包括()A:结构化编码B:逐步细化C:自顶向下D:模块化设计答案:ABCD9.算法有且只有一个输入和输出()A:错B:对答案:A10.描述算法可用自然语言、传统流程图、N-S流程图来描述()A:对B:错答案:A第二章测试1.下列定义变量的语句中正确的是:()A:int int123B:float US$C:double intD:char For答案:A2.C语言中最简单的数据类型包括:()A:整型、字符型、逻辑型B:整型、实型、逻辑型、字符型C:整型、实型、逻辑型D:整型、实型、字符型答案:D3.main(){int a=8,b=4;printf(“%d”, b=b/a);}上述程序的输出结果是()A:不确定值B:0C:1D:4答案:B4.a=125.534;a=(int)125.521%4;设a为int型变量,执行上述赋值语句后,a的取值分别是()A:125,21B:125,1C:125,31D:125.534,2答案:B5.int b=3; ++b;则b的值为()A:5B:2C:3D:4答案:D6.下列说法不正确的是()A:主函数main中定义的变量在整个文件或程序中有效B:形式参数是局部变量C:在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效D:不同函数中,可以使用相同名字的变量答案:A7.以下属于不合法赋值语句的是()A:x+y;B:x=y=200;C:–d;D:c=int(a+b);答案:AD8.以下选项是不合法常量的是()答案:AD9.¥temp是合法的变量名称()A:错B:对答案:A10.编译系统把浮点型常量都按双精度处理,分配16个字节()A:错B:对答案:A第三章测试1.main() {int a=1, b=2, c=3;if(a<c) {b=a;c=b;a=c;} else {a=0;}printf(“a=%d”, a);}上述程序的输出是()A:2B:0C:1D:3答案:C2.以下一组运算符中,优先级最低的运算符是()A:-B:>C:*D:!=答案:D3.#include<stdio.h>int main(){ int a=1,b=2,c=3,d=4,m=2,n=2; (m=a<b)||(n=c>d); printf(“%d:1 0B:0 1C:1 2D:2 2答案:C4.若int i=0,j=1,k=2 k= i++ && j++;则此时的k为多少()A:0B:2C:1D:3答案:A5.设a=1,b=2,c=3,d=4,则表达式:a>b?a:c<d?c:d的结果为()A:3B:1C:4D:2答案:A6.以下不能作为switch语句中的条件的是()A:1B:1+1C:‘A’D:3答案:B7.以下 if语句形式正确的有()A:if(表达式){若干语句;}else if{若干语句;}B:if(表达式){若干语句;}if {若干语句;}else{若干语句;}C:if(表达式){若干语句;}D:if(表达式){若干语句;}else{若干语句;}答案:CD8.以下对逻辑运算符两侧的运算对象的数据类型描述不正确的是()A:可以是整数或字符型数据B:只能是0或非0整数C:只能是0或者1D:可以是任何类型的整数答案:BC9.条件运算符?和:是一对运算符,不能分开单独使用。
单文档和多文档窗口使用方法解析一.实验目的掌握利用开发平台创建单文档和多文档窗口方法掌握在窗口中输出文字、图形的方法及 MFC 中相关类的使用二.实验要求1 创建一个单文档窗口,在文档类定义一个整型变量,其取值范围从 0 ~ 1000 循环,在视图的中间显示该数字,当用户点击窗口的不同区域时,变量值按不同的增量增加并显示。
提示:在修改数据后,使用 Invalidate() 函数引起 MFC 对 OnDraw() 的调用,这样就可以用修改后的数据进行画图了。
关于对文档类的访问,见本实验的技术支持。
2 创建一个单文档窗口,鼠标在窗口上单击后在鼠标的位置显示一正方形,点击 20 次后清窗口,新的点击将不再增加新的正方形,而是将已输入的正方形在原位置显示,当然,在每20 单击后要重新清窗口。
(要求用 MFC 的通用类保存单击的信息,如 CList 类)知识点:画线当单击鼠标左键时,就可以获得一个点,即线条的起点。
接着按住鼠标左键并拖动一段距离后松开鼠标,此时也可以获得一个点,即线条的终点。
也就是说,我们需要捕获两个消息,一个是鼠标左键按下消息(WM_LBUTTONDOWN),在该消息响应函数中可以获得将要绘制的线条的起点;另一个是鼠标左键弹起来的消息(WM_LBUTTONUP),在该消息响应函数中可以获得将要绘制的线条的终点。
有了这两个点就可以绘制出一条线。
利用SDK全局函数实现画线功能为了进行绘图操作,必须获得一个设备描述表(DC),因此,首先定义一个HDC类型的变量:hdc,接着调用全局函数GetDC获得当前窗口的设备描述表。
因为CWnd类有一个成员变量(m_hWnd),而CView类派生于CWnd类,因此该类也有这样的一个成员变用于保存窗口句柄,而GetDC函数可以直接把这个成员变量作为参数来使用。
利用MFC的CDC类实现画线功能该类提供一个数据成员m_hDC类用来保存与CDC相关的DC句柄。
其道理与CWnd 类提供成员变量m_hWnd保存与窗口相关的窗口句柄是一样的。
《一》MFC单文档应用程序显示图像摘要: 1 利用VS2010向导创建一个MFC单文档应用程序MFCTest 2 在MFCTestView.h中引用<atlimage.h>,并创建一个CImage对象 #include <atlimage.1 利用VS2010向导创建一个MFC单文档应用程序MFCTest2 在MFCTestView.h中引用<atlimage.h>,并创建一个CImage对象#include <atlimage.h>private:CImage image;3 打开资源文件,选中Menu下面的IDR_MAINFRAME,添加一个新的菜单项“打开图像”,修改其ID为IDM_OPEN,再点击鼠标右键,添加事件处理程序,在弹出的对话框的列表中选择CMFCTestView4 添加事件处理函数OnOpen的代码void CMFCTestView::OnOpen(){// TODO: 在此添加命令处理程序代码CFileDialog dlg(TRUE, _T(".bmp"), _T("*.bmp"), OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT, _T("位图文件(*.bmp)|*.bmp|JPEG文件(*.jpg)|*.jpg||"));if(dlg.DoModal() == IDOK){if(!image.IsNull()){image.Destroy();}image.Load(dlg.GetPathName());Invalidate();}}5 在MFCTestView中加入图像显示的代码void CMFCTest2View::OnDraw(CDC* pDC) {CMFCTest2Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码 if(!image.IsNull()){image.Draw(pDC->GetSafeHdc(), 0, 0);}}《二》MFC单文档应用程序显示图像1.工程建好后,右击文档类选择建立类向导,选择虚函数中的OnOpenDocument,编辑在文档类里面添加Mat img;和string path;同时需要添加头文件#include<opencv2/opencv.hpp>;BOOL CsplitDoc::OnOpenDocument(LPCTSTR lpszPathName){if (!CDocument::OnOpenDocument(lpszPathName))return FALSE;// TODO: Add your specialized creation code herepath = CT2A(lpszPathName);// TODO: Add your specialized creation code hereimg = cv::imread(path);if (img.empty()){MessageBox(NULL, lpszPathName, _T("did't load the pic"), MB_OK);}return TRUE;}方法一,进入视图类,编辑OnDraw函数同时要包含头文件#include<opencv2/opencv.hpp>void CsplitView::OnDraw(CDC* pDC){CsplitDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;cv::Mat newImage;if (pDoc->img.channels() == 1){cv::cvtColor(pDoc->img, newImage, CV_GRAY2BGRA);}else if (pDoc->img.channels() == 3){cv::cvtColor(pDoc->img, newImage, CV_BGR2BGRA);}else{newImage = pDoc->img;}// TODO: add draw code for native data hereif (!pDoc->img.empty()){CImage image;int cx, cy;CRect rect;std::wstring str;std::string path1 = pDoc->path;StringToWString(path1, str);image.Load((LPCTSTR)str.c_str());CImage image2 = image;//获取图片的宽高SetRect(rect, 0, 0, newImage.cols, newImage.rows);pDC = GetDC();//获取picture control的DCimage.Draw(pDC->m_hDC, rect);ReleaseDC(pDC);}}方法一中用到的StringToWString函数如下这个函数使用的时候要位置要放在OnDraw 函数的前面即可;BOOL StringToWString(const std::string &str,std::wstring &wstr){int nLen = (int)str.length();wstr.resize(nLen,L' ');int nResult =MultiByteToWideChar(CP_ACP,0,(LPCSTR)str.c_str(),nLen,(LPWSTR)wstr.c_str(),nLen);if (nResult == 0){return FALSE;}return TRUE;}方法二:1.打开视图类里面的OnDraw函数void CAgainTestView::OnDraw(CDC* pDC){CAgainTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码cv::Mat newImage;if (pDoc->img.channels() == 1){cv::cvtColor(pDoc->img, newImage, CV_GRAY2BGRA);}else if (pDoc->img.channels() == 3){cv::cvtColor(pDoc->img, newImage, CV_BGR2BGRA);}else{newImage = pDoc->img;}Gdiplus::Bitmap bitmap(newImage.cols, newImage.rows, newImage.step1(), PixelFormat32bppARGB, newImage.data);Gdiplus::Graphics graphics(pDC->GetSafeHdc());graphics.DrawImage(&bitmap, 0, 0);// TODO: add draw code for native data hereGdiplus::Bitmap bitmap1(newImage.cols, newImage.rows, newImage.step1(), PixelFormat32bppARGB, newImage.data);graphics.DrawImage(&bitmap1, newImage.cols, 0);CSize scroll_size;scroll_size.cx = newImage.cols * 2;scroll_size.cy = newImage.rows;SetScrollSizes(MM_TEXT, scroll_size);ReleaseDC(pDC);}然后进入APP头文件中添加#include<gdiplus.h>using namespace Gdiplus;class CAgainTestApp : public CWinAppEx{public:CAgainTestApp();GdiplusStartupInput gdiplusStartupInput;ULONG_PTR gdiplusToken;然后进入APP的.cpp中添加如下// The one and only window has been initialized, so show and update it m_pMainWnd->ShowWindow(SW_SHOW);m_pMainWnd->UpdateWindow();GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);return TRUE;}int CAgainTestApp::ExitInstance(){//TODO: handle additional resources you may have addedAfxOleTerm(FALSE);GdiplusShutdown(gdiplusToken);return CWinAppEx::ExitInstance();}《三》OpenCV的Mat与MFC的CImage 1.Mat 转化为Imagevoid 你的类名::MatToCImage(Mat& mat, CImage& cimage){if (0 == mat.total()){return;}int nChannels = mat.channels();if ((1 != nChannels) && (3 != nChannels)){return;}int nWidth = mat.cols;int nHeight = mat.rows;//重建cimagecimage.Destroy();cimage.Create(nWidth, nHeight, 8 * nChannels);//拷贝数据uchar* pucRow; //指向数据区的行指针uchar* pucImage = (uchar*)cimage.GetBits(); //指向数据区的指针int nStep = cimage.GetPitch(); //每行的字节数,注意这个返回值有正有负if (1 == nChannels) //对于单通道的图像需要初始化调色板{RGBQUAD* rgbquadColorTable;int nMaxColors = 256;rgbquadColorTable = new RGBQUAD[nMaxColors];cimage.GetColorTable(0, nMaxColors, rgbquadColorTable);for (int nColor = 0; nColor < nMaxColors; nColor++){rgbquadColorTable[nColor].rgbBlue = (uchar)nColor;rgbquadColorTable[nColor].rgbGreen = (uchar)nColor;rgbquadColorTable[nColor].rgbRed = (uchar)nColor;}cimage.SetColorTable(0, nMaxColors, rgbquadColorTable);delete []rgbquadColorTable;}for (int nRow = 0; nRow < nHeight; nRow++){pucRow = (mat.ptr<uchar>(nRow));for (int nCol = 0; nCol < nWidth; nCol++){if (1 == nChannels){*(pucImage + nRow * nStep + nCol) = pucRow[nCol];}else if (3 == nChannels){for (int nCha = 0 ; nCha < 3; nCha++){*(pucImage + nRow * nStep + nCol * 3 + nCha) = pucRow[nCol * 3 + nCha];}}}}}2.Image 转化为Matvoid 你的类名::CImageToMat(CImage& cimage, Mat& mat){if (true == cimage.IsNull()){return;}int nChannels = cimage.GetBPP() / 8;if ((1 != nChannels) && (3 != nChannels)){return;}int nWidth = cimage.GetWidth();int nHeight = cimage.GetHeight();//重建matif (1 == nChannels){mat.create(nHeight, nWidth, CV_8UC1);}else if(3 == nChannels){mat.create(nHeight, nWidth, CV_8UC3);}//拷贝数据uchar* pucRow; //指向数据区的行指针uchar* pucImage = (uchar*)cimage.GetBits(); //指向数据区的指针int nStep = cimage.GetPitch(); //每行的字节数,注意这个返回值有正有负for (int nRow = 0; nRow < nHeight; nRow++){pucRow = (mat.ptr<uchar>(nRow));for (int nCol = 0; nCol < nWidth; nCol++){if (1 == nChannels){pucRow[nCol] = *(pucImage + nRow * nStep + nCol);}else if (3 == nChannels){for (int nCha = 0 ; nCha < 3; nCha++){pucRow[nCol * 3 + nCha] = *(pucImage + nRow * nStep + nCol * 3 + nCha);}}}}}。
C++课后习题第一章1.选择题(1) 应用程序向导AppWizard的作用是,通过类向导可以增加消息映射和成员变量。
(2) 项目工作区窗格一般在集成开发环境的左侧,他展示一个项目的几个方面,他们分别是类视图、资源视图和文件视图。
(3)用户可以通过项目工作区窗格的资源视图来查看资源。
(4)项目工作区文件的扩展名为.dsw(5)菜单选择可以通过两种方法来进行:一种是鼠标选择;另一种是键盘选择(6)编译程序的快捷键是Ctrl+F7 ,链接程序的快捷键是F7 ,运行程序的快捷键是Ctrl+F5(7)编译微型条工具栏最右边按钮的功能是Insert/Remove Breakpoint(8)快捷键或菜单及相关资料符号的前缀是IDR2.选择题(1)用应用程序向导AppWizard创建C++源文件,应选择(A )选项卡。
A.FilesB.ProjectsC.WorkspacesD.Other Documents(2)项目文件的扩展名( B )。
A. .exeB. .dspC. .dswD. .cpp(3)Standard 工具栏中最左边按钮与(C )菜单命令的功能一样。
A.NewB.New FileC.New Text FileD.New Workspace(4)Windows资源提供的资料编辑器不能编辑(C )。
A.菜单B.工作栏C.状态栏D.位图3.判断题(1)通过应用程序向导AppWizard建立的程序不能被立即执行。
(×)(2)打开一个项目,只需打开对应的项目工作区文件。
(√)(3)用户可以通过选择T ools | Customize菜单命令设置集成开发环境的工具栏。
(√)(4)在同一项目中,Visual C++在内部用来标识资源的资源符号不能重复。
(√)(5)在Windows环境下,资源与程序源代码紧密相关。
(×)4.简答题(1)什么是项目?它是由什么组成的?(2)解释项目工作区中各个视图的功能。
类型一:页面设置1、在考生文件夹Paper子文件下,建立文档“比赛信息.docx”,由三页组成。
要求:(1)第一页中第一行内容为“足球”,样式为“标题1”;页面垂直对齐方式为“居中”;页面方向为纵向、纸张大小为16开;页眉内容设置为“football”,居中显示;页脚内容设置为“成绩不行”,居中显示。
(2)第二页中第一行内容为“篮球”,样式为“标题2”;页面垂直对齐方式为“顶端对齐”;页面方向为横向、纸张大小为A4;页眉内容设置为“basketball”,居中显示;页脚内容设置为“成绩还行”,居中显示;对该页面添加行号,起始编号为“1”。
(3)第三页中第一行内容为“乒乓球”,样式为“正文”;页面垂直对齐方式为“底端对齐”;页面方向为纵向、纸张大小为B5;页眉内容设置为“table tennis”,居中显示;页脚内容设置为“成绩很好”,居中显示。
操作难点简要说明:1、先插入2个分隔符中分节符中下一页,再分别设置各页面,设置第2、3页页眉页脚时,注意单击链接到前一条页眉,取消链接到上一节。
2、行号添加。
页面布局---页面设置,展开页面设置版式后,版式----行号—把添加行号打上勾----确定。
3、。
2、在考生文件夹Paper子文件下,建立文档“考试信息.docx”,由三页组成。
其中:(1)第一页中第一行内容为“语文”,样式为“标题1”;页面垂直对齐方式为“居中”;页面方向为纵向、纸张大小为16开;页眉内容设置为“90”,居中显示;页脚内容设置为“优秀”,居中显示。
(2)第二页中第一行内容为“数学”,样式为“标题2”;页面垂直对齐方式为“顶端对齐”;页面方向为横向、纸张大小为A4;页眉内容设置为“65”,居中显示;页脚内容设置为“及格”,居中显示;对该页面添加行号,起始编号为“1”。
(3)第三页中第一行内容为“英语”,样式为“正文”;页面垂直对齐方式为“底端对齐”;页面方向为纵向、纸张大小为B5;页眉内容设置为“58”,居中显示;页脚内容设置为“不及格”,居中显示。
Web前端开发技术知到章节测试答案智慧树2023年最新成都文理学院第一章测试1.浏览器针对于HTML文档起到了什么作用()。
参考答案:浏览器用于展示HTML文档2.HTML指的是()。
参考答案:超文本标记语言(Hyper Text Markup Language)3.Web 标准的制定者是()。
参考答案:万维网联盟(W3C)4.网站首页默认的文件名一般有()。
参考答案:index.asp;default.ht;index.html;index.htm5.WWW是什么意思()。
参考答案:万维网第二章测试1.哪个标记用于表示HTML文档的开始和结束()。
参考答案:HTML2.以下标记符中,没有对应的结束标记的是()。
参考答案:br3.下面有关html描述正确的是()。
参考答案:HTML就是超文本标记语言的简写,是最基础的网页语言4.使用HTML编写网页代码的基本格式是()。
参考答案:<html><head></head><body></body></html>5.下列关于HTML语言的描述不正确的是()。
参考答案:不懂HTML语言的人无法制作网站第三章测试1.空格对应的html实体是哪个()。
参考答案:& nbsp ;2.下面哪一项是换行符标签()。
参考答案:br3.创建最小的标题的文本标签是()。
参考答案:<h6></h6>4.下面可以显示粗体的标签是()。
参考答案:<b>ITCAST</b>;ITCAST5.在 HTML中,标记<pre>的作用是()。
参考答案:预排版标记第四章测试1.定义有序列表<ol>的()属性,可以决定有序列表项目符号的类型。
()。
参考答案:type2.关于有序列表的描述,下列说法正确的是()。
参考答案:有序列表按顺序排列并通过type属性定义序号样式3.下列选项中,属于定义列表标记的是()。
word教学课件ppt完整版目录•Word基础操作与界面介绍•文档创建、打开与保存•文本输入、编辑与格式化•插入对象及编辑处理•表格制作与数据处理•高级功能应用及技巧分享•总结回顾与课程延伸PART01Word基础操作与界面介绍启动与退出Word启动Word通过开始菜单或桌面快捷方式启动Word应用程序。
退出Word点击Word窗口右上角的关闭按钮,或选择“文件”菜单中的“退出”选项。
界面组成及功能显示当前文档的名称和Word应用程序的图标。
包含多个选项卡,每个选项卡下有一组相关的命令按钮,用于执行各种操作。
用于输入、编辑和排版文档内容的区域。
显示当前文档的状态信息,如页数、字数、视图方式等。
标题栏功能区文档编辑区状态栏可以通过“文件”菜单中的“选项”来自定义功能区的选项卡和命令按钮。
自定义功能区自定义快捷键快速访问工具栏在Word 中,可以通过“文件”菜单中的“选项”来自定义快捷键,提高操作效率。
将一些常用的命令按钮添加到快速访问工具栏中,方便快速执行这些命令。
030201自定义界面与快捷键PART02文档创建、打开与保存点击Windows 开始按钮,在搜索栏输入“Word”并选择打开,然后点击“新建”按钮创建新文档。
通过开始菜单创建同时按下Ctrl+N 组合键,可以快速创建一个新的Word 文档。
使用快捷键创建Word 提供了丰富的模板供用户选择,用户可以根据需求选择合适的模板创建文档。
从模板创建新建文档方法打开现有文档技巧通过文件菜单打开在Word中点击“文件”菜单,选择“打开”选项,浏览到文档所在位置并打开。
使用快捷键打开同时按下Ctrl+O组合键,可以快速打开现有文档。
从最近使用过的文档打开Word会自动记录用户最近使用过的文档,用户可以从文件菜单中的“最近使用过的文档”列表中选择并打开。
保存文档格式和位置选择保存文档格式Word支持多种格式保存,如.docx、.doc、.pdf等。
用户可以根据需求选择合适的格式进行保存。
Opencascade建立OCAF单文档图1为MFC单文档应用程序界面;图2为OCAF单文档应用程序界面。
图1图2基于MFC单文档建立OCAF单文档的步骤:1、创建一个MFC单文档应用程序。
在项目的头文件(或包含文件)和库文件路径里添加Open cascade 的所有头文件和库文件路径(具体操作参见<<Opencascade 6.60调试总结>>文档);将需要使用的头文件添加到stdafx.h里;打开工程属性,在链接器选项卡中的输入项的附加依赖项中添加OpenCascade 库文件;2、APP类中OpenCascade图形设备环境变量添加和设置。
在SWFZ.h头文件里添加:#include<Standard_Macro.hxx>#include<Graphic3d_GraphicDriver.hxx>CSWFZApp类中添加成员和用法:protected:Handle_Graphic3d_GraphicDriver myGraphicDriver;Handle_Graphic3d_GraphicDriver GetGraphicDriver() const{return myGraphicDriver;}CSWFZApp类的构造函数添加:try{Handle(Aspect_DisplayConnection) aDisplayConnection;myGraphicDriver = Graphic3d::InitGraphicDriver (aDisplayConnection);}catch (Standard_Failure){ExitProcess(1);}注意:需要注释//#ifdef _DEBUG//#define new DEBUG_NEW//#endif原因是因为OpenCascade对New操作符进行了重载,与VS中的定义存在冲突。
第十四章单文档界面的程序用VC++的AppWizard生成的程序有三种样式的界面,它们是单文档、多文档和对话框界面。
前面各章我们都生成对话框样式的界面,这可以方便我们学习各种常用控件的设计,本章要学习如何生成一个单文档界面的应用程序,以及文档类和视图类的概念和相互关系。
本章要点1 用AppWizard生成单文档界面的操作方法2 文档类和视图类的概念3 如何保持文档和视图的同步关联。
14.1 生成单文档界面的文本编辑器用AppWizard生成单文档界面的操作方法和生成对话框界面的操作方法稍有不同,我们通过建立一个“文本编辑器”应用程序MyNote.exe来演示,具体过程如下:1 打开应用程序向导,在d:\myVC\CH14创建应用程序MyNote。
2 在Step1中选择“单文档”和“文档/视图支持”,如图chap14-01.图chap14-013 在step2和step3对话框中都用默认的。
在step4中如图chap14-02选择前五项,当然也可以按你的需要选择。
图chap14-024 在Step5中选择MFC标准、加备注和静态连接库。
图chap14-03图chap14-035 在step6中选择视图的基类(base class),因为我们需要的是文本编辑器,所以要选类CEditView作为基类。
点击[完成]按纽,应用程序的框架就创建好了。
14.2 文档类和视图类的概念向导工作完成以后马上编译和连接,运行后就可以看到一个已经能够使用的文本编辑器,它不仅可以输入文字,还可以保存或打开文件,与Windows的记事本差不多了,只是没有设置字体的功能。
图chap14-04是它运行时的窗口。
chap14-04菜单和工具栏的响应函数都已经生成了相应的代码,我们没有做任何编写工作就得到了一个“完整”的应用程序,甚至还创建了一个帮助文件呢。
这就是VC++开发环境的巨大威力!我们从上图中可以看到,编辑菜单中的复制和剪切都已经有效了。
第十四章单文档界面的程序
用VC++的AppWizard生成的程序有三种样式的界面,它们是单文档、多文档和对话框界面。
前面各章我们都生成对话框样式的界面,这可以方便我们学习各种常用控件的设计,本章要学习如何生成一个单文档界面的应用程序,以及文档类和视图类的概念和相互关系。
本章要点
1 用AppWizard生成单文档界面的操作方法
2 文档类和视图类的概念
3 如何保持文档和视图的同步关联。
14.1 生成单文档界面的文本编辑器
用AppWizard生成单文档界面的操作方法和生成对话框界面的操作方法稍有不同,我们通过建立一个“文本编辑器”应用程序MyNote.exe来演示,具体过程如下:
1 打开应用程序向导,在d:\myVC\CH14创建应用程序MyNote。
2 在Step1中选择“单文档”和“文档/视图支持”,如图chap14-01.
图chap14-01
3 在step2和step3对话框中都用默认的。
在step4中如图chap14-02选择前五项,当然也可以按你的需要选择。
图chap14-02
4 在Step5中选择MFC标准、加备注和静态连接库。
图chap14-03
图chap14-03
5 在step6中选择视图的基类(base class),因为我们需要的是文本编辑器,所以要选类CEditView作为基类。
点击[完成]按纽,应用程序的框架就创建好了。
14.2 文档类和视图类的概念
向导工作完成以后马上编译和连接,运行后就可以看到一个已经能够使用的文本编辑器,它不仅可以输入文字,还可以保存或打开文件,与Windows的记事本差不多了,只是没有设置字体的功能。
图chap14-04是它运行时的窗口。
chap14-04
菜单和工具栏的响应函数都已经生成了相应的代码,我们没有做任何编写工作就得到了一个“完整”的应用程序,甚至还创建了一个帮助文件呢。
这就是VC++开发环境的巨大威力!我们从上图中可以看到,编辑菜单中的复制和剪切都已经有效了。
图中的窗口是主框架,对应于类CMainFrame,而其中的“编辑区域”叫用户区,对应于视图类CMyNoteView,而被编辑的文本对应于一个文档类CMyNoteDoc。
另外,每个程序还有一个对应于应用程序本身的类,本例中是CMyNoteApp。
这四个类就是向导自动生成的应用程序框架类,打开工作区的类classView页区,就可以看到,如图chap14-05。
展开视图类,可以找到一个函数GetDocument(),它是使视图(的内容)和文档保持同步关联的纽带。
它返回一个CMyNoteDoc类型的对象指针m_pDocument。
使用它在视图中访问文档的内容。
在文档类中有一个OnNewDocument()函数,在“新建文件”和程序第一次运行时被调用,它打开一个新文档供用户编辑。
我们来看一下它的代码:
BOOL CMyNoteDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
((CEditView*)m_viewList.GetHead())->SetWindowText(NULL);
return TRUE;
}
if语句调用其父类的同名函数,第二个语句设置编辑区的文本为空白。
你试着用“这是一个新文档”来代替NULL,重新编译和运行,那每次打开时编辑区会出现这句话。
文档类中还有一个叫Serialize,把它系列化对象CArchive& ar设置为按行系列化,这是纯文本文件存取时所需要的。
下面是它的代码。
void CMyNoteDoc::Serialize(CArchive& ar)
{
// CEditView contains an edit control which handles all serialization
((CEditView*)m_viewList.GetHead())->SerializeRaw(ar);
}
在下一节中,我们将通过一个例程来演示,如何在文档对象和视图对象之间互相访问和交换数据。
14.3 Circle程序的界面和功能
Circle程序的功能是:用鼠标左键在用户区域任意的点一下,就以这一点为圆心画一个半径为50的圆。
程序的界面和上例一样,都是单文档程序的基本形式么。
但是其客户区年输入文字,是画图形式的。
图chap14-06
下面我们就来制作这一程序。
1 创建工程
打开应用程序向导,在d:\myVC\CH14创建应用程序Circle。
选择“单文档”,后面的应答与上例一样。
不同的是最后一步视图基类的选择,不是选CEditView而是选CView。
CEditView 类是CView类的子类,适合于需要文字编辑的场合。
2 添加变量
画圆需要与圆心和半径,为了文档和视图的同步,我们需要给两者都引进三个变量m_PosX、m_PosY和m_Reduse。
定义要写在他们的构造函数中:
public:
int m_PosX, m_PosY;
int m_Reduse ;
3 编写代码
(1)函数OnDraw(CDC* pDC)的功能是在客户区画图,我们用它以试图中的变量值来画圆,代码如下:
void CCircleView::OnDraw(CDC* pDC)
{
CCircleDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//Draw a circle
RECT rect;
rect.left= m_PosX - m_Reduse ;
rect.top = m_PosY - m_Reduse ;
rect.right = m_PosX + m_Reduse ;
rect.bottom= m_PosY + m_Reduse ;
pDC->Ellipse(&rect);
}
其中pDC是由参数表传递过来的屏幕设备对象,可以画图。
RECT是表示举行的数据结构。
是画图圆需要的参数。
(2)变量m_PosX等的值在初始更新函数OnInitialUpdate()中给定,而值是从文档的同名函数中传递过来的。
???
CCircleDoc* pDoc = GetDocument();
m_PosX = pDoc->m_PosX ;
m_PosY = pDoc->m_PosY ;
m_Reduse = pDoc->m_Reduse ;
(3)要求当“按下鼠标时画圆”,就要添加OnLButtonDown函数,其中使用Invalidate(),它会调用函数OnDraw重新画客户区,其代码如下:
void CCircleView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
m_PosX = point.x ;
m_PosY = point.y ;
Invalidate();
CCircleDoc* pDoc = GetDocument();
pDoc->m_PosX = m_PosX;
pDoc->m_PosY = m_PosY;
pDoc->SetModifiedFlag(TRUE);
CView::OnLButtonDown(nFlags, point);
}
变量point对应的是鼠标当前点的位置,传递给视图的变量,然后画圆;再把它传递给文档,这就保证视图和文档数据的一致性。
语句
pDoc->SetModifiedFlag(TRUE);
设置文档已经被修改的标志,这使得程序在退出时会询问“是否要保存?”。
(4)在文档类中有一个函数OnNewDocument(),它是在按“文件/新建”时被调用的。
我们用它给出圆的初始值:
m_PosX = 100;
m_PosY = 100;
m_Reduse = 50 ;
需要的代码就这些了,现在可以编译和运行之。
思考和练习
1 文档类应用程序是如何保持视图和文档数据的一致性的?
2 在MyNote程序中添加菜单及其代码,扩展它的功能。
例如,增加文字的大小和颜色等。
3 在Circle程序中添加菜单及其代码,扩展它的功能。
例如,可变的半径,画不同的图形等。