




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 主要学习内容: 文本输出 绘图 用户界面编程 位图(图像)应用 动态链接库 如果可能:vc与matlab混合编程第一章:VC+编程基础一、初识vc+ 1、第一个vc+程序 (1)vc+6.0集成开发环境介绍(IDE) 标题栏 菜单栏 工具栏 工作区窗口 源代码窗口 输出窗口 状态栏 (2)用框架文件编辑器创建应用程序框架 框架文件编辑器 MFC(Microsoft Foundation Classes)AppWizard 过程。 (3)程序介绍 平台可视,程序所包含的编辑器、浏览器、编译器、连接器、调试器等全部可视 资源集成,诸多最基本的Resource如菜单等不需编程直接可进行编辑 方便的
2、类创建和管理,封装了窗口函数、消息、控件、菜单、对话框、图形设置接口等。 (4)四大类介绍CMainFrame是CApp类的主程序窗口,也就是程序的一个框架。 CApp中如无特殊的要求不用加什么代码CDocument一般和CView一起使用,这样的程序叫文档/视图结构。 CDocument中加的代码主要是和你的文档内容有关的,如文档中信息(对象)等,需要处理的一般有文档内容的编辑、删除、添加、序列化(读写文件)等方面的代码。 CView的工作就是把你的CDocument中的内容显示在文档上,主要处理的是显示方面的工作。 2、第一个程序编译、链接和执行情况。 3、在程序中创建接口对象(用户如何控
3、制程序,比如用菜单、对话框等) 4、添加消息处理代码 MessageBox(“hello, how are you!”) 第一个程序扩展: -消息机制和消息的引入 MessageBox(hello, how are you 2!); 添加鼠标按下的消息响应: OnLButtonDown程序开始捕获消息派发消息处理消息程序结束消息源1消息源2消息源n退出消息?NY基于事件驱动的程序模型二、二、vc+的工作机制简介的工作机制简介1、 Windows消息机制消息机制(1)消息来源)消息来源 Windows应用程序的消息来源有以下四种: (1)输入消息:包括键盘和鼠标的输入。 (2)控制消息:用来与W
4、indows的控制对象,如列表框、按钮、检查框等进行双向通信。 (3)系统消息:对程序化的事件或系统时钟中断作出反应。 (4)用户消息:这是程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。 VC+中存在几种系统定义的消息分类,不同的前缀符号经常用于识别不同的消息类,系统定义的消息宏前缀如下:l BM:按钮控制消息;l CB:组合框控制消息;l DM:默认下压式按钮控制消息;l EM:编辑控制消息;l LB:列表框控制消息;l SBM:滚动条控制消息;l WM:窗口控制消息。1.2 理解理解Windows消息机制消息机制1、消息的组成:一个消息由一个消息名称(UINT)
5、,和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。2、谁将收到消息:一个消息必须由一个窗口接收一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。 3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种
6、消息的处理(有消息处理机制)。 例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。 4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。1.2 理解理解Windows消息机制消息机制 什么是消息机制: 系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,
7、根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。 1.2 理解理解Windows消息机制消息机制 每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。下面的伪代码演示了消息循环的用法: while(1) id=getMessage(.); if(id = quit) break; translateMessage(.); 当该程序没有消息通知时getMessage就不会返回,也就不会占用系统的CPU时间。 开始执行初始化从消息队列取得一个消息终止执行当
8、前消息是否“退出”消息?是否本程序要处理的消息?默认处理处理消息YNYNWindows程序和消息的基本流程2消息的数据结构消息的数据结构消息的数据结构MSG的定义如下:typedef struct tagMSGHWND hwnd;/用以检索消息的窗口句柄,如为NULL,/则可以检索所有驻留在消息队列中的消息UINT message;/消息值WPARAM wParam;/包含有关消息的附加信息LPARAM lParam;/随不同的消息而有所不同DWORD time;/消息送到队列的时间POINT pt;/消息发送时,屏幕光标的位置MSG;其中:typedef struct tagPOINTLON
9、G x,y;POINT; 3消息队列消息队列支持队列特征的消息驱动模型如图所示。用户交互内核USER窗口1窗口函数WndProc消息队列窗口2窗口函数WndProc消息队列图 支持队列特征的消息驱动模型 4常用消息常用消息Windows程序常用的消息有:WM_LBUTTONDOWN:单击鼠标左键时产生的消息;WM_LBUTTONUP:放开鼠标左键时产生的消息;WM_RBUTTONDOWN:单击鼠标右键时产生的消息;WM_RBUTTONUP:放开鼠标右键时产生的消息;WM_LBUTTONDBLCLK:双击鼠标左键时产生的消息;WM_RBUTTONDBLCLK:双击鼠标右键时产生的消息;WM_KE
10、YDOWN:按下一个非系统键时产生的消息,附加信息参数wParam为按下键的虚拟键码,虚拟键码用以标识按下或释放的键,lParam记录按键的重复次数、扫描码等状态信息; WM_CHAR:按下一个非系统键时产生的消息,附加信息参数wParam为按下键的ASCII码,lParam的意思同上; WM_CREATE:CreateWindows函数产生的消息; WM_CLOSE:关闭窗口时产生的消息; WM_DESTROY:消除窗口时由DestroyWindows()发出的消息; WM_QUIT:退出应用程序时由PostQuitMessage()发出的消息; WM_PAINT:Windows系统需要重绘
11、时产生的消息。对象与句柄对象与句柄常见Windows对象的句柄如下所示:Windows对象相关句柄设备环境HDC 窗口HWND菜单HMENU光标HCURSOR画笔HPEN画刷HBRUSH字体HFONT图标HICON位图HBITMAP调色板HPALETTE文件HFILE区域HRGN加速键表HACCEL 文本、绘图等的函数为OnDraw pDC-TextOut(20,10,This is the first VC programe!); 属性的改变 pDC-SetTextColor(RGB(255,0,0); /pDC-SetBkMode(TRANSPARENT);pDC-SetBkColor(R
12、GB(0,0,255);第二个例子-类、对象的引入 CFont fn1; CFont *pfn1; fn1.CreatePointFont(60,Arial,pDC); pfn1=pDC-SelectObject(&fn1); pDC-SetTextColor(RGB(0,125,0); pDC-TextOut(20,300,1234567890); pDC-SelectObject(pfn1);如何改变字体? -引入类、对象第二章 MFC编程基础1 MFC类库简介类库简介2 使用使用AppWizard开发开发MFC应用程序应用程序1 MFC类库简介 下面是MFC类库的类定义文件afxwin
13、.h中的类说明部分源代码,从中我们可以了解MFC类库中都有哪些类以及它们的层次关系。代码如下:class CSize;class CPoint;class CRect;/CObject/CException/CSimpleExceptionclass CResourceException; / Win resource failure exceptionclass CUserException; / Message Box alert and stop operationclass CGdiObject; / CDC drawing toolclass CPen; / a pen / HPEN
14、 wrapperclass CBrush; / a brush / HBRUSH wrapperclass CFont; / a font / HFONT wrapperclass CBitmap; / a bitmap / HBITMAP wrapperclass CPalette; / a palette / HPALLETE wrapperclass CRgn; / a region / HRGN wrapperclass CDC; / a Display Context / HDC wrapperclass CClientDC; / CDC for client of windowcl
15、ass CWindowDC; / CDC for entire windowclass CPaintDC; / embeddable BeginPaint struct helperclass CMenu; / a menu / HMENU wrapperclass CCmdTarget; / a target for user commandsclass CWnd; / a window / HWND wrapper class CDialog; / a dialog/ standard windows controls class CStatic; / Static controlclas
16、s CButton; / Button control class CListBox; / ListBox controlclass CCheckListBox; / special listbox with checksclass CComboBox; / ComboBox controlclass CEdit; / Edit controlclass CScrollBar; / ScrollBar control/ frame windowsclass CFrameWnd; / standard SDI frameclass CMDIFrameWnd; / standard MDI fra
17、meclass CMDIChildWnd; / standard MDI childclass CMiniFrameWnd; / half-height caption frame wnd/ views on a documentclass CView; / a view on a documentclass CScrollView; / a scrolling viewclass CWinThread; / thread base classclass CWinApp; / application base classclass CDocTemplate; / template for do
18、cument creationclass CSingleDocTemplate; / SDI supportclass CMultiDocTemplate; / MDI supportclass CDocument; / main document abstraction/ Helper classesclass CCmdUI; / Menu/button enablingclass CDataExchange; / Data exchange and validation contextc l a s s C C o m m a n d L i n e I n f o ; /CommandL
19、ine parsing helperclass CDocManager; / CDocTemplate manager object下面按功能对MFC库中的常用类做一简要介绍。1根类根类CObject Microsoft基本类库中的大多数类都是由CObject类派生而来的。CObject对所有由它派生出的类提供了有用的基本服务。2MFC应用结构类应用结构类MFC应用结构类用于构造一个应用的框架,对大多数应用提供了通用功能。我们可以在框架中填写对于应用特定的功能。AppWizard可以产生几种类型的应用,所有这些都以不同的方式使用应用框架。1) 应用程序和线程支持类2) 命令例程类3) 文档类4
20、) 文档模板类3窗口、对话框和控件类窗口、对话框和控件类1) CWnd类2) 框架窗口类3) 对话框类4) 视图类5) 控件类6) 控件条类4菜单类菜单类5绘图和打印类绘图和打印类6简单的数据类型类简单的数据类型类7数组、列表和映射类数组、列表和映射类8文件和数据库类文件和数据库类1) 文件文件I/O类类2) DAO类类3) ODBC类类9Internet和网络类和网络类Internet和网络类允许与其他使用ISAPI的计算机或一个Windows Socket交换信息。10OLE类类11调试和异常类调试和异常类 2、使用MFC进行基础编程 (1)、文本输出 (2)、绘图 (3)、用户界面设计
21、(4)位图(图像)使用 (5)动态链接库第三章第三章 文本输出文本输出 3.1 和和GUI(Graphical User Interface)有关有关的各种对象的各种对象在Windows中有各种GUI对象(字体、画笔、刷子等等),当你在进行绘图就需要利用这些对象。在vc+中GUI被抽象成为设备环境DC(Device Context),在文本输出、绘图等时常使用。 (1) 自带设备环境对象输出 文本、绘图等的函数为OnDraw 自带设备环境 自带画笔等对象 直接使用 pDC-TextOut(20,10,This is the first VC programe!); 属性的改变pDC-SetTe
22、xtColor(RGB(255,0,0); /pDC-SetBkMode(TRANSPARENT);pDC-SetBkColor(RGB(0,0,255); (2)创建新的设备环境输出 在Windows中使用GUI对象必须遵守一定的规则。 首先需要创建一个合法的对象,不同的对象创建方法不同。 然后需要将该GUI对象选入DC中,同时保存DC中原来的GUI对象。如果选入一个非法的对象将会引起异常。 在使用完后应该恢复原来的对象,这一点特别重要,如果保存一个临时对象在DC中,而在临时对象被销毁后可能引起异常。 注意:每一个对象在重新创建前必须销毁对象的创建CFont fn;CFont *pfn;fn
23、.CreatePointFont(Da_ziti,ziti,pDC);pfn=pDC-SelectObject(&fn);pDC-SetTextColor(r_color);pDC-TextOut(x_zuobiao,y_zuobiao,1234567890);pDC-SelectObject(pfn); 函数的添加 CFont fn1; CFont *pfn1; fn1.CreatePointFont(60,Arial,pDC); pfn1=pDC-SelectObject(&fn1); pDC-SetTextColor(RGB(0,125,0); pDC-TextOut(20,300,12
24、34567890); pDC-SelectObject(pfn1); 3.2 通过设计函数使通过设计函数使OnDraw()精炼()精炼 (1)设计函数text1() void CT1View:text1() /CDC *pDC; / pDC=GetDC(); /先不用这两句看效果CFont fn1;CFont *pfn1;fn1.CreatePointFont(600,Arial,pDC);pfn1=pDC-SelectObject(&fn1);pDC-SetTextColor(RGB(0,125,0);pDC-TextOut(20,300,9876000);pDC-SelectObject(
25、pfn1); 1.先通过(点击)类的相关向导(点击鼠标右键)添加。 3.2 通过设计函数使通过设计函数使OnDraw()精炼()精炼2.通过手动添加 (1) 在*View.cpp文件的相应处(习惯为最后)添加Text1(), (2) 函数设计完“戴帽” (3) 在*View.h注册 变量的添加与此类似,比较两种方法的优缺点。 通过界面快速寻找相应的函数? 如何知道一个类包含的函数、变量?(定义一个对象就可见) (2)设计函数可以改变参量的函数 text2(CDC *pDC,int x_zuobiao,int y_zuobiao,int Da_ziti, LPCTSTR ziti, COLORR
26、EF r_color,CString str) CFont fn;CFont *pfn;fn.CreatePointFont(Da_ziti,ziti,pDC);pfn=pDC-SelectObject(&fn);pDC-SetTextColor(r_color);pDC-TextOut(x_zuobiao,y_zuobiao,str);pDC-SelectObject(pfn); 3.3 创建新的字体创建新的字体 处理字体的最简单的方法是使用GDI的常备字体,如要自己设置显示字体的风格需要创建一个CFont的对象,具体步骤如下: 定义定义CFont对象对象 调用调用CreateFont()函
27、数创建字体函数创建字体 将创建的字体对象选入将创建的字体对象选入DC,并保存前一个,并保存前一个被选入被选入DC的字体对象的字体对象BOOL CreateFont( int nHeight, /字体所需高度,为0使用默认值 int nWidth, /字符的宽度值,为0表示设备的纵横比匹配可用字体的纵横比 int nEscapement, /字体转义,指定转义矢量和x轴的夹角 int nOrientation, /字体方向,指定字符基线和x轴的夹角(以0.1度为单位) int nWeight, /字体厚度 BYTE bItalic,/是否斜体,布尔值 BYTE bUnderline, /是否带有
28、下划线,布尔值 BYTE cStrikeOut, /是否带有删除线,布尔值 BYTE nCharSet, /使用的字符集 BYTE nOutPrecision, /输出精度 BYTE nClipPrecision, /剪取精度 BYTE nQuality, /输出质量 BYTE nPitchAndFamily, /字符间距和字族 LPCTSTR lpszFacename /字体的字样名称);参数:nWeight 字体厚度常用参数有:FW_NORMAL、FW_REGULAR和FW_BOLD nCharSet 字符集常用参数有:ANSI_SHARSET、DEFAULT_CHARSET、SYBOL_
29、CHARSET、SHIFTJIS_CHARSET、OEM_CHARSET等nOutPrecision 输出精确度定义。输出与请求使用的字体的高度、宽度、字符走向、转义和字间距的匹配程度,常用参数有:OUT_CHARACTER_PRECIS、 OUT_STRING_PRECIS、OUT_DEFAULT_PRECIS、OUT_DEVICE_PRECIS等等。nClipPrecision 剪取精度定义。如何剪取部分位于剪取区域之外的字符,常用参数有:CLIP_CHARACTER_PRECIS、 CLIP_DEFAULT_PRECIS、CLIP_MASK。nQuality 字体的输出质量定义。GDI怎
30、样才能将逻辑字体属性与实际物理字体匹配起来,常用参数值:DEFAULT_QUALITY、DRAFT_QUALITY和PROOF_QUALITY。 nPitchAndFamily 通常是字符间距与字族的组合值,如:DEFAULT_PITCH|FF_DONTCARE void CT1View:text3(CDC *pDC) CFont NewFont;NewFont.CreateFont (65,65,0,0,FW_DONTCARE, true,false,false,DEFAULT_CHARSET, OUT_CHARACTER_PRECIS, CLIP_CHARACTER_PRECIS, DEF
31、AULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, 黑体);CFont *pOldFont;pOldFont=pDC-SelectObject (&NewFont);pDC-TextOut(10,10, 自创的倾斜黑体字); pDC-SelectObject(pOldFont); 3.4 格式化文本格式化文本 Windows系统不参与窗口客户区的管理,这就意味着在客户区内输出文本,应用程序必须管理换行,后继字符的位置等输出格式。由于文本字符串的间隔不仅取决于由用户指定的字体,而且取决于目标设备的分辨率,因此在绘制任何文本之前,需要计算文本坐标。 函数说明函数说明
32、GetTextExtent当选用当前嵌入DC中的字体绘图时,获得给定字符串将占据的空间宽度和高度GetTextMetrics为当前选入DC的字体获取类型为TEXTMETRIC的数据,此数据结构中包含基本的字体测量信息 使用GetTextExtent()函数可以获得所选字体中的字符串的宽度和高度,函数的格式如下: CSize GetTextExtent(LPCTSTR lpszString, int nCount) 其中:lpszString是字符串的指针,nCount是所包括的字符数。返回值CSize是包含两个成员的结构:cx是字符串的宽度,cy是字符串的高度。 void CT1View:te
33、xt4(CDC *pDC) int x,y;x=850; y=100;CString str1=格式化文本一; CString str2=格式化文本二;text2(pDC,x,y,200,Arial,RGB(0,0,126),str1); /取得第一个字符串的像素长度 CSize strSize=pDC-GetTextExtent (str1,str1.GetLength (); /设定第二个字符串的输出位置X坐标x+=strSize.cx;text2(pDC,x,y,400,Arial,RGB(255,0,1),str2); 确定换行时文本坐标确定换行时文本坐标GetTextMetric()
34、函数用来计算涉及确定两行文本之间的间隔。当然你可以使用GetTextExtent()函数的返回值中的字符串的高度来决定两行文本之间的间隔,但这种方式并不精确。文本中行之间的间隔包括两部分:字符单元高度和外部行距大小。这两部分内容都包含在TEXTMETRIC数据结构中。调用GetTextMetric()函数可以获得当前字体的TEXTMETRIC结构的内容,并计算文本行间隔方式如下:注:系统内字体行间距无法控制,自创字体可以。注:系统内字体行间距无法控制,自创字体可以。TEXTMETRIC tm;pDC-GetTextMetrics(&tm);int LineHeight=tm.tmHeight+
35、tm.tmExternalLeading ; 数据类型TEXTMETRIC的定义和图示如下: typedef struct tagTEXTMETRIC /* tm */ int tmHeight; int tmAscent; int tmDescent; int tmInternalLeading; int tmExternalLeading; int tmAveCharWidth; int tmMaxCharWidth; int tmWeight; BYTE tmItalic; BYTE tmUnderlined; BYTE tmStruckOut; BYTE tmFirstChar; BY
36、TE tmLastChar; BYTE tmDefaultChar; BYTE tmBreakChar; BYTE tmPitchAndFamily; BYTE tmCharSet; int tmOverhang; int tmDigitizedAspectX; int tmDigitizedAspectY; TEXTMETRIC; void CT1View:text5(CDC *pDC) CString outstr4;outstr0=第一个紫红色的使用系统字体的文本串;outstr1=第二个红色黑体文本串;outstr2=第三个蓝色文本串;outstr3=最后一个大号字,加下划线的斜体文本
37、串;int x=0;int y=0;/输出第一行 pDC-SetTextColor (RGB(255,0,255); pDC-TextOut (x,y,outstr0);/输出第二行 TEXTMETRIC tm; pDC-GetTextMetrics (&tm); y=y+tm.tmHeight+100*tm.tmExternalLeading ; CFont NewFont1;NewFont1.CreateFont (30,10,0,0,FW_HEAVY, false,false,false,ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRE
38、CIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, 黑体);CFont *pOldFont;pOldFont=pDC-SelectObject (&NewFont1);pDC-SetTextColor(RGB(255,0,0);pDC-TextOut(x,y,outstr1); /输出第三个文本串 pDC-GetTextMetrics (&tm); pDC-SetTextColor (RGB(0,0,255); CSize strSize=pDC-GetTextExtent (outstr1,outstr1.GetLength (); x+=str
39、Size.cx; pDC-TextOut (x,y,outstr2); / 输出第四个文本串 pDC-GetTextMetrics (&tm); x=0; y=y+tm.tmHeight+60*tm.tmExternalLeading ; CFont NewFont2;NewFont2.CreateFont (30,0,0,0,FW_NORMAL, true,true,false,ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH|FF_DONTCARE, 大号字);pDC-
40、SelectObject (&NewFont2);pDC-SetTextColor(RGB(155,155,155);pDC-TextOut(x,y,outstr3); pDC-SelectObject (pOldFont); pDC-SelectObject (&NewFont2); pDC-SetTextColor(RGB(155,155,155); pDC-TextOut(x,y,outstr3); pDC-SelectObject (pOldFont); 其它格式文本 CDC提供了以下几个函数用于文本输出: 函数说明函数说明 TextOut在屏幕的固定位置用当前设定的颜色、字体、对齐方
41、式输出文本 TabbedTextOut与TextOut的功能相似,唯一差别是可以为支持制表符而定义一组制表站位置DrawText在一个区域中显示并格式化文本ExtTextOut与TextOut的功能相似,但可以使用该函数删去超出矩形的正文,用正文背景填充矩形,调整字符间隔 绘图简单的图形输出简单的图形输出CDC提供了基本的绘图操作函数,如画点,画线,画圆,画矩形,画多边形等等,简单介绍如下:点点pDC-SetPixel(CPoint(200,200),RGB(255,0,0); /在200,200的位置画一个红点线线pDC-MoveTo(0,0); /直线起点的坐标为(0,0)pDC-Line
42、To (100,100); /从起点(0,0)到终点(100,100)画一条直线pDC-MoveTo (0,100);pDC-LineTo (100,0);矩形矩形CRect rect(0,0,100,100); /画一个长100,宽100的矩形pDC-Rectangle(&rect);圆和椭圆圆和椭圆CRect rect(0,0,100,100); /在矩形内画圆pDC-Ellipse(&rect); CRect rect(0,0,50,100); /在矩形内画椭圆 pDC-Ellipse(&rect); 多边形多边形 CPoint poly4; /画一个平行四边形 poly0=CPoint
43、(0,0); poly1=CPoint(50,50); poly2=CPoint(50,100); poly3=CPoint(0,50); pDC-Polygon(poly,4); 其它图形其它图形 CDC:Pie / 画饼图 CDC:Chord /画弦 CDC:FillRect /用指定颜色填充矩形且不画边线 CDC:Draw3DRect /用于绘制名种3D边框 CDC:RoundRect /画圆角矩形 绘图函数的具体的使用方法可以查阅MSDN。库存对象库存对象不管以不管以CDC类指针形式还是以类指针形式还是以CDC子类对象形式获得设备上下对象,子类对象形式获得设备上下对象,系统都默认指定了
44、一组绘图属性系统都默认指定了一组绘图属性库存对象库存对象使用使用SelectStockObject()函数可以直接选择库存对象修改系统默认值函数可以直接选择库存对象修改系统默认值 作一个菜单,并建立客户区 void CT1View:OnMENUClient() CClientDC dc(this); /this 指针将CExam5View赋值给创建的dc对象 CRect rect; GetClientRect(rect);dc.Rectangle(&rect);dc.Ellipse(&rect); 文本输出(三)文本输出(三)1、坐标原点的改变、坐标原点的改变CDC:SetViewportOr
45、g()函数函数例如,下面程序语句段将坐标系的原点移动到客户区中央:例如,下面程序语句段将坐标系的原点移动到客户区中央:CRect rect;GetClientRect(rect);pDC-SetViewportOrg(rect.Width()/2,rect.Height()/2);下面语句为将坐标系原点移到客户区某个坐标点处(像素)下面语句为将坐标系原点移到客户区某个坐标点处(像素)pDC-SetViewportOrg(100,100);2、坐标系模式的改变坐标系模式的改变 pDC- SetMapMode(MM_LOMETRIC); 3、成员变量、乘员函数的添加选择WorkSpace的Clas
46、sView标签,右键单击C*View类。在弹出的快捷菜单中选择Add Member Variable菜单项,增加int型的公有成员变量m_Mode,该变量表示采用的映像模式。在C*View类的构造函数C*View()中将变量m_Mode初始化为MM_TEXT。4、通过对成员变量的控制,改变输出模式4.1添加菜单项控制成员变量菜单1:m_Mode=MM_LOMETRIC; InvalidateRect (NULL,true); /客户区重新绘制or InvalidateRect (NULL,false); /客户区添加绘制菜单2:m_Mode=MM_TEXT; InvalidateRect (N
47、ULL,true);4、通过对成员变量的控制,改变输出模式4.2通过鼠标控制成员变量打开ClassWizard,选择Message Map标签,Class Name 列表中选择C*View,Object IDS列表中选择C*View,Messages列表中选择WM_LBUTTONDOWN,单击“Add Function”按钮,添加鼠标左键双击消息映射。单击“Edit Code”按钮,添加处理代码,用映像模式左键下:m_Mode= MM_ISOTROPIC;InvalidateRect (NULL,true); /客户区重新绘制同理右键下:m_Mode=MM_TEXT;InvalidateRec
48、t (NULL,true);*回忆WM_事件设计用户界面1 菜单和加速键菜单和加速键2 工具栏工具栏3 状态栏状态栏4 对话框栏对话框栏5 ReBar栏栏 6 通用对话框通用对话框习题习题 1 菜单和加速键1.1 使用菜单使用菜单1编辑菜单资源编辑菜单资源编辑由AppWizard自动生成的菜单资源,进行如下操作:(1) 选择项目工作区的ResourceView标签,切换到资源视图。(2) 选择菜单资源类型。(3) 双击菜单资源IDR_MAINFRAME,将弹出菜单编辑窗口。(4) 编辑当前菜单。删除:要删除某个菜单项或弹出菜单,可用鼠标单击该菜单或用上下光标键来回选择,然后按Del键删除。 插
49、入:如果插入新菜单项,可选定窗口中的空白菜单框后按回车。也可以在选择一个已有的菜单项时按Ins键,在该菜单项上方插入一个空白菜单项,然后双击该菜单项,将弹出Properties对话框,如图1所示。 动态添加菜单1、找到某个具体的菜单 CWnd *pParent=GetParent();/得到主框窗口CMenu *pMenu=pParent-GetMenu ();/得到所有菜单 CMenu *SubMenu1=pMenu-GetSubMenu(4);/第5列菜单2、添加 CMenu menu;menu.CreatePopupMenu();SubMenu1AppendMenu(MF_POPUP,(
50、UINT)menu.m_hMenu,add_1);menu.Detach();/Detach();意思是从这个菜单对象中把里面的菜单剥脱出去GetParent()-DrawMenuBar();3、添加后与代码相连 参阅相关资料 CreatePopupMen该函数创建一个下拉式菜单、子菜单或快捷菜单。此菜单最初是空的,但可用函数InsertMenultem来插入或追加菜单项。也可用函数InsertMenu来插入菜单项,用AppendMenu来追加菜单项。函数原型:HMENU CreatePopupMenu(VOID)CMenu:AppendMenu追加新项目到菜单的末尾。BOOL AppendM
51、enu( UINT nFlags, /常数,表示增加菜单项的类型UINT_PTR nIDNewItem , / 新增加项的ID值LPCTSTR lpszNewItem / 指向新菜单项标题的指针 );第一个参数:MF_CHECKED, MF_DISABLED, MF_ENABLED, MF_POPUP,MF_STRINGAppendMenu(MF_STRING,70001,yourMenuName);动态删除菜单1、找到某个具体的菜单 CWnd *pParent=GetParent();/得到主框窗口CMenu *pMenu=pParent-GetMenu ();/得到所有菜单 CMenu *
52、SubMenu1=pMenu-GetSubMenu(4);/第5列菜单2、删除 CMenu menu;int n=GetParent()-GetMenu()-GetSubMenu(4)-GetMenuItemCount();GetParent()-GetMenu()-GetSubMenu(4)-RemoveMenu(n-1,MF_BYPOSITION);menu.Detach();/Detach();意思是从这个菜单对象中把里面的菜单剥脱出去GetParent()-DrawMenuBar(); 3更新命令用户界面消息1) 更新机制MFC应用程序框架引入了更新命令用户界面消息来专门解决这一问题。
53、那么更新命令用户界面是如何工作的呢?对于每一个菜单项,将对应如下两种消息(参看图2): l COMMAND; l UPDATE_COMMAND_UI。2) 用户界面更新机制编程操作如下:(1) 激活ClassWizard,选择Message Map标签。(2) 在Object IDs列表中选择ID_菜单项,在Messages列表中双击UPDATE_ COMMAND_UI条目,弹出Add Member Function对话框,单击OK按钮接收默认函数名。(3) 编辑接口更新成员函数,程序清单如下所示:void C*View:OnUpdate*(CCmdUI* pCmdUI) / TODO: Ad
54、d your command update UI handler code here /点击菜单时给某菜单项前打对号标记pCmdUI-CheckMenuItem(ID_*,MF_CHECKED); or pCmdUI-SetCheck(1); pCmdUI-SetCheck(0);思考:如何使本菜单点击过一定次数(3次)后打对号标记?/点击某菜单时使该菜单项无效,k_xuan为某菜单点击标记 pCmdUI-Enable(false); /直接无效 pCmdUI-Enable(k_xuan0)?false:true);思考:如何控制使其他菜单无效?打对号?1.2 定义加速键定义加速键具体操作如下
55、:(1) 将项目工作区切换到资源视图,选择Accelerator资源类型,双击IDR_MAINFRAME加速键资源,打开加速键编辑窗口。(2) 编辑加速键资源。在ID下拉列表框中选择AFX_ID_*,在Key一栏中输入R,选择Ctrl复选框和VirtKey单选按钮,以完成加速键设置,如图4所示。(3) 关闭加速键编辑窗口。图4 加速键编辑窗口 添加右键菜单1. 在资源中添加菜单。 添加一个PopUP Menu,然后增加几个你需要的子菜单。 给这个菜单取个名字。如 IDR_POPUP2. 在View中添加OnRButtonDown事件处理程序,添加如下代码: CMenu menu; menu.L
56、oadMenu(IDR_MENU1); CMenu *pPopup = menu.GetSubMenu(0); ClientToScreen(&point);/转换客户区坐标到屏幕坐标 pPopup-TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x,point.y, this);如果要增加子菜单的处理程序,可以在某个子菜单上右键点击,选择创建事件处理程序。也可以自己手工创建。举例函数原型:BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, int nReserved
57、, HWND hWnd, CONST RECT* prcRect);hMenu:被显示的快捷菜单的句柄。此句柄可为调用CreatePopupMenu创建的新快捷菜单的句柄,也可以为调用GetSubMenu取得的与一个已存在菜单项相联系的子菜单的句柄。uFlags:一种指定功能选项的位标志。用下列标志位之一来确定函数如何水平放置快捷菜单:TPM_CENTERALIGN:按参数x指定的坐标水平居中放置快捷菜单。TPM_LEFTALIGN:快捷菜单的左边界与由参数X指定的坐标对齐。TPM_RIGHTALIGN:快捷菜单的右边界与由参数X指定的坐标对齐。用下列标志位之一来确定函数如何垂直放置快捷菜单:
58、TPM_BOTTOMALIGN:快捷菜单的下边界与由参数y指定的坐标对齐。TPM_TOPALIGN:快捷菜单的上边界与由参数y指定的坐标对齐。TPM_VCENTERALIGN;按参数y指定的坐标垂直居中放置快捷菜单用下列标志位之一来确定在菜单没有父窗口的情况下用户的选择:TPM_NONOTIFY:单击菜单项时函数不发送通知消息。TPM_RETURNCMD;将用户所选菜单项的标识符返回到返回值里。 (新添加)菜单的功能1、添加int型成员变量m_times、m_ID_old2、添加消息映射函数BOOL CT1View:OnCmdMsg(UINT nID, int nCode, void* pEx
59、tra, AFX_CMDHANDLERINFO* pHandlerInfo) WPARAM MenuId=GetCurrentMessage()-wParam; /获得当前被单击的菜单的ID号if(MenuId=(m_ID_old+m_times) & nCode=CN_COMMAND)/菜单项被单击 /根据strMenuName进行不同处理MessageBox(hello); return CView:OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);3、 建立“添加”菜单 void CT1View:OnMENUAdd() CWnd *pParent=Ge
60、tParent();/得到主框窗口CMenu *pMenu=pParent-GetMenu ();/得到所有菜单 CMenu *SubMenu1=pMenu-GetSubMenu(4);/第5列菜单if(m_times=0)int n=SubMenu1-GetMenuItemCount();m_ID_old=SubMenu1-GetMenuItemID(n-1);m_times+;/*int n=SubMenu1-GetMenuItemCount();CString str;int str1=SubMenu1-GetMenuItemID(n-1);str.Format( %d , str1);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 绿色农业发展合作协议
- 海底两万里观后感思考
- 基于人工噪声的低截获链路实现技术研究
- 高中语文咏史怀古诗词群文阅读教学研究
- 地球和水星日侧磁层物理过程的全球混合模拟研究
- 金融行业投资产品风险揭示协议
- 2025年度厂房出租安全协议书(安全生产责任保险修订版)
- 社交网络在供应链管理中的应用
- 少年儿童经典电影观后感
- 生态农业中土地整治的科技创新及应用
- 高中数学《6.2 排列与组合》课件与导学案
- 《云南红色旅游》课件
- 孤残儿童试题库(含答案)
- 新人美版高中美术选择性必修“绘画”《认识多面绘画-绘画的工具与材料》教学设计
- premiere设计毕业论文
- 三年级体育教学进度表
- 医务人员法律法规专题培训
- 《红楼梦第四回》课件
- 出货单表格模板下载
- PEP六年级上册英语unit1
- 接纳与承诺(ACT)疗法课件
评论
0/150
提交评论