Windows系统开发教程最完整版_第1页
Windows系统开发教程最完整版_第2页
Windows系统开发教程最完整版_第3页
Windows系统开发教程最完整版_第4页
Windows系统开发教程最完整版_第5页
已阅读5页,还剩421页未读, 继续免费阅读

下载本文档

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

文档简介

1、Windows系统开发主讲教师:郭迎春guoyc计算机与信息工程学院驱动程序开发DDK、WDK、DriverStudio、Windriver应用软件开发C/C:主流的开发工具为Visual C+,它以c语言为基础。特点:代码执行效率高Windows应用软件开发语言Java:适合开发基于Web的应用程序Windows操作系统核心代码采用Windows 运行机制Windows 应用程序Windows 操作系统输入输出设备驱动输出输入注:应用程序开发者通常不需要知道操作系统与硬件设备之间交互的具体细节,我们要关心的是应用程序与操作系统之间的交互关系Windows 运行机制Windows 应用程序Wi

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

3、函数处理消息Windows程序设计的核心就是消息的传递和处理帮助文档:msdn资料:孙鑫vc+视频教学VC技术内幕(可做参考)Visual C+开发环境1MFC应用程序框架2基本事件处理3映射模式和滚动视图4MFC资源5ActiveX控件6动态链接库(DLL)7多线程编程8文档与视图9数据库编程10Visual C+的编程方式1SDK:Software Development Kit,传统编程法,采用windows API函数进行编程。2MFC:Microsoft Foundation Class,交互式的编程法,对API函数进行了封装,包含许多类。1、Visual C+开发环境File Ne

4、wFile New2、MFC应用程序框架File New Projects MFC AppWizard(exe) 使用MFC应用程序生成向导创建Hello World程序应用程序类型1单文档多文档对话框文档/视图结构体系支持:即是否支持文档/视图结构数据库支持2否:不支持标题文件:不支持,但预留接口查看数据库不使用文件支持:支持查看数据库使用文件支持:支持对复合文档类型和ActiveX的支持3注:复合文档是OLE(Object Linking and Embedding )的一项技术没有,不需要容器:例如,在Word中运行Excel程序,Word相对与Excel就是容器微型服务器:例如,在Ex

5、cel中的一些资源,其它程序可以调用,Excel就是服务器完整服务器容器和服务器自动:例如在Word和Excel中都支持VB,可以在Word和Excel中用VB(确切的说叫VBA)编程,而VC则不支持,要使VC支持,则要选中自动ActiveX:第三方控件,与开发平台无关选中相关项后,在左端会有图例显示程序的外观4风格、备注、及MFC库的支持5风格源代码备注:例提示客户代码的书写位置作为共享的DLL:运行时才添加mfc库缺点:在没有安装VC的机器上不能运行解决办法:将vc下相关的DLL文件拷贝到Windows文件夹中作为静态的DLL:编译时所有用到的库都被链接。缺点:程序较大自动生成相关的类6C

6、helloView:视类,可选择基类,用来显示文档数据并和用户交互如果在第五步中选择MFC风格,则基类为CView类,若选择资源管理器风格,则为CListView类例如,设计字处理软件,则要选择CEditView类ChelloDoc:文档类,用于管理文档数据CMainFrame:框架类,用来产生应用程序的主框架窗口ChelloApp:应用程序类,用来管理应用程序实例,放入口函数在vc中将数据显示和数据本身分开文档:数据,CDocument作用:数据存储,加载等视图:显示,CView作用:数据显示,修改等VC+的项目工作区窗口ClassViewResourceViewFileView运行运行VC

7、工程文件夹下的文件Debug:exe文件所在的位置Res:资源文件夹和:包含CExamApp类hello和hellohello和hello和:标准的全局函数定义关键代码说明: CHelloView类的定义PrivateProtectedPublic定义变量定义函数GetDocument()#include “”构造函数:变量初始化析构函数PreCreateWindow():在窗口创建之前要做的工作OnDraw(CDC* pDC)CExamDoc* pDoc = GetDocument();获取文档的地址放在pDoc中,要使用文档中的数据则可以使用pDoc例如,文档中的x,则使用pDocx获取值

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

