【精品IT教程】Windows系统开发教程最完整版.ppt_第1页
【精品IT教程】Windows系统开发教程最完整版.ppt_第2页
【精品IT教程】Windows系统开发教程最完整版.ppt_第3页
【精品IT教程】Windows系统开发教程最完整版.ppt_第4页
【精品IT教程】Windows系统开发教程最完整版.ppt_第5页
已阅读5页,还剩421页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Windows系统开发,主讲教师:郭迎春,guoyc,计算机与信息工程学院,驱动程序开发DDK、WDK、DriverStudio、Windriver应用软件开发,C/C:主流的开发工具为VisualC+,它以c语言为基础。特点:代码执行效率高,Windows应用软件开发语言,Java:适合开发基于Web的应用程序,Windows操作系统核心代码采用,Windows运行机制,驱动,输出,输入,注:应用程序开发者通常不需要知道操作系统与硬件设备之间交互的具体细节,我们要关心的是应用程序与操作系统之间的交互关系,Windows运行机制,函数,消息,注:操作系统所能够完成的每一个功能都有一个函数与其对应,也就是说,操作系统把它能够完成的功能以函数的形式提供给应用程序使用,这些函数的集合就是Windows操作系统提供给应用程序的编程接口(ApplicationProgrammingInterface),简称WindowsAPI。例如:CreateWindow():创建一个窗口应用程序操作系统,调用函数,实现创建窗口的功能,消息:报告有关事件发生的通知,是一种数据结构例如:鼠标单击窗口鼠标单击事件发生windows操作系统获取到这一事件,并将事件以消息的形式传递给应用程序应用程序获取消息,并调用响应函数处理消息Windows程序设计的核心就是消息的传递和处理,帮助文档:msdn资料:孙鑫vc+视频教学VC技术内幕(可做参考),VisualC+开发环境,1,MFC应用程序框架,2,基本事件处理,3,映射模式和滚动视图,4,MFC资源,5,ActiveX控件,6,动态链接库(DLL),7,多线程编程,8,文档与视图,9,数据库编程,10,VisualC+的编程方式,1,SDK:SoftwareDevelopmentKit,传统编程法,采用windowsAPI函数进行编程。,2,MFC:MicrosoftFoundationClass,交互式的编程法,对API函数进行了封装,包含许多类。,1、VisualC+开发环境,FileNew,FileNew,2、MFC应用程序框架,FileNewProjectsMFCAppWizard(exe),使用MFC应用程序生成向导创建HelloWorld程序,文档/视图结构体系支持:即是否支持文档/视图结构,否:不支持标题文件:不支持,但预留接口查看数据库不使用文件支持:支持查看数据库使用文件支持:支持,注:复合文档是OLE(ObjectLinkingandEmbedding)的一项技术,没有,不需要容器:例如,在Word中运行Excel程序,Word相对与Excel就是容器微型服务器:例如,在Excel中的一些资源,其它程序可以调用,Excel就是服务器完整服务器容器和服务器,自动:例如在Word和Excel中都支持VB,可以在Word和Excel中用VB(确切的说叫VBA)编程,而VC则不支持,要使VC支持,则要选中自动ActiveX:第三方控件,与开发平台无关,选中相关项后,在左端会有图例显示,风格源代码备注:例提示客户代码的书写位置作为共享的DLL:运行时才添加mfc库缺点:在没有安装VC的机器上不能运行解决办法:将vc下相关的DLL文件拷贝到Windows文件夹中作为静态的DLL:编译时所有用到的库都被链接。缺点:程序较大,ChelloView:视类,可选择基类,用来显示文档数据并和用户交互如果在第五步中选择MFC风格,则基类为CView类,若选择资源管理器风格,则为CListView类例如,设计字处理软件,则要选择CEditView类ChelloDoc:文档类,用于管理文档数据CMainFrame:框架类,用来产生应用程序的主框架窗口ChelloApp:应用程序类,用来管理应用程序实例,放入口函数,在vc中将数据显示和数据本身分开文档:数据,CDocument作用:数据存储,加载等视图:显示,CView作用:数据显示,修改等,VC+的项目工作区窗口,运行,运行VC工程文件夹下的文件Debug:exe文件所在的位置Res:资源文件夹hello.cpp和hello.h:包含CExamApp类helloView.cpp和helloView.hhelloDoc.cpp和helloDoc.hMainFrame.cpp和MainFrame.hStdAfx.h:标准的全局函数定义,关键代码说明,Helloview.h:CHelloView类的定义,Private,Protected,Public,定义变量定义函数,GetDocument(),#include“helloView.h”构造函数:变量初始化析构函数PreCreateWindow():在窗口创建之前要做的工作,Helloview.cpp,OnDraw(CDC*pDC)CExamDoc*pDoc=GetDocument();获取文档的地址放在pDoc中,要使用文档中的数据则可以使用pDoc例如,文档中的x,则使用pDocx获取值ASSERT_VALID(pDoc);宏定义,确保上条语句的结果有效CDC,DC:DeviceContext,即设备上下文或设备描述表或设备环境引入原因:Windows不容许用户直接操作硬件,所以定义了一个抽象层DC,所有与绘图或显示相关操作封装在CDC类中,要访问显示设备就必须使用CDC类中提供的函数,应用程序,DC,硬件设备,例如:显示器、打印机等显示设备,GDI(图形设备接口,进行绘图工作),DeviceContext,绘图工具,CDC*pDCCDC:封装了所有的绘制和打印函数pDC为指向CDC类的指针,可以使用pDC访问CDC类中的函数(pDC-)OnDraw函数被调用的情况:程序运行后自动调用窗口重绘之后,例如窗口的大小被改变、窗口被覆盖,HelloWorld程序,voidCHelloView:OnDraw(CDC*pDC)CHelloDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:adddrawcodefornativedataherepDC-TextOut(0,0,helloworld);,起始点坐标,常用绘图函数,画点:SetPixel(intx1,inty1,COLORREFcrColor);绘制线:MoveTo(intx1,inty1);LineTo(intx2,inty2);绘制矩形:Rectangle(intx1,inty1,intx2,inty2);绘制椭圆:Ellipse(intx1,inty1,intx2,inty2);例:pDC-Ellipse(0,200,100,120);,常用绘图工具,画笔:负责绘制直线和曲线的工具画刷:负责填充图形的工具,绘图的一般过程:创建或取得设备环境(DC)创建绘图工具(画笔、画刷等)(否则采用默认的绘图工具)将绘图工具选入设备环境绘制图形释放获得的设备环境,创建和载入绘图工具,库存对象(StockObject)(基本工具)画笔BLACK_PENBlackpen(默认)NULL_PENNullpenWHITE_PENWhitepen画刷BLACK_BRUSHBlackbrushDKGRAY_BRUSHDarkgraybrushGRAY_BRUSHGraybrushHOLLOW_BRUSHHollowbrushLTGRAY_BRUSHLightgraybrushNULL_BRUSHNullbrushWHITE_BRUSHWhitebrush,载入库存对象SelectStockObject(intnIndex);例如:pDC-SelectStockObject(WHITE_PEN);例如:pDC-SelectStockObject(GRAY_BRUSH);,自定义对象自定义画笔自定义画刷,自定义画笔,CPen(intnPenStyle,intnWidth,COLORREFcrColor);常用的画笔样式:PS_SOLIDPS_DASHPS_DOTPS_DASHDOT颜色:RGB(nRed,nGreen,nBlue),红色值,蓝色值,绿色值,RGB(255,0,0),RGB(0,255,0),RGB(0,0,255),例:CPenpen(PS_DOT,1,RGB(255,0,0);,自定义画刷,CBrush(intnIndex,COLORREFcrColor);画刷的样式(nIndex):HS_BDIAGONALDownwardhatchat45degreesHS_CROSSHorizontalandverticalcrosshatchHS_DIAGCROSSCrosshatchat45degreesHS_FDIAGONALUpwardhatchat45degreesHS_HORIZONTALHorizontalhatchHS_VERTICALVerticalhatch例如:CBrushbrush(HS_CROSS,RGB(0,0,255);,可省,默认为实心,载入自定义对象SelectObject(CPen*pPen);例如:CPenpen(PS_DOT,1,RGB(255,0,0);pDC-SelectObject(,非1时会出现什么情况?,练习,输出如下图形:,voidCHelloView:OnDraw(CDC*pDC)pDC-TextOut(200,50,基本图形);CPenpen1(PS_DOT,1,RGB(255,0,0);pDC-SelectObject(pen1);pDC-MoveTo(30,100);pDC-LineTo(200,100);CPenpen2(PS_DOT,3,RGB(255,0,0);pDC-SelectObject(pen2);pDC-Rectangle(300,100,400,200);pDC-SelectStockObject(GRAY_BRUSH);pDC-Ellipse(300,100,400,200);CBrushbrush(HS_CROSS,RGB(0,0,255);pDC-SelectObject(,文本,设置文本的颜色SetTextColor(COLORREFnColor);设置文本背景的颜色SetBkColor(COLORREFnColor);例如:pDC-SetTextColor(RGB(0,255,0);pDC-SetBkColor(RGB(255,255,0);pDC-TextOut(10,10,helloworld);,3、基本事件处理,鼠标事件:单击双击移动添加消息响应函数:(1)ViewClassWizard(2)类上点右键添加windows消息,常用鼠标消息:,例1、按下鼠标左键时绘制灰色椭圆添加左键按下的消息响应函数ViewClassWizardWM_LBUTTONDOWN,方法一:voidCHelloView:OnLButtonDown(UINTnFlags,CPointpoint)CDC*pDC=GetDC();pDC-SelectStockObject(GRAY_BRUSH);pDC-Ellipse(100,100,300,200);ReleaseDC(pDC);,方法二:CClientDCdc(this);dc.SelectStockObject(GRAY_BRUSH);dc.Ellipse(100,100,300,200);,CClientDC:派生于CDC类,在其构造函数中调用了GetDC()函数,因此在代码中不需显式的调用,常用的方法。,在调用函数时使用.和-的区别,例2、单击椭圆使其在灰色与白色之间变化,voidCHelloView:OnLButtonDown(UINTnFlags,CPointpoint)CClientDCdc(this);dc.SelectStockObject(GRAY_BRUSH);dc.Ellipse(100,100,300,200);,分析:如果当前的画刷为GRAY_BRUSH,则单击之后使其变为WHITE_BRUSH,反之。解决办法:定义变量m_ncolor设置颜色值,程序改进:1、在helloView.h文件中定义变量private:intm_ncolor;2、在helloView.cpp文件构造函数中初始化变量m_ncolor=GRAY_BRUSH;,程序改进:3、在OnLButtonDown函数中添加代码判断:if(m_ncolor=GRAY_BRUSH)m_ncolor=WHITE_BRUSH;elsem_ncolor=GRAY_BRUSH;绘制椭圆CClientDCdc(this);dc.SelectStockObject(m_ncolor);dc.Ellipse(100,100,300,200);,当点击最大化按钮时为什么椭圆消失?,OnDraw函数被调用的情况:程序运行后自动调用窗口重绘之后,例如大小被改变、窗口被覆盖,解决办法:在OnDraw函数中使用当前画刷重绘椭圆代码:pDC-SelectStockObject(m_ncolor);pDC-Ellipse(100,100,300,200);,Invalidate();,CClientDCdc(this);dc.SelectStockObject(m_ncolor);dc.Ellipse(100,100,300,200);,注:为了增加程序的可读性,以及便于维护或修改,可以将用到的参数值用变量代替,1、定义CRectrectellipse;2、初始化rectellipse=CRect(100,100,300,200);3、绘制pDC-Ellipse(rectellipse);,OnLButtonDown(UINTnFlags,CPointpoint)参数nFlags:鼠标状态,通常与如下参数配合使用,point:鼠标按下点的位置坐标,包含两个参数point.xpoint.y,例3:只在椭圆内部点击时变色,其它位置不变色,CRect:PtInRect(POINTpoint)应用:if(rectellipse.PtInRect(point).,练习1,使用透明画刷手动绘制矩形,booldraw;CPointm_left;CHelloView:CHelloView()draw=FALSE;m_left=0;,voidCHelloView:OnLButtonDown(UINTnFlags,CPointpoint)draw=TRUE;m_left=point;,voidCHelloView:OnLButtonUp(UINTnFlags,CPointpoint)if(draw=TRUE)CClientDCdc(this);dc.SelectStockObject(HOLLOW_BRUSH);dc.Rectangle(m_left.x,m_left.y,point.x,point.y);draw=FALSE;,练习2,在窗口上按下鼠标左键拖动时输出如下图形,分析:问题涉及到三种消息处理:左键按下:确定原点,开始绘制鼠标移动:绘制图形左键松开:停止绘图,booldraw;CPointm_old,m_origin;CHelloView:CHelloView()draw=FALSE;m_old=0;m_origin=0;,voidCHelloView:OnLButtonDown(UINTnFlags,CPointpoint)draw=TRUE;m_old=point;m_origin=point;,voidCHelloView:OnMouseMove(UINTnFlags,CPointpoint)CClientDCdc(this);if(draw=TRUE)dc.MoveTo(m_origin);dc.LineTo(m_old);dc.MoveTo(m_old);dc.LineTo(point);m_old=point;,voidCHelloView:OnLButtonUp(UINTnFlags,CPointpoint)draw=FALSE;,键盘事件WM_KEYDOWNWM_KEYUPWM_CHAR,击键与消息的关系,区别:WM_KEYDOWN:可以识别键盘上的大多数按键,但不能区分大小写字母,以及数字和特殊符号,只能大写字母和数字WM_CHAR:只能识别键盘上的字符键和部分控制键,但可以区分大小写字母和shift+数字键,例:输出可移动的字符1、新建单文档程序MoveChar2、定义变量:CStringm_string;/存放用户输入的字符inty;intx;,3、在构造函数中对变量进行初始化x=50;y=50;m_string=;4、在ClassWizard中添加WM_CHAR和WM_KEYDOWN消息映射,5、在OnChar函数中添加代码:m_string+=nChar;Invalidate();6、在OnDraw函数中添加代码:pDC-TextOut(x,y,m_string);,7、在OnKeyDown函数中添加代码:switch(nChar)caseVK_LEFT:x-;break;caseVK_RIGHT:x+;break;caseVK_UP:y-;break;caseVK_DOWN:y+;Invalidate();,常用的虚拟键代码,定时器消息WM_TIMER,Windows定时器是一种周期性的消息产生装置,它会每隔一段指定时间发送一次定时消息WM_TIMER。它是一个很重要的系统消息,当系统所设置的时间到达以后,系统就会自动发送该消息。与该消息联系密切的一个函数是SetTimer(),它设置一个系统时钟,当设置的时间到时,系统产生WM_TIMER消息。通过对SetTimer()函数的参数进行设置,告诉用户哪一个时钟的时间到了,因此,可以将一些周期性的工作放入WM_TIMER的消息处理函数,定时器的使用一般遵循下列步骤:1.使用SetTimer()函数设置定时器2.超载OnTimer()函数,完成用户希望的操作3.撤消定时器KillTimer().,例:利用定时器消息实现一个滚动的字幕,即程序运行后,在屏幕的中央显示一行文本“我爱VC+编程”,该字幕从屏幕循环地从屏幕的左边滚动到右边,当字母超出屏幕右边界时,字母又从屏幕的左边出现。,在windows中,图形的显示:默认情况下,窗口原点和视口原点都在左上角(0,0)位置默认情况下,窗口和视口完全一致,单位为像素,4、映射模式和滚动视图,图形绘制函数,窗口,视口,改变窗口和视口原点函数:SetWindowOrg(intx,inty)SetViewportOrg(intx,inty)无论窗口原点和视口原点怎么变化,窗口原点总是映射到视口原点上注:绘制函数中的坐标点为窗口中的坐标,例如:观察运行结果pDC-Rectangle(CRect(100,100,300,300);添加代码:pDC-SetWindowOrg(CPoint(100,100);pDC-Rectangle(CRect(100,100,300,300);添加代码:pDC-SetViewportOrg(100,100);pDC-SelectStockObject(GRAY_BRUSH);pDC-Rectangle(CRect(100,100,300,300);,坐标系:绘图时需要一个参照坐标系,以确定图形或文本的输出位置例如:pDC-(100,100,”helloworld!”)图形设备接口支持两种坐标系统:逻辑坐标窗口设备坐标视口,注:通常,文本或图形输出函数使用的是逻辑坐标,而在客户区点击或移动鼠标所得到的是设备坐标,引例:pDC-Rectangle(0,0,200,200)函数绘制了200200矩形,默认单位为像素,当显示到屏幕上时,根据显示器的分辨率设置不同,其大小也是不同的,问题:如果要显示2cm*2cm的举行,而与显示器的分辨率无关,则需要用到映射模式。,映射模式:简单的说就是定义逻辑坐标的逻辑单位大小和增长方向,注:窗口的单位有多种:像素、英寸、毫米视口只有一种:像素改变映射模式的函数:SetMapMode(),例如:pDC-SetMapMode(MM_HIMETRIC);/设定映射模式为MM_HIMETRICpDC-Rectangle(CRect(0,0,2000,-2000);/画一个宽和高为2厘米的方块,在上述代码中添加如下语句,运行,查看显示结果:pDC-SetViewportOrg(CPoint(100,100);,缩放可变的映射模式:MMISOTROPIC纵横比始终是1:1,即:当缩放因子改变时,一个圆始终是一个圆。MMANISOTROPIC:缩放因子可以分别改变,较常用注:原点位于窗口左上角,,缩放因子:x的缩放因子视口的x大小/窗口的x大小y的缩放因子视口的y大小/窗口的y大小,例、画一个撑满窗口的椭圆CRectrectClient;GetClientRect(rectClient);pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowExt(CSize(1000,1000);pDC-SetViewportExt(rectClient.right,-rectClient.bottom);pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2);pDC-Ellipse(-500,-500,500,500);,GetClientRect:获取客户区域的矩形尺寸(即窗口中的白色部分)SetWindowExt:设置窗口的范围,将第二个参数取负后可得到正向朝上的y轴SetViewportExt:设置视口的范围,此例中将其设置为和客户区域大小相同SetViewportOrg:设置视口原点,此例中设置为客户区的中心点为视口的原点,运行当窗口的大小改变时,椭圆的大小也随之改变,并始终撑满整个窗口,将上述代码中:pDC-SetWindowExt(CSize(1000,1000);修改为:pDC-SetWindowExt(CSize(800,800);由上例得到的启发:假如制作一个人走近城门的动画,越走近城门越大,只需将窗口的尺寸逐渐变小即可,而不需要设置一系列城门逐渐放大的图片,将上述代码中:pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2);pDC-Ellipse(-500,-500,500,500);修改为:pDC-SetViewportOrg(rectClient.left,rectClient.bottom);pDC-Ellipse(0,0,1000,1000);,滚动视图,例1、新建MFC工程文件名为Exam2SDI选择view基类为CScrollView2、运行:默认情况无滚动条,需要进行设置,3、打开Exam2View.cpp文件新增的函数:OnInitialUpdate,只有选择CScrollView作为基类才有此函数CSize:尺寸类,一个横向,一个纵向sizeTotal.cxsizeTotal.cysizeTotal.cx=sizeTotal.cy=100;通过此语句将横向和纵向尺寸都设置为100,因此在此时运行程序不会出现滚动条,4、将下述语句删除,重新设置CSizesizeTotal;sizeTotal.cx=sizeTotal.cy=100;SetScrollSizes(MM_TEXT,sizeTotal);,5、在OnInitialUpdate函数中添加代码如下CSizeSizeTotal(10000,30000);CSizeSizePage(SizeTotal.cx/2,SizeTotal.cy/2);CSizeSizeLine(SizeTotal.cx/50,SizeTotal.cy/50);SetScrollSizes(MM_HIMETRIC,SizeTotal,SizePage,SizeLine);注:SizePage为设置页的对象,除以2,即表示将窗口分为两页注:SizeLine为设置行的对象,除以50,即表示设置为50行,6、运行7、打开Exam2View.h文件申明变量CRectm_rectEllipse;intm_nColor;8、在构造函数中对变量进行初始化m_rectEllipse=CRect(0,0,4000,-4000);注:产生44cm的矩形m_nColor=GRAY_BRUSH;,9、在OnDraw函数中添加代码:pDC-SelectStockObject(GRAY_BRUSH);pDC-Ellipse(m_rectEllipse);,例:绘制一个椭圆,使用鼠标拖动使椭圆位置可以改变,分析:拖动椭圆时,实际是将现有椭圆擦出,在移动到的位置再绘制相同的椭圆椭圆位于矩形内,因此确定了左上角和右下角坐标,则长和宽就可确定,在拖动鼠标的过程中椭圆的长宽不变在开始移动时,鼠标按下的位置可以确定在椭圆移动的过程中,鼠标的位置相对于左上角的坐标不变,即鼠标在椭圆内的位置确定,因此,涉及到的消息:OnLButtonDownOnMouseMoveOnLButtonUp配合OnDraw函数,步骤一,新建工程drag,选择CScrollView类打开view.h文件,定义私有变量ConstCSizem_sizeellipse;/在移动的过程中椭圆的大小不能改变,因此要定义为常量CPointm_pointtopleft;/左上角坐标CSizem_sizeoffset;/左上角相对鼠标按下位置的偏移量BOOLm_bcapture;/判断是否需要捕获鼠标消息,步骤二,打开view.cpp文件进行消息映射,ClassWizardView类WM_LBUTTONDOWNWM_LBUTTONUPWM_MOUSEMOVE点击OK或Edit,添加消息处理函数/所有的消息处理函数都以ON开头,步骤三,制作滚动视图找到OninitalUpdate函数,将其中的内容删除或注释掉添加代码:CSizeSizeTotal(10000,30000);CSizeSizePage(SizeTotal.cx/2,SizeTotal.cy/2);CSizeSizeLine(SizeTotal.cx/50,sizeTotal.cy/50);SetScrollSizes(MM_HIMETRIC,SizeTotal,SizePage,SizeLine);运行,自定义的变量,步骤四,在构造函数中初始化Cdragview:m_sizeellipse(100,-100),m_pointtopleft(0,0),m_sizeoffset(0,0)M_bcapture=False;,步骤五,鼠标左键按下时,首先获取椭圆的精确位置,判断是否在椭圆内,如果是,则要记录鼠标相对偏移量相对偏移量=鼠标按下位置的x和y坐标减去矩形左上角的x和y坐标,设备坐标,逻辑坐标,逻辑坐标和设备坐标pDC-Ellipse(CRect(0,0,200,200)而鼠标按下时的坐标,例point(50,50)是设备坐标,因此需要转换到同一坐标下,逻辑坐标,在OnLButtonDown函数中添加代码:CRectrectellipse(m_pointtopleft,m_sizeellipse);/CRect构造函数有多种写法CRgncircle;/CRgn为区域类,通过它的函数可获的椭圆精确位置,解决前面椭圆变色程序中的bug,CClientDCdc(this);OnPrepareDC(,说明CPointpointTopLeft(m_pointtopleft);相当于:CPointpointTopLeft;pointTopLeft=m_pointtopleft;,总结:鼠标按下时的工作:获取椭圆精确坐标判断鼠标是否在椭圆内获取位移,步骤六,在OnLButtonUP函数内添加代码:If(m_bcapture)ReleaseCapture();M_bcapture=FALSE;,步骤七(关键部分),在OnMouseMove函数中添加代码:If(m_bcapture)CClientDCdc(this);OnPrepareDC(InvalidateRect(rectold,TRUE)/矩形重绘,TRUE使矩形重绘后即删除,不再屏幕停留/另一种方法是用白色画笔再画一次,m_pointtopleft=point-m_sizeoffset;dc.DPtoLP(/因为不断移动,所以只绘制一下,并不停留,步骤八,在OnDraw函数中添加代码:CBrushbrush(HS_DIAGCROSS,RGB(255,0,0);CPointpoint(0,0);pDC-SetBrushOrg(point);/若自己定义刷子最好添加上述两句,系统自动矫正原点,保证格子不乱pDC-SelectObject(,5MFC资源,菜单对话框位图工具栏,菜单,类型:主菜单例如:File、Edit等弹出菜单选择主菜单或一个菜单项时弹出的子菜单快捷菜单右击某个界面对象时,会弹出快捷菜单,例:创建如下菜单,控制字符串的显示,ID_OPER_REDID_OPER_GREENID_OPER_BLUE,ID_OPER_SHOW,HelloWorld!,注:定义热键:在字符前加/保存当前颜色值CStringm_str;/保存输出字符串BOOLm_show;/判断是否显示2、变量初始化m_color=RGB(0,0,0);m_str=helloworld;m_show=FALSE;,3、通过ClassWizard为各菜单项添加消息映射,4、在消息映射函数中添加代码:voidCResView:OnOperShow()if(m_show=TRUE)m_show=FALSE;elsem_show=TRUE;Invalidate();,voidCResView:OnOperBlue()m_color=RGB(0,0,255);Invalidate();voidCResView:OnOperGreen()m_color=RGB(0,255,0);Invalidate();voidCResView:OnOperRed()m_color=RGB(255,0,0);Invalidate();,voidCResView:OnDraw(CDC*pDC)CResDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);if(m_show)pDC-SetTextColor(m_color);pDC-TextOut(10,10,m_str);,5、当点击显示时,有两种状态:显示或不显示,可以为此菜单项增加一个状态设置,选中时前面出现对勾,否则没有。,添加代码:voidCResView:OnUpdateOperShow(CCmdUI*pCmdUI)pCmdUI-SetCheck(m_show);,SetRadio:显示为点,对话框,分类:模态(Model)对话框:较常用,打开模态对话框后,直到关闭之前,用户不能转向其他用户界面,例如保存文件对话框。非模态(Modeless)对话框:与模态对话框相反,例如word中的查找和替换对话框,例:完善上例中的程序,添加字体菜单,点击字体菜单后弹出对话框设置字体大小,1、插入对话框资源方法:使用菜单【Insert|Resource】打开InsertResource对话框,选中Dialog后单击New按钮。使用项目的ResourceView,找到Dialog资源,右击后选择InsertDialog。按要求设置对话框编辑框ID:ID_EDIT_FONTSIZE按钮ID:IDOK,测试对话框运行效果的方法:选择菜单项Layout|Test。单击布局工具栏上的Test按钮。按快捷键Ctrl+T。,2、为对话框资源创建新类(ClassWizard),CFontSizeDlg,新增对话框类,新增对话框文件,3、为控件创建成员变量可以为对话框上的每一个控件增加一个或多个成员变量来操作控件点击ClassWizardMemberVariables(用来添加或删除和对话框控件相关联的成员变量),分析:要在编辑框IDC_EDIT_FONTSIZE中输入一个值作为字号值,因此,需要为编辑框控件添加一个成员变量m_size对应输入的值,4、添加字号菜单ID_OPER_FONTSIZE,并建立消息映射,添加代码:intm_fontsize;/存储字号fontsize=100;/初始字号大小voidCResView:OnOperFontsize()CFontSizeDlgdlg;if(dlg.DoModal()=IDOK)/显示对话框m_fontsize=dlg.m_size;/获取输入值Invalidate();,5、在OnDraw函数中添加代码:CFontf;f.CreatePointFont(m_fontsize,hello);/自定义字体名为hellopDC-SelectObject(6、在View类的源文件中添加头文件包含:#include“FontSizeDlg.h”,通用对话框,文件对话框,用CFileDialog类提供的通用文件对话框,实现Windows标准的【打开】和【另存为】功能。,CFileDialog(BOOLbOpenFileDialog,/值为TRUE,为打开对话框;FALSE为“另存为”对话框LPCTSTRlpszDefExt=NULL,/默认的文件扩展名LPCTSTRlpszFileName=NULL,/出现在文件名编辑框中的初始文件名DWORDdwFlags=OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,LPCTSTRlpszFilter=NULL,CWnd*pParentWnd=NULL/文件过滤器,用于确定显示在文件列表中的文件类型),例如:CFileDialogdlg(TRUE,bmp,*.bmp,OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT,文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|);,调用成员函数DoModal(),将对话框显示在屏幕上,并让用户从中选择文件。如果DoModal()返回的是IDOK,那么调用下表中的成员函数获取文件信息。,颜色对话框,CColorDialog类提供了可以选择颜色的对话框,使得用户可以从颜色列表中选择要用的颜色。对该类的使用可按下列步骤进行:(1)在视图类相应位置构造CColorDialog对象。(2)设置或修改成员变量m_cc来初始化对话框。m_cc的结构类型为COLORREF。(3)调用成员函数DoModal()来显示对话框并让用户从中选择颜色。(4)如果DoModal()返回的是IDOK,那么用户所做的颜色选择将保存在m_cc中。通过使用该类的成员函数GetColor()即可得到选择颜色的RGB值。,字体对话框,CFontDialog类封装了标准的【字体】对话框,使得用户可以从系统安装的字体列表中选择要用的字体。CFontDialog类的使用步骤与CColorDialog的使用过程是一样的,只是m_cf的结构类型为LOGFONT,m_cf结构用于在调用domodal函数之前对字体对话框中的选项进行初始化。在选择了字体后,可通过下表中的成员函数获取所选择的字体信息。,例:1、新建菜单项ID_FONT,添加消息响应函数2、定义变量:COLORREFm_color;CFontfont;3、变量初始化m_color=RGB(255,0,0);,4、在字体菜单处理函数中添加代码:voidCResView:OnFont()CFontDialogdlg;dlg.m_cf.rgbColors=RGB(255,0,0);if(dlg.DoModal()=IDOK)LOGFONTlf;dlg.GetCurrentFont(,5、在OnDraw函数中添加代码CFont*pold=pDC-SelectObject(,位图,位图是一种数字化的图形表示形式,基本数据结构是像素,一个像素表示一个离散点的颜色值。常见位图有2色、4色、16色、256色、16位、24位。其中VC6的资源编辑器只支持256色以下(包括256色)的位图的编辑,而最新的VC7已经支持24位真彩位图的编辑了。保存在文件中的位图可以看作是设备无关的,文件本身的数据用来描述位图的内容。,例:在上例中插入一副图片,在OnDraw函数中添加代码:CDCdcMem;/创建内存缓冲DCdcMem.CreateCompatibleDC(pDC);CBitmapbmp1;/加载256位图bmp1.LoadBitmap(IDB_BITMAP1);BITMAPbmIf;bmp1.GetBitmap(/绘制到屏幕,缩放显示图片,将BitBlt函数改为:pDC-StretchBlt(0,0,200,200,绘制后显示尺寸,图片起始点,工具栏,通常工具栏中放置的按钮为常用命令的快捷方式,在菜单中都可以找到对应项,因此绘制工具栏按钮后,只需要将ID设置为和相应菜单项相同即可(ID设置方式:在工具栏对应按钮上双击),例:改进上述程序,在工具栏添加颜色设置的快速打开方式绘制图标设置ID:ID_OPER_REDID_OPER_GREENID_OPER_BLUE,基础部分综合实例1,使用菜单栏创建绘图程序,步骤一,FilenewWorkSpaceMFCAppWizard(exe)文件名:Draw类型:单文档,步骤二,1、在DrawView.h中定义变量:private:intm_DrawType;/绘制类型CPointm_ptOrigin;/起点坐标intm_penWidth;/线宽intm_lineStyle;/线型,2、在Drawview.Cpp的构造函数中初始化:CDrawView:CDrawView()m_DrawType=0;m_ptOrigin=0;m_penWidth=1;m_lineStyle=0;,步骤三,1、创建菜单资源ResourceViewMenu编辑菜单项CaptionID:子菜单,唯一的标识相应的菜单项,2、使用ClassWizard添加消息响应函数类名:CDrawView对象ID:消息:COMMAND:点击相应菜单项后要执行的命令UPDATE_COMMAND_UI:选中或释放相应菜单项后显示或取消对勾,代码如下:voidCDrawView:OnDrawPoint()m_DrawType=1;voidCDrawView:OnDrawLine()m_DrawType=2;voidCDrawView:OnDrawRect()m_DrawType=3;,voidCDrawView:OnDrawEllipse()m_DrawType=4;voidCDrawView:OnDrawFill()m_DrawType=5;voidCDrawView:OnDrawHand()m_DrawType=6;,voidCDrawView:OnUpdateDrawPoint(CCmdUI*pCmdUI)if(m_DrawType=1)pCmdUI-SetCheck(1);elsepCmdUI-SetCheck(0);voidCDrawView:OnUpdateDrawLine(CCmdUI*pCmdUI)if(m_DrawType=2)pCmdUI-SetCheck(1);elsepCmdUI-SetCheck(0);,voidCDrawView:OnUpdateDrawRect(CCmdUI*pCmdUI)if(m_DrawType=3)pCmdUI-SetCheck(1);elsepCmdUI-SetCheck(0);voidCDrawView:OnUpdateDrawEllipse(CCmdUI*pCmdUI)if(m_DrawType=4)pCmdUI-SetCheck(1);elsepCmdUI-SetCheck(0);,voidCDrawView:OnUpdateDrawFill(CCmdUI*pCmdUI)if(m_DrawType=5)pCmdUI-SetCheck(1);elsepCmdUI-SetCheck(0);voidCDrawView:OnUpdateDrawHand(CCmdUI*pCmdUI)if(m_DrawType=6)pCmdUI-SetCheck(1);elsepCmdUI-SetCheck(0);,步骤四,添加三个鼠标按键的消息的处理函数:WM_LBUTTONDOWN(左键按下)WM_MOUSEMOVE(鼠标移动)WM_LBUTTONUP(左键松开),voidCDrawView:OnLButtonDown(UINTnFlags,CPointpoint)m_ptOrigin=point;,voidCDrawView:OnMouseMove(UINTnFlags,CPointpoint)CClientDCdc(this);CPenpen(m_lineStyle,m_penWidth,RGB(255,0,0);dc.SelectObject(,voidCDrawView:OnLButtonUp(UINTnFlags,CPointpoint)CClientDCdc(this);CPenpen(m_lineStyle,m_penWidth,RGB(255,0,0);dc.SelectObject(,case3:dc.Rectangle(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);break;case4:dc.Ellipse(CRect(m_ptOrigin.x,m_ptOrigin.y,point.x,point.y);break;case5:dc.SelectStockObject(BLACK_BRUSH);dc.FloodFill(point.x,point.y

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论