精品IT教程Windows系统开发教程最完整版.ppt

上传人:豆**** 文档编号:77563193 上传时间:2023-03-15 格式:PPT 页数:426 大小:5.66MB
返回 下载 相关 举报
精品IT教程Windows系统开发教程最完整版.ppt_第1页
第1页 / 共426页
精品IT教程Windows系统开发教程最完整版.ppt_第2页
第2页 / 共426页
点击查看更多>>
资源描述

《精品IT教程Windows系统开发教程最完整版.ppt》由会员分享,可在线阅读,更多相关《精品IT教程Windows系统开发教程最完整版.ppt(426页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精品IT教程Windows系统开发教程最完整版 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望v驱动程序开发DDK、WDK、DriverStudio、Windriverv应用软件开发C/C:主流的开发工具为Visual C+Visual C+,它以c语言为基础。特点:代码执行效率高Windows应用软件开发应用软件开发语言语言Java:适合开发基于Web的应用程序Windows操作系操作系统核心代码采用统核心代码采用Windows 运行机制Windows 应用程序

2、应用程序Windows 操作系统操作系统输入输出设备输入输出设备函数消息v注:操作系统所能够完成的每一个功能都有一个函数与其对应,也就是说,操作系统把它能够完成的功能以函数的形式提供给应用程序使用,这些函函数的集合数的集合就是Windows操作系统提供给应用程序的编程接口(Application Programming Interface),简称Windows APIWindows API。v例如:例如:CreateWindow():创建一个窗口 应用程序 操作系统调用函数实现创建窗口的功能v消息:报告有关事件发生的通知,是一种数据结构v例如:鼠标单击窗口鼠标单击事件发生windows操作系统

3、获取到这一事件,并将事件以消息的形式传递给应用程序应用程序获取消息,并调用响应函数处理消息vWindows程序设计的核心就是消息的传递和处理v帮助文档:msdnv资料:孙鑫vc+视频教学VC技术内幕(可做参考)Visual C+开发环境开发环境1MFC应用程序框架应用程序框架2基本事件处理基本事件处理3映射模式和滚动视图映射模式和滚动视图4MFC资源资源5ActiveX控件控件6动态链接库(动态链接库(DLL)7多线程编程多线程编程8文档与视图文档与视图9数据库编程数据库编程10Visual C+的编程方式1SDK:Software Development Kit,传统编程法,采用window

4、s API函数进行编程。2MFC:Microsoft Foundation Class,交互式的编程法,对API函数进行了封装,包含许多类。1 1、Visual C+Visual C+开发环境开发环境File File NewNewFile File NewNew2 2、MFCMFC应用程序框架应用程序框架File File New Projects MFC AppWizard(exe)New Projects MFC AppWizard(exe)v使用使用MFCMFC应用程序生成向导创建应用程序生成向导创建Hello WorldHello World程序程序应用程序类型应用程序类型1单文档单

5、文档多文档多文档对话框对话框文档文档/视图结构体系支持视图结构体系支持:即是否支持文档/视图结构数据库支持数据库支持2v否:否:不支持v标题文件:标题文件:不支持,但预留接口v查看数据库不使用文件支持:查看数据库不使用文件支持:支持v查看数据库使用文件支持:查看数据库使用文件支持:支持对复合文档类型和对复合文档类型和ActiveX的支持的支持3注:复合文档是注:复合文档是OLE(Object Linking and Embedding)的一项技术)的一项技术v没有,不需要没有,不需要v容器:容器:例如,在Word中运行Excel程序,Word相对与Excel就是容器v微型服务器:微型服务器:例

6、如,在Excel中的一些资源,其它程序可以调用,Excel就是服务器v完整服务器完整服务器v容器和服务器容器和服务器v自动:自动:例如在Word和Excel中都支持VB,可以在Word和Excel中用VB(确切的说叫VBA)编程,而VC则不支持,要使VC支持,则要选中自动vActiveXActiveX:第三方控件,与开发平台无关v选中相关项后,在左端会有图例显示程序的外观程序的外观4风格、备注、及风格、备注、及MFC库的支持库的支持5v风格风格v源代码备注:源代码备注:例提示客户代码的书写位置v作为共享的作为共享的DLLDLL:运行时才添加mfc库缺点:缺点:在没有安装VC的机器上不能运行解决

7、办法:解决办法:将vc下相关的DLL文件拷贝到Windows文件夹中v作为静态的作为静态的DLLDLL:编译时所有用到的库都被链接。缺点:缺点:程序较大自动生成相关的类自动生成相关的类6vChelloView:视类,可选择基类,用来显示文档数据并和用户交互如果在第五步中选择MFC风格,则基类为CView类,若选择资源管理器风格,则为CListView类例如,设计字处理软件,则要选择CEditView类vChelloDoc:文档类,用于管理文档数据vCMainFrame:框架类,用来产生应用程序的主框架窗口vChelloApp:应用程序类,用来管理应用程序实例,放入口函数v在vc中将数据显示和数

8、据本身分开文档:文档:数据,CDocument作用:作用:数据存储,加载等视图:视图:显示,CView作用:作用:数据显示,修改等VC+VC+的项目工作区窗口的项目工作区窗口ClassViewResourceViewFileView运行v运行vVC工程文件夹下的文件Debug:exe文件所在的位置Res:资源文件夹hello.cpp和hello.h:包含CExamApp类helloView.cpp和helloView.hhelloDoc.cpp和helloDoc.hMainFrame.cpp和MainFrame.hStdAfx.h:标准的全局函数定义关键代码说明Helloview.h:CHel

9、loView类的定义PrivateProtectedPublic定义变量定义函数GetDocument()v#include“helloView.h”#include“helloView.h”v构造函数:构造函数:变量初始化v析构函数析构函数vPreCreateWindow()PreCreateWindow():在窗口创建之前要做的工作Helloview.cppvOnDrawOnDraw(CDC*pDCCDC*pDC)CExamDoc*pDoc=GetDocument();CExamDoc*pDoc=GetDocument();获取文档的地址放在pDoc中,要使用文档中的数据则可以使用pDoc

10、例如,文档中的x,则使用pDocx获取值ASSERT_VALID(pDoc);ASSERT_VALID(pDoc);宏定义,确保上条语句的结果有效CDCCDCvDC:Device Context,即设备上下文或设备描述表或设备环境引入原因:引入原因:Windows不容许用户直接操作硬件,所以定义了一个抽象层DC,所有与绘图或显示相关操作封装在CDC类中,要访问显示设备就必须使用CDC类中提供的函数应用程序DC硬件设备例如:显示器、打印机等显示设备DeviceContext绘图工具画笔画刷字体位图调色板vCDC*pDCCDC*pDCCDC:封装了所有的绘制和打印函数pDC为指向CDC类的指针,可

11、以使用pDC访问CDC类中的函数(pDC-)OnDraw函数被调用的情况:程序运行后自动调用窗口重绘之后,例如窗口的大小被改变、窗口被覆盖Hello WorldHello World程序程序void CHelloView:OnDraw(CDC*pDC)CHelloDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data herepDC-TextOut(0,0,hello world);起始点坐标常用绘图函数v画点:画点:SetPixel(intSetPixel(int x1,intint y1,C

12、OLORREFCOLORREF crColor););v绘制线:绘制线:MoveTo(int MoveTo(int x1,intint y1);LineTo(int LineTo(int x2,intint y2););v绘制矩形:绘制矩形:Rectangle Rectangle(intint x1,intint y1,intint x2,intint y2););v绘制椭圆:绘制椭圆:Ellipse(Ellipse(intint x1,intint y1,intint x2,intint y2););例:例:pDC-Ellipse(0,200,100,120);pDC-Ellipse(0,2

13、00,100,120);常用绘图工具v画笔:负责绘制直线和曲线的工具v画刷:负责填充图形的工具v绘图的一般过程:创建或取得设备环境(DC)创建绘图工具(画笔、画刷等)(否则采用默认的绘图工具)将绘图工具选入设备环境绘制图形释放获得的设备环境创建和载入绘图工具v库存对象(StockObject)(基本工具)画笔 BLACK_PENBLACK_PEN Black pen(默认)NULL_PEN NULL_PEN Null pen WHITE_PEN WHITE_PEN White pen 画刷BLACK_BRUSHBLACK_BRUSH Black brushDKGRAY_BRUSHDKGRAY_

14、BRUSH Dark gray brushGRAY_BRUSHGRAY_BRUSH Gray brushHOLLOW_BRUSHHOLLOW_BRUSH Hollow brushLTGRAY_BRUSHLTGRAY_BRUSH Light gray brushNULL_BRUSHNULL_BRUSH Null brushWHITE_BRUSHWHITE_BRUSH White brush v载入库存对象SelectStockObject(int nIndex);例如:例如:pDC-SelectStockObject(WHITE_PEN);例如:例如:pDC-SelectStockObject(

15、GRAY_BRUSH);v自定义对象自定义画笔自定义画刷自定义画笔v CPen(CPen(intint nPenStyle,intint nWidth,COLORREFCOLORREF crColor););常用的画笔样式:PS_SOLIDPS_SOLID PS_DASHPS_DASH PS_DOTPS_DOT PS_DASHDOTPS_DASHDOT 颜色:RGB(nRed,nGreen,nBlue)RGB(nRed,nGreen,nBlue)红色值红色值蓝色值蓝色值绿色值绿色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)例:例:CPen pen(PS_DOT,1

16、,RGB(255,0,0);自定义画刷vCBrush(int CBrush(int nIndexnIndex,COLORREF,COLORREF crColorcrColor););画刷的样式(nIndex):HS_BDIAGONAL HS_BDIAGONALDownward hatch at 45 degrees HS_CROSS HS_CROSSHorizontal and vertical crosshatch HS_DIAGCROSS HS_DIAGCROSSCrosshatch at 45 degrees HS_FDIAGONAL HS_FDIAGONALUpward hatch a

17、t 45 degrees HS_HORIZONTAL HS_HORIZONTALHorizontal hatch HS_VERTICAL HS_VERTICALVertical hatch 例如:例如:CBrush brush(HS_CROSS,RGB(0,0,255);可省,默认为实心v载入自定义对象SelectObject(CPen*pPen);例如:例如:CPen pen(PS_DOT,1,RGB(255,0,0);pDC-SelectObject(&pen);SelectObject(CBrush*pBrush);例如:例如:CBrush brush(HS_CROSS,RGB(0,0,

18、255);pDC-SelectObject(&brush);非1时会出现什么情况?练习v输出如下图形:文本v设置文本的颜色SetTextColor(COLORREF nColor);v设置文本背景的颜色SetBkColor(COLORREF nColor);例如:pDC-SetTextColor(RGB(0,255,0);pDC-SetBkColor(RGB(255,255,0);pDC-TextOut(10,10,hello world);3 3、基本事件处理、基本事件处理v鼠标事件:单击单击双击双击移动移动v添加消息响应函数:(1)View ClassWizard (2)类上点右键 添加w

19、indows消息v常用鼠标消息:WM_LBUTTONDOWNWM_LBUTTONDOWN左键按下左键按下WM_LBUTTONUPWM_LBUTTONUP左键释放左键释放WM_LBUTTONDBLCLKWM_LBUTTONDBLCLK左键双击左键双击WM_RBUTTONDOWNWM_RBUTTONDOWN右键按下右键按下WM_RBUTTONUPWM_RBUTTONUP右键释放右键释放WM_RBUTTONDBLCLKWM_RBUTTONDBLCLK右键双击右键双击WM_MOUSEMOVEWM_MOUSEMOVE鼠标移动鼠标移动例1、按下鼠标左键时绘制灰色椭圆v添加左键按下的消息响应函数 View

20、ClassWizard WM_LBUTTONDOWNv方法一:void CHelloView:OnLButtonDown(UINT nFlags,CPoint point)CDC*pDC=GetDC();pDC-SelectStockObject(GRAY_BRUSH);pDC-Ellipse(100,100,300,200);ReleaseDC(pDC);v方法二:CClientDC dc(this);dc.SelectStockObject(GRAY_BRUSH);dc.Ellipse(100,100,300,200);CClientDC:派生于CDC类,在其构造函数中调用 了GetDC(

21、)函数,因此在代码中不需显 式的调用,常用的方法常用的方法。在调用函数时使用在调用函数时使用.和和-的区别的区别例2、单击椭圆使其在灰色与白色之间变化void CHelloView:OnLButtonDown(UINT nFlags,CPoint point)CClientDC dc(this);dc.SelectStockObject(GRAY_BRUSH);dc.Ellipse(100,100,300,200);分析:分析:如果当前的画刷为GRAY_BRUSH,则单击之后使其变 为WHITE_BRUSH,反之。解决办法:解决办法:定义变量m_ncolor设置颜色值v程序改进:1、在hell

22、oView.h文件中定义变量 private:int m_ncolor;2、在helloView.cpp文件构造函数中初始化变量m_ncolor=GRAY_BRUSH;v程序改进:3、在OnLButtonDown函数中添加代码判断:判断:if(m_ncolor=GRAY_BRUSH)if(m_ncolor=GRAY_BRUSH)m_ncolor=WHITE_BRUSH;m_ncolor=WHITE_BRUSH;elseelse m_ncolor=GRAY_BRUSH;m_ncolor=GRAY_BRUSH;绘制椭圆绘制椭圆 CClientDC dc(this);CClientDC dc(thi

23、s);dc.SelectStockObject(m_ncolor);dc.SelectStockObject(m_ncolor);dc.Ellipse(100,100,300,200);dc.Ellipse(100,100,300,200);v 当点击最大化按钮时为什么椭圆消失?OnDrawOnDraw函数被调用的情况:函数被调用的情况:程序运行后自动调用程序运行后自动调用窗口重绘之后,例如大小被改变、窗口被覆盖窗口重绘之后,例如大小被改变、窗口被覆盖v解决办法:解决办法:在OnDraw函数中使用当前画刷重绘椭圆代码:pDC-SelectStockObject(m_ncolor);pDC-El

24、lipse(100,100,300,200);Invalidate();CClientDC dc(this);CClientDC dc(this);dc.SelectStockObject(m_ncolor);dc.SelectStockObject(m_ncolor);dc.Ellipse(100,100,300,200);dc.Ellipse(100,100,300,200);v注:为了增加程序的可读性,以及便于维护或修改,可以将用到的参数值用变量代替1、定义、定义 CRect rectellipse;2、初始化、初始化 rectellipse=CRect(100,100,300,200)

25、;3、绘制、绘制 pDC-Ellipse(rectellipse);OnLButtonDown(UINT nFlags,CPoint point)v参数nFlagsnFlags:鼠标状态,通常与如下参数配合使用point point:鼠标按下点的位置坐标,包含两个参数point.xpoint.xpoint.ypoint.yv例3:只在椭圆内部点击时变色,其它位置不变色CRect:PtInRect(POINT point)应用:应用:if(rectellipse.PtInRect(point).练习1v使用透明画刷手动绘制矩形bool draw;CPoint m_left;CHelloView:

26、CHelloView()draw=FALSE;m_left=0;vvoid CHelloView:OnLButtonDown(UINT nFlags,CPoint point)draw=TRUE;m_left=point;void CHelloView:OnLButtonUp(UINT nFlags,CPoint void CHelloView:OnLButtonUp(UINT nFlags,CPoint point)point)if(draw=TRUE)if(draw=TRUE)CClientDC dc(this);CClientDC dc(this);dc.SelectStockObjec

27、t(HOLLOW_BRUSH);dc.SelectStockObject(HOLLOW_BRUSH);dc.Rectangle(m_left.x,m_left.y,point.x,point.y);dc.Rectangle(m_left.x,m_left.y,point.x,point.y);draw=FALSE;draw=FALSE;练习2v在窗口上按下鼠标左键拖动时输出如下图形v分析:问题涉及到三种消息处理:左键按下:确定原点,开始绘制鼠标移动:绘制图形左键松开:停止绘图bool draw;CPoint m_old,m_origin;CHelloView:CHelloView()draw=

28、FALSE;m_old=0;m_origin=0;void CHelloView:OnLButtonDown(UINT nFlags,CPoint point)draw=TRUE;m_old=point;m_origin=point;void CHelloView:OnMouseMove(UINT nFlags,CPoint void CHelloView:OnMouseMove(UINT nFlags,CPoint point)point)CClientDC dc(this);CClientDC dc(this);if(draw=TRUE)if(draw=TRUE)dc.MoveTo(m_o

29、rigin);dc.MoveTo(m_origin);dc.LineTo(m_old);dc.LineTo(m_old);dc.MoveTo(m_old);dc.MoveTo(m_old);dc.LineTo(point);dc.LineTo(point);m_old=point;m_old=point;void CHelloView:OnLButtonUp(UINT nFlags,CPoint point)draw=FALSE;v键盘事件WM_KEYDOWNWM_KEYUPWM_CHARv区别:WM_KEYDOWN:可以识别键盘上的大多数按键,但不能区分大小写字母,以及数字和特殊符号,只能大

30、写字母和数字WM_CHAR:只能识别键盘上的字符键和部分控制键,但可以区分大小写字母和shift+数字键v例:输出可移动的字符1、新建单文档程序MoveChar2、定义变量:CString m_string;/存放用户输入的字符 int y;int x;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、在OnKey

31、Down函数中添加代码:switch(nChar)case VK_LEFT:x-;break;case VK_RIGHT:x+;break;case VK_UP:y-;break;case VK_DOWN:y+;Invalidate();常用的虚拟键代码 符号常量对应按键符号常量对应按键VK_LBUTTON鼠标左键VK_0VK_90键-9键VK_RBUTTON鼠标右键VK_AVK_ZA键到Z键VK_BACK退格键(BACKSPACE键)VK_NUMPAD09数字小键盘0-9键VK_RETURN回车键(Enter)VK_MULTIPY乘号键VK_SHIFTShift键VK_ADD加号键VK_CA

32、PITALCapsLock键VK_SUBTRACT减号键VK_ESCAPEEsc键VK_F1VK_F24F1键到F24键VK_SPACESpaceBar键VK_NUMLOCKNum Lock键VK_PRIORPageUp键VK_TAB制表键(Tab)VK_NEXTPageDown键VK_PAUSEPause键VK_ENDEnd键VK_INSERTIns键VK_HOMEHome键VK_DELETEDel键VK_LEFTLeft Arrow()键VK_DOWNDown Arrow()键v定时器消息WM_TIMERWindows定时器是一种周期性的消息产生装置,它会每隔一段指定时间发送一次定时消息W

33、M_TIMER。它是一个很重要的系统消息,当系统所设置的时间到达以后,系统就会自动发送该消息。与该消息联系密切的一个函数是SetTimer(),它设置一个系统时钟,当设置的时间到时,系统产生WM_TIMER消息。通过对SetTimer()函数的参数进行设置,告诉用户哪一个时钟的时间到了,因此,可以将一些周期性的工作放入WM_TIMER的消息处理函数 定时器的使用一般遵循下列步骤:1.使用SetTimer()函数设置定时器2.超载OnTimer()函数,完成用户希望的操作3.撤消定时器KillTimer().v例:利用定时器消息实现一个滚动的字幕,即程序运行后,在屏幕的中央显示一行文本“我爱VC

34、+编程”,该字幕从屏幕循环地从屏幕的左边滚动到右边,当字母超出屏幕右边界时,字母又从屏幕的左边出现。v在windows中,图形的显示:默认情况下,窗口原点和视口原点都在左上角(0,0)位置n默认情况下,窗口和视口完全一致,单位为像素4 4、映射模式和滚动视图映射模式和滚动视图图形绘制函数窗口视口xy(100,100)xy(100,100)v改变窗口和视口原点函数:SetWindowOrg(int x,int y)SetViewportOrg(int x,int y)v无论窗口原点和视口原点怎么变化,窗口原点总是映射到视口原点上v注:绘制函数中的坐标点为窗口中的坐标v例如:观察运行结果pDC-R

35、ectangle(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);v坐标系:绘图时需要一个参照坐标系,以确定图形或文本的输出位置 例如:pDC-(100,100,”hello world!”)v图形设备接口支持两种坐标系统:逻辑坐标逻辑坐标 窗

36、口窗口 设备坐标设备坐标 视口视口注:注:通常,文本或图形输出函数使用的是逻辑坐通常,文本或图形输出函数使用的是逻辑坐标,而在客户区点击或移动鼠标所得到的是设备标,而在客户区点击或移动鼠标所得到的是设备坐标坐标v引例:pDC-Rectangle(0,0,200,200)函数绘制了200200矩形,默认单位为像素,当显示到屏幕上时,根据显示器的分辨率设置不同,其大小也是不同的问题问题:如果要显示如果要显示2cm*2cm2cm*2cm的举行的举行,而与显示器的分而与显示器的分辨率无关辨率无关,则需要用到映射模式。则需要用到映射模式。v映射模式:简单的说就是定义逻辑坐标的逻辑单映射模式:简单的说就是

37、定义逻辑坐标的逻辑单位大小和增长方向位大小和增长方向映射方式映射方式逻辑单位逻辑单位方向方向MM_TEXTMM_TEXT一个像素,默认一个像素,默认MM_LOENGLISHMM_LOENGLISH0.010.01英寸英寸MM_HIENGLISHMM_HIENGLISH0.0010.001英寸英寸MM_LOMETRICMM_LOMETRIC0.1mm0.1mmMM_HIMETRICMM_HIMETRIC0.01mm0.01mmMM_ISOTROPICMM_ISOTROPIC系统确定系统确定X X,y y可调,可调,1 1:1 1MM_ANISOTROPICMM_ANISOTROPIC系统确定系统

38、确定 X X,y y可调,可调,比例任意比例任意注:注:窗口的单位有多种:像素、英寸、毫米窗口的单位有多种:像素、英寸、毫米视口只有一种:像素视口只有一种:像素改变映射模式的函数:改变映射模式的函数:SetMapMode()v例如:pDC-SetMapMode(MM_HIMETRIC);/设定映射模式为MM_HIMETRICpDC-Rectangle(CRect(0,0,2000,-2000);/画一个宽和高为2厘米的方块在上述代码中添加如下语句,运行,查看显示结果:在上述代码中添加如下语句,运行,查看显示结果:pDC-SetViewportOrg(CPoint(100,100);pDC-Se

39、tViewportOrg(CPoint(100,100);v缩放可变的映射模式:MMISOTROPIC 纵横比始终是1:1,即:当缩放因子改变时,一个圆始终是一个圆。MMANISOTROPIC:缩放因子可以分别改变,较常用注:原点位于窗口左上角,注:原点位于窗口左上角,缩放因子:缩放因子:x的缩放因子视口的的缩放因子视口的x大小大小/窗口的窗口的x大小大小 y的缩放因子视口的的缩放因子视口的y大小大小/窗口的窗口的y大小大小v例、画一个撑满窗口的椭圆CRect rectClient;GetClientRect(rectClient);pDC-SetMapMode(MM_ANISOTROPIC)

40、;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);vGetClientRect:获取客户区域的矩形尺寸(即窗口中的白色部分)vSetWindowExt:设置窗口的范围,将第二个参数取负后可得到正向朝上的y轴vSetViewportExt:设置视口的范围,此例中将其设置为和客户区域大小相同

41、vSetViewportOrg:设置视口原点,此例中设置为客户区的中心点为视口的原点v运行当窗口的大小改变时,椭圆的大小也随之改变,并始终撑满整个窗口v将上述代码中:pDC-SetWindowExt(CSize(1000,1000);v修改为:pDC-SetWindowExt(CSize(800,800);v由上例得到的启发:假如制作一个人走近城门的动画,越走近城门越大,只需将窗口的尺寸逐渐变小即可,而不需要设置一系列城门逐渐放大的图片v将上述代码中:pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2);pDC-Ellipse(-

42、500,-500,500,500);v修改为:pDC-SetViewportOrg(rectClient.left,rectClient.bottom);pDC-Ellipse(0,0,1000,1000);滚动视图v例1、新建MFC工程文件名为Exam2 SDI 选择view基类为CScrollView2、运行:默认情况无滚动条,需要进行设置3、打开Exam2View.cpp文件新增的函数:OnInitialUpdate,只有选择CScrollView作为基类才有此函数CSize:尺寸类,一个横向,一个纵向sizeTotal.cxsizeTotal.cysizeTotal.cx=sizeTo

43、tal.cy=100;通过此语句将横向和纵向尺寸都设置为100,因此在此时运行程序不会出现滚动条4、将下述语句删除,重新设置CSize sizeTotal;sizeTotal.cx=sizeTotal.cy=100;SetScrollSizes(MM_TEXT,sizeTotal);5、在OnInitialUpdate函数中添加代码如下CSize SizeTotal(10000,30000);CSize SizePage(SizeTotal.cx/2,SizeTotal.cy/2);CSize SizeLine(SizeTotal.cx/50,SizeTotal.cy/50);SetScrol

44、lSizes(MM_HIMETRIC,SizeTotal,SizePage,SizeLine);注:SizePage为设置页的对象,除以2,即表示将窗口分为两页注:SizeLine为设置行的对象,除以50,即表示设置为50行6、运行7、打开Exam2View.h文件申明变量CRect m_rectEllipse;int m_nColor;8、在构造函数中对变量进行初始化 m_rectEllipse=CRect(0,0,4000,-4000);注:产生44cm的矩形m_nColor=GRAY_BRUSH;9、在OnDraw函数中添加代码:pDC-SelectStockObject(GRAY_BR

45、USH);pDC-Ellipse(m_rectEllipse);v例:绘制一个椭圆,使用鼠标拖动使椭圆位置可以改变v分析:拖动椭圆时,实际是将现有椭圆擦出,在移动到的位置再绘制相同的椭圆1.椭圆位于矩形内,因此确定了左上角和右下角坐标,则长和宽就可确定,在拖动鼠标的过程中椭圆的长宽不变2.在开始移动时,鼠标按下的位置可以确定3.在椭圆移动的过程中,鼠标的位置相对于左上角的坐标不变,即鼠标在椭圆内的位置确定因此,涉及到的消息:OnLButtonDownOnMouseMoveOnLButtonUp配合OnDraw函数步骤一v新建工程drag,选择CScrollView类v打开view.h文件,定义

46、私有变量Const CSize m_sizeellipse;/在移动的过程中椭圆的大小不能改变,因此要定义为常量CPoint m_pointtopleft;/左上角坐标CSize m_sizeoffset;/左上角相对鼠标按下位置的偏移量BOOL m_bcapture;/判断是否需要捕获鼠标消息步骤二v打开view.cpp文件进行消息映射,ClassWizardView类WM_LBUTTONDOWNWM_LBUTTONUPWM_MOUSEMOVE点击OK或Edit,添加消息处理函数/所有的消息处理函数都以ON开头步骤三v制作滚动视图制作滚动视图找到找到OninitalUpdateOninita

47、lUpdate函数,将其中的内容删除或注释函数,将其中的内容删除或注释掉掉添加代码:添加代码:CSize SizeTotalCSize SizeTotal(1000010000,3000030000););CSize SizePage(SizeTotal.cx/2,SizeTotal.cy/2);CSize SizePage(SizeTotal.cx/2,SizeTotal.cy/2);CSize SizeLine(SizeTotal.cx/50,sizeTotal.cy/50);CSize SizeLine(SizeTotal.cx/50,sizeTotal.cy/50);SetScroll

48、SizesSetScrollSizes(MM_HIMETRIC,SizeTotal,SizePage,SizeLineMM_HIMETRIC,SizeTotal,SizePage,SizeLine);运行运行自定义自定义的变量的变量步骤四v在构造函数中初始化Cdragview:m_sizeellipse(100,-100),m_pointtopleft(0,0),m_sizeoffset(0,0)M_bcapture=False;步骤五v鼠标左键按下时,首先获取椭圆的精确位置,判断是否在椭圆内,如果是,则要记录鼠标相对偏移量相对偏移量=鼠标按下位置的x和y坐标减去矩形左上角的x和y坐标设备坐标

49、设备坐标逻辑坐标逻辑坐标v逻辑坐标和设备坐标pDC-Ellipse(CRect(0,0,200,200)而鼠标按下时的坐标,例point(50,50)是设备坐标,因此需要转换到同一坐标下逻辑坐标v在OnLButtonDown函数中添加代码:CRect rectellipse(m_pointtopleft,m_sizeellipse);/CRect构造函数有多种写法CRgn circle;/CRgn为区域类,通过它的函数可获的椭圆精确位置解决前面椭圆变色程序中的bugCClientDC dc(this);OnPrepareDC(&dc);dc.LPtoDP(&rectellipse);/逻辑坐标

50、转换到设备坐标Circle.CreateEllipticRgnIndirect(rectellipse);/获取椭圆区域If(circle.PtInRegion(point)SetCapture();/强制捕获消息m_bcapture=TRUE;CPoint pointTopLeft(m_pointtopleft);dc.LPtoDP(&pointTopLeft);m_sizeoffset=point-pointTopLeft;:SetCursor(:LoadCursor(NULL,IDC_CROSS);v说明CPoint pointTopLeft(m_pointtopleft);v相当于:C

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