9、况:程序运行后自动调用窗口重绘之后,例如窗口的大小被改变、窗口被覆盖Hello 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);起始点坐标常用绘图函数画点: SetPixel( int x1, int y1 , COLORREF crColor );绘制线: MoveTo( int x1, int y1 ); LineTo

10、( int x2, int y2 );绘制矩形: Rectangle ( int x1, int y1, int x2, int y2 );绘制椭圆: Ellipse( int x1, int y1, int x2, int y2 );例:pDC-Ellipse(0,200,100,120);常用绘图工具画笔:负责绘制直线和曲线的工具画刷:负责填充图形的工具绘图的一般过程:创建或取得设备环境(DC)创建绘图工具(画笔、画刷等)(否则采用默认的绘图工具)将绘图工具选入设备环境绘制图形释放获得的设备环境创建和载入绘图工具库存对象(StockObject)(基本工具)画笔 BLACK_PEN Bla

11、ck pen(默认) NULL_PEN Null pen WHITE_PEN White pen 画刷BLACK_BRUSH Black brushDKGRAY_BRUSH Dark gray brushGRAY_BRUSH Gray brushHOLLOW_BRUSH Hollow brushLTGRAY_BRUSH Light gray brushNULL_BRUSH Null brushWHITE_BRUSH White brush 载入库存对象SelectStockObject(int nIndex );例如:pDC-SelectStockObject(WHITE_PEN);例如:pD

12、C-SelectStockObject(GRAY_BRUSH);自定义对象自定义画笔自定义画刷自定义画笔 CPen( int nPenStyle, int nWidth, COLORREF crColor ); 常用的画笔样式: PS_SOLID PS_DASH PS_DOT PS_DASHDOT 颜色: RGB(nRed, nGreen,nBlue) 红色值蓝色值绿色值RGB(255, 0, 0)RGB(0, 255, 0)RGB(0, 0, 255)例:CPen pen(PS_DOT,1,RGB(255,0,0);自定义画刷CBrush(int nIndex, COLORREF crCol

13、or );画刷的样式(nIndex): HS_BDIAGONALDownward hatch at 45 degrees HS_CROSSHorizontal and vertical crosshatch HS_DIAGCROSSCrosshatch at 45 degrees HS_FDIAGONALUpward hatch at 45 degrees HS_HORIZONTALHorizontal hatch HS_VERTICALVertical hatch 例如:CBrush brush(HS_CROSS,RGB(0,0,255);可省,默认为实心载入自定义对象SelectObjec

14、t(CPen* pPen );例如:CPen pen(PS_DOT,1,RGB(255,0,0);pDC-SelectObject(&pen);SelectObject(CBrush* pBrush);例如:CBrush brush(HS_CROSS,RGB(0,0,255);pDC-SelectObject(&brush);非1时会出现什么情况?练习输出如下图形:void CHelloView:OnDraw(CDC* pDC)pDC-TextOut(200,50,基本图形);CPen pen1(PS_DOT,1,RGB(255,0,0);pDC-SelectObject(pen1);pDC-

15、MoveTo(30,100); pDC-LineTo(200,100);CPen pen2(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);CBrush brush(HS_CROSS,RGB(0,0,255);pDC-SelectObject(&brush); pDC-Ellipse(450,100,600,200);文本设置文本的颜色SetTextColor(COL

16、ORREF nColor);设置文本背景的颜色SetBkColor(COLORREF nColor);例如:pDC-SetTextColor(RGB(0,255,0);pDC-SetBkColor(RGB(255,255,0);pDC-TextOut(10,10,hello world);3、基本事件处理鼠标事件:单击双击移动添加消息响应函数: (1) View ClassWizard (2)类上点右键 添加windows消息常用鼠标消息:WM_LBUTTONDOWN左键按下WM_LBUTTONUP左键释放WM_LBUTTONDBLCLK左键双击WM_RBUTTONDOWN右键按下WM_RBU

17、TTONUP右键释放WM_RBUTTONDBLCLK右键双击WM_MOUSEMOVE鼠标移动例1、按下鼠标左键时绘制灰色椭圆添加左键按下的消息响应函数 View ClassWizard WM_LBUTTONDOWN方法一:void CHelloView:OnLButtonDown(UINT nFlags, CPoint point) CDC *pDC=GetDC(); pDC-SelectStockObject(GRAY_BRUSH);pDC-Ellipse(100,100,300,200); ReleaseDC(pDC);方法二: CClientDC dc(this); dc.SelectS

18、tockObject(GRAY_BRUSH); dc. Ellipse(100,100,300,200);CClientDC:派生于CDC类,在其构造函数中调用 了GetDC()函数,因此在代码中不需显 式的调用,常用的方法。在调用函数时使用 . 和 - 的区别例2、单击椭圆使其在灰色与白色之间变化void CHelloView:OnLButtonDown(UINT nFlags, CPoint point) CClientDC dc(this); dc.SelectStockObject(GRAY_BRUSH); dc. Ellipse(100,100,300,200);分析:如果当前的画刷

19、为GRAY_BRUSH,则单击之后使其变 为WHITE_BRUSH,反之。解决办法:定义变量m_ncolor设置颜色值程序改进:1、在文件中定义变量 private: int m_ncolor;2、在文件构造函数中初始化变量m_ncolor=GRAY_BRUSH;程序改进:3、在OnLButtonDown函数中添加代码判断: if(m_ncolor=GRAY_BRUSH) m_ncolor=WHITE_BRUSH;else m_ncolor=GRAY_BRUSH;绘制椭圆 CClientDC dc(this); dc.SelectStockObject(m_ncolor); dc. Ellip

20、se(100,100,300,200); 当点击最大化按钮时为什么椭圆消失?OnDraw函数被调用的情况:程序运行后自动调用窗口重绘之后,例如大小被改变、窗口被覆盖解决办法:在OnDraw函数中使用当前画刷重绘椭圆代码: pDC-SelectStockObject(m_ncolor); pDC-Ellipse(100,100,300,200);Invalidate();CClientDC dc(this);dc.SelectStockObject(m_ncolor);dc. Ellipse(100,100,300,200);注: 为了增加程序的可读性,以及便于维护或修改,可以将用到的参数值用变

21、量代替1、定义 CRect rectellipse;2、初始化 rectellipse=CRect(100,100,300,200);3、绘制 pDC-Ellipse(rectellipse);OnLButtonDown(UINT nFlags, CPoint point)参数nFlags:鼠标状态,通常与如下参数配合使用point :鼠标按下点的位置坐标,包含两个参数例3:只在椭圆内部点击时变色,其它位置不变色CRect:PtInRect( POINT point ) 应用:if(rectellipse.PtInRect(point) . 练习1使用透明画刷手动绘制矩形bool draw;C

22、Point m_left;CHelloView:CHelloView()draw=FALSE;m_left=0;void CHelloView:OnLButtonDown(UINT nFlags, CPoint point) draw=TRUE;m_left=point;void CHelloView:OnLButtonUp(UINT nFlags, CPoint point) if(draw=TRUE) CClientDC dc(this); dc.SelectStockObject(HOLLOW_BRUSH); ); draw=FALSE;练习2在窗口上按下鼠标左键拖动时输出如下图形分析:

23、 问题涉及到三种消息处理:左键按下:确定原点,开始绘制鼠标移动:绘制图形左键松开:停止绘图bool draw;CPoint m_old,m_origin;CHelloView:CHelloView() draw=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 point) CClientDC dc(this);i

24、f(draw=TRUE)dc.MoveTo(m_origin);dc.LineTo(m_old);dc.MoveTo(m_old);dc.LineTo(point);m_old=point;void CHelloView:OnLButtonUp(UINT nFlags, CPoint point) draw=FALSE;键盘事件WM_KEYDOWNWM_KEYUPWM_CHAR击键与消息的关系 击键方式消息次序wParam参数按下“A”键然后释放WM_KEYDOWN虚拟键AWM_CHARA的ASCII码WM_KEYUP虚拟键A先按Shift键,再按A键WM_KEYDOWN虚拟键VK_SHIFT

25、然后释放A键,最后释放WM_KEYDOWN虚拟键AShift键WM_CHARA的ASCII码WM_KEYUP虚拟键AWM_KEYUP虚拟键VK_SHIFT按下A键持续一端时间WM_KEYDOWN虚拟键AWM_CHARA的ASCII码WM_KEYDOWN虚拟键AWM_CHARA的ASCII码WM_KEYDOWN虚拟键AWM_CHARA的ASCII码WM_KEYUP虚拟键A区别:WM_KEYDOWN:可以识别键盘上的大多数按键,但不能区分大小写字母,以及数字和特殊符号,只能大写字母和数字WM_CHAR:只能识别键盘上的字符键和部分控制键,但可以区分大小写字母和shift+数字键例:输出可移动的字符

26、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、在OnKeyDown函数中添加代码:switch(nChar)case VK_LEFT:x-;break;case VK_

27、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_CAPITALCapsLock键VK_SUBTRACT减号键VK_ESCAPEEsc键VK_F1VK_F24F1键

28、到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()键定时器消息WM_TIMERWindows定时器是一种周期性的消息产生装置,它会每隔一段指定时间发送一次定时消息WM_TIMER。它是一个很重要的系统消息,当系统所设置的时间到达以后,系统就会自动发送该消息。与该消息联系密切的

29、一个函数是SetTimer(),它设置一个系统时钟,当设置的时间到时,系统产生WM_TIMER消息。通过对SetTimer()函数的参数进行设置,告诉用户哪一个时钟的时间到了,因此,可以将一些周期性的工作放入WM_TIMER的消息处理函数 定时器的使用一般遵循下列步骤:SetTimer()函数设置定时器2.超载OnTimer()函数,完成用户希望的操作KillTimer(). 例:利用定时器消息实现一个滚动的字幕,即程序运行后,在屏幕的中央显示一行文本“我爱VC+编程”,该字幕从屏幕循环地从屏幕的左边滚动到右边,当字母超出屏幕右边界时,字母又从屏幕的左边出现。在windows中,图形的显示:默

30、认情况下,窗口原点和视口原点都在左上角(0,0)位置默认情况下,窗口和视口完全一致,单位为像素4、映射模式和滚动视图图形绘制函数窗口视口xy(100,100)xy(100,100)改变窗口和视口原点函数:SetWindowOrg(int x,int y)SetViewportOrg (int x,int y)无论窗口原点和视口原点怎么变化,窗口原点总是映射到视口原点上注:绘制函数中的坐标点为窗口中的坐标例如:观察运行结果pDC-Rectangle(CRect(100,100,300,300);添加代码: pDC-SetWindowOrg(CPoint(100,100); pDC-Rectang

31、le(CRect(100,100,300,300);添加代码:pDC-SetViewportOrg(100,100);pDC-SelectStockObject(GRAY_BRUSH);pDC-Rectangle(CRect(100,100,300,300);坐标系:绘图时需要一个参照坐标系,以确定图形或文本的输出位置 例如:pDC-(100,100,”hello world!”)图形设备接口支持两种坐标系统: 逻辑坐标 窗口 设备坐标 视口注:通常,文本或图形输出函数使用的是逻辑坐标,而在客户区点击或移动鼠标所得到的是设备坐标引例:pDC-Rectangle(0,0,200,200)函数绘制

32、了200200矩形,默认单位为像素,当显示到屏幕上时,根据显示器的分辨率设置不同,其大小也是不同的问题:如果要显示2cm*2cm的举行,而与显示器的分辨率无关,则需要用到映射模式。映射模式:简单的说就是定义逻辑坐标的逻辑单位大小和增长方向映射方式逻辑单位方向MM_TEXT一个像素,默认MM_LOENGLISH0.01英寸MM_HIENGLISH0.001英寸MM_LOMETRIC0.1mmMM_HIMETRIC0.01mmMM_ISOTROPIC系统确定X,y可调,1:1MM_ANISOTROPIC系统确定 X,y可调,比例任意注:窗口的单位有多种:像素、英寸、毫米视口只有一种:像素改变映射模

33、式的函数: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的缩放

34、因子视口的y大小 / 窗口的y大小例、画一个撑满窗口的椭圆CRect rectClient;GetClientRect(rectClient);pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowExt(CSize(1000,1000);pDC-);pDC-SetViewportOrg(rectClient.right/2, rectClient.bottom/2);pDC-Ellipse(-500,-500,500,500);GetClientRect:获取客户区域的矩形尺寸(即窗口中的白色部分)SetWindowExt:设置窗口的范围,将第二个参数取负后

35、可得到正向朝上的y轴SetViewportExt:设置视口的范围,此例中将其设置为和客户区域大小相同SetViewportOrg:设置视口原点,此例中设置为客户区的中心点为视口的原点运行当窗口的大小改变时,椭圆的大小也随之改变,并始终撑满整个窗口将上述代码中:pDC-SetWindowExt(CSize(1000,1000);修改为:pDC-SetWindowExt(CSize(800,800);由上例得到的启发:假如制作一个人走近城门的动画,越走近城门越大,只需将窗口的尺寸逐渐变小即可,而不需要设置一系列城门逐渐放大的图片将上述代码中:pDC-SetViewportOrg(rectClien

36、t.right/2, rectClient.bottom/2);pDC-Ellipse(-500,-500,500,500);修改为: pDC-, ); pDC-Ellipse(0,0,1000,1000);滚动视图例1、新建MFC工程文件名为Exam2 SDI 选择view基类为CScrollView2、运行:默认情况无滚动条,需要进行设置3、打开文件新增的函数:OnInitialUpdate,只有选择CScrollView作为基类才有此函数CSize:尺寸类,一个横向,一个纵向sizeTotal. cxsizeTotal. cy = = 100;通过此语句将横向和纵向尺寸都设置为100,因

37、此在此时运行程序不会出现滚动条4、将下述语句删除,重新设置CSize sizeTotal; = = 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);SetScrollSizes(MM_HIMETRIC,SizeTotal,SizePage,SizeLine);注:Siz

38、ePage为设置页的对象,除以2,即表示将窗口分为两页注:SizeLine为设置行的对象,除以50,即表示设置为50行6、运行7、打开文件申明变量CRect m_rectEllipse;int m_nColor;8、在构造函数中对变量进行初始化 m_rectEllipse=CRect(0,0,4000,-4000);注:产生44cm的矩形m_nColor=GRAY_BRUSH;9、在OnDraw函数中添加代码:pDC-SelectStockObject(GRAY_BRUSH);pDC-Ellipse(m_rectEllipse);例:绘制一个椭圆,使用鼠标拖动使椭圆位置可以改变分析:拖动椭圆时

39、,实际是将现有椭圆擦出,在移动到的位置再绘制相同的椭圆椭圆位于矩形内,因此确定了左上角和右下角坐标,则长和宽就可确定,在拖动鼠标的过程中椭圆的长宽不变在开始移动时,鼠标按下的位置可以确定在椭圆移动的过程中,鼠标的位置相对于左上角的坐标不变,即鼠标在椭圆内的位置确定因此,涉及到的消息:OnLButtonDownOnMouseMoveOnLButtonUp配合OnDraw函数步骤一新建工程drag,选择CScrollView类打开文件,定义私有变量Const CSize m_sizeellipse;/在移动的过程中椭圆的大小不能改变,因此要定义为常量CPoint m_pointtopleft;/左

40、上角坐标CSize m_sizeoffset;/左上角相对鼠标按下位置的偏移量BOOL m_bcapture;/判断是否需要捕获鼠标消息步骤二打开文件进行消息映射,ClassWizardView类WM_LBUTTONDOWNWM_LBUTTONUPWM_MOUSEMOVE点击OK或Edit,添加消息处理函数/所有的消息处理函数都以ON开头步骤三制作滚动视图找到OninitalUpdate函数,将其中的内容删除或注释掉添加代码:CSize SizeTotal(10000,30000);CSize SizePage(SizeTotal.cx/2,SizeTotal.cy/2);CSize Size

41、Line(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

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

43、icRgnIndirect(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);说明CPoint pointTopLeft(m_pointtopleft);相当于:CPoint pointTopLeft;pointTop

44、Left=m_pointtopleft;总结:鼠标按下时的工作:获取椭圆精确坐标判断鼠标是否在椭圆内获取位移步骤六在OnLButtonUP函数内添加代码:If(m_bcapture)ReleaseCapture();M_bcapture=FALSE;步骤七(关键部分)在OnMouseMove函数中添加代码:If(m_bcapture)CClientDC dc(this);OnPrepareDC(&dc);CRect rectold(m_pointtopleft,m_sizeoffset);/定义变量保存原始矩形的位置dc.LPtoDP(&rectold);InvalidateRect(rect

45、old,TRUE)/矩形重绘,TRUE使矩形重绘后即删除,不再屏幕停留/另一种方法是用白色画笔再画一次m_pointtopleft=point-m_sizeoffset;dc.DPtoLP(&m_pointtopleft);/绘制矩形是在逻辑坐标中CRect rectNew(m_pointtopleft,m_sizeellipse);dc.LPtoDP(&rectNew);InvalidateRect(rectNew,TRUE);/因为不断移动,所以只绘制一下,并不停留步骤八在OnDraw函数中添加代码:CBrush brush(HS_DIAGCROSS,RGB(255,0,0);CPoint

46、 point(0,0);pDC-SetBrushOrg(point);/若自己定义刷子最好添加上述两句,系统自动矫正原点,保证格子不乱pDC-SelectObject(&brush);pDC-Ellipse(CRect(m_pointtopleft,m_sizeellipse));5 MFC资源菜单对话框位图工具栏菜单类型:主菜单例如:File、Edit等弹出菜单选择主菜单或一个菜单项时弹出的子菜单快捷菜单右击某个界面对象时,会弹出快捷菜单例:创建如下菜单,控制字符串的显示ID_OPER_REDID_OPER_GREENID_OPER_BLUEID_OPER_SHOWHello World!注

47、: 定义热键:在字符前加& 定义快捷键:Ctrl+字符 t:表示快捷键居右显示1、定义变量COLORREF m_color; /保存当前颜色值CString m_str; /保存输出字符串BOOL m_show; /判断是否显示2、变量初始化 m_color=RGB(0,0,0);m_str=hello world;m_show=FALSE;3、通过ClassWizard为各菜单项添加消息映射4、在消息映射函数中添加代码:void CResView:OnOperShow() if(m_show=TRUE)m_show=FALSE;elsem_show=TRUE;Invalidate();voi

48、d CResView:OnOperBlue() m_color=RGB(0,0,255);Invalidate();void CResView:OnOperGreen() m_color=RGB(0,255,0);Invalidate();void CResView:OnOperRed() m_color=RGB(255,0,0);Invalidate();void CResView:OnDraw(CDC* pDC)CResDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if(m_show)pDC-SetTextColor(m_color);pDC-T

49、extOut(10,10,m_str);5、当点击显示时,有两种状态:显示或不显示,可以为此菜单项增加一个状态设置,选中时前面出现对勾,否则没有。添加代码:void CResView:OnUpdateOperShow(CCmdUI* pCmdUI) pCmdUI-SetCheck(m_show);SetRadio:显示为点 对话框分类:模态(Model)对话框:较常用,打开模态对话框后,直到关闭之前,用户不能转向其他用户界面,例如保存文件对话框。非模态(Modeless)对话框:与模态对话框相反,例如word中的查找和替换对话框例:完善上例中的程序,添加字体菜单,点击字体菜单后弹出对话框设置字

50、体大小1、插入对话框资源方法:使用菜单【Insert|Resource】打开Insert Resource对话框,选中Dialog后单击New按钮。使用项目的ResourceView,找到Dialog资源,右击后选择Insert Dialog。按要求设置对话框编辑框ID:ID_EDIT_FONTSIZE按钮ID:IDOK测试对话框运行效果的方法:选择菜单项Layout |Test。单击布局工具栏上的Test按钮。按快捷键Ctrl+T。2、为对话框资源创建新类(ClassWizard)CFontSizeDlg新增对话框类新增对话框文件3、为控件创建成员变量可以为对话框上的每一个控件增加一个或多个

51、成员变量来操作控件点击ClassWizardMember Variables(用来添加或删除和对话框控件相关联的成员变量)分析:要在编辑框IDC_EDIT_FONTSIZE中输入一个值作为字号值,因此,需要为编辑框控件添加一个成员变量m_size对应输入的值4、添加字号菜单ID_OPER_FONTSIZE,并建立消息映射,添加代码:int m_fontsize; /存储字号fontsize=100; /初始字号大小void CResView:OnOperFontsize() CFontSizeDlg dlg;()=IDOK) /显示对话框m_fontsize=; /获取输入值Invalidat

52、e(); 5、在OnDraw函数中添加代码: CFont f;f.CreatePointFont(m_fontsize,hello); /自定义字体名为hello pDC-SelectObject(&f);6、在View类的源文件中添加头文件包含: #include “”通用对话框 文件对话框 用CFileDialog类提供的通用文件对话框,实现Windows标准的【打开】和【另存为】功能。 CFileDialog(BOOL bOpenFileDialog, /值为TRUE,为打开对话框;FALSE为“另存为”对话框LPCTSTR lpszDefExt=NULL, /默认的文件扩展名LPCTS

53、TR lpszFileName=NULL, /出现在文件名编辑框中的初始文件名DWORD dwFlags=OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,LPCTSTR lpszFilter=NULL,CWnd *pParentWnd=NULL /文件过滤器, 用于确定显示在文件列表中的文件类型)例如:CFileDialog dlg(TRUE,bmp,*.bmp, OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT,文本文件(*.txt)|*.txt|Word文件(*.doc)|*.doc|);调用成员函数DoModal( ),将对话框显示

54、在屏幕上,并让用户从中选择文件。如果DoModal( )返回的是IDOK,那么调用下表中的成员函数获取文件信息。颜色对话框 CColorDialog类提供了可以选择颜色的对话框,使得用户可以从颜色列表中选择要用的颜色。对该类的使用可按下列步骤进行:(1) 在视图类相应位置构造CColorDialog对象。(2) 设置或修改成员变量m_cc来初始化对话框。m_cc的结构类型为COLORREF。(3) 调用成员函数DoModal()来显示对话框并让用户从中选择颜色。(4) 如果DoModal()返回的是IDOK,那么用户所做的颜色选择将保存在m_cc中。通过使用该类的成员函数GetColor()即

55、可得到选择颜色的RGB值。字体对话框 CFontDialog类封装了标准的【字体】对话框,使得用户可以从系统安装的字体列表中选择要用的字体。 CFontDialog类的使用步骤与CColorDialog的使用过程是一样的,只是m_cf的结构类型为LOGFONT,m_cf结构用于在调用domodal函数之前对字体对话框中的选项进行初始化。 在选择了字体后,可通过下表中的成员函数获取所选择的字体信息。例:1、新建菜单项ID_FONT,添加消息响应函数2、定义变量:COLORREF m_color;CFont font;3、变量初始化 m_color=RGB(255,0,0);4、在字体菜单处理函数

56、中添加代码:void CResView:OnFont() CFontDialog dlg; =RGB(255,0,0); ()=IDOK) LOGFONT lf;dlg.GetCurrentFont(&lf);font.CreateFontIndirect(&lf);m_color=(); Invalidate();5、在OnDraw函数中添加代码CFont *pold=pDC-SelectObject(&font);pDC-SetTextColor(m_color);pDC-TextOut(10,10,hello);pDC-SelectObject(pold);();位图位图是一种数字化的图

57、形表示形式,基本数据结构是像素,一个像素表示一个离散点的颜色值。常见位图有2色、4色、16色、256色、16位、24位。其中VC 6的资源编辑器只支持256色以下(包括256色)的位图的编辑,而最新的VC7已经支持24位真彩位图的编辑了。保存在文件中的位图可以看作是设备无关的,文件本身的数据用来描述位图的内容。 例:在上例中插入一副图片在OnDraw函数中添加代码:CDC dcMem; / 创建内存缓冲DCdcMem.CreateCompatibleDC(pDC);CBitmap bmp1; / 加载256位图bmp1.LoadBitmap(IDB_BITMAP1);BITMAP bmIf;b

58、mp1.GetBitmap(&bmIf); / 获得位图的信息CBitmap* pOldBm = dcMem.SelectObject(&bmp1);/ 选择位图到内存缓冲设备中pDC-BitBlt(0,0,bmIf.bmWidth,bmIf.bmHeight,&dcMem,0,0,SRCCOPY); / 绘制到屏幕缩放显示图片,将BitBlt函数改为:pDC-StretchBlt(0,0,200,200,&dcMem,0,0, bmIf.bmWidth,bmIf.bmHeight,SRCCOPY);绘制后显示尺寸图片起始点工具栏通常工具栏中放置的按钮为常用命令的快捷方式,在菜单中都可以找到对

59、应项,因此绘制工具栏按钮后,只需要将ID设置为和相应菜单项相同即可(ID设置方式:在工具栏对应按钮上双击)例:改进上述程序,在工具栏添加颜色设置的快速打开方式绘制图标设置ID: ID_OPER_RED ID_OPER_GREEN ID_OPER_BLUE基础部分综合实例1使用菜单栏创建绘图程序步骤一FilenewWorkSpaceMFC AppWizard(exe)文件名:Draw类型:单文档步骤二1、在中定义变量:private:int m_DrawType; /绘制类型CPoint m_ptOrigin; /起点坐标int m_penWidth; /线宽int m_lineStyle;/线

60、型2、在的构造函数中初始化:CDrawView:CDrawView() m_DrawType=0;m_ptOrigin=0;m_penWidth=1;m_lineStyle=0;步骤三1、创建菜单资源ResourceView Menu 编辑菜单项CaptionID:子菜单,唯一的标识相应的菜单项菜单项IDCaptionPrompt点ID_DRAW_POINT点(&P)绘制一个点线ID_DRAW_LINE线(&L)绘制一条线矩形ID_DRAW_RECT矩形(&R)绘制一个矩形椭圆ID_DRAW_ELLIPSE椭圆(&E)绘制一个椭圆填充ID_DRAW_FILL填充(&F)填充一个闭合区域手工绘图

温馨提示

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

评论

0/150

提交评论