VC++多窗口处理技术研究本科毕业论文.doc

上传人:小小飞 文档编号:3902999 上传时间:2019-10-10 格式:DOC 页数:34 大小:1.20MB
返回 下载 相关 举报
VC++多窗口处理技术研究本科毕业论文.doc_第1页
第1页 / 共34页
VC++多窗口处理技术研究本科毕业论文.doc_第2页
第2页 / 共34页
VC++多窗口处理技术研究本科毕业论文.doc_第3页
第3页 / 共34页
VC++多窗口处理技术研究本科毕业论文.doc_第4页
第4页 / 共34页
VC++多窗口处理技术研究本科毕业论文.doc_第5页
第5页 / 共34页
点击查看更多>>
资源描述

《VC++多窗口处理技术研究本科毕业论文.doc》由会员分享,可在线阅读,更多相关《VC++多窗口处理技术研究本科毕业论文.doc(34页珍藏版)》请在三一文库上搜索。

1、本科毕业设计(论文) 题目名称: VC多窗口处理技术的研究 学 院: 计算机科学技术 专业年级: 计算机科学与技术(师范) I摘 要自从美国Xerox Palo Alto Research Center的STAR计算机采用多窗口技术和鼠标作为用户接口以来,多窗口技术作为一种改善人机接口的手段,已开始流行。在计算机的各种应用中,经常要多个不同的应用程序进行互相配合,共同完成某项工作。多窗口技术使用户能在一个显示屏幕上,同时看到几个应用程序,并在各应用程序之间进行随意切换,从而极大地方便了使用者。本文依托“三维可视化”项目的系统框架,进行了多窗口处理技术的研究。软件系统包含了一般的多窗口处理技术,

2、VC中视图(窗口)的动态分割处理技术,自定义多窗口处理技术对图像进行处理和显示。通过文件预览模块、查看模块、系统控制模块、算法功能模块、窗口显示模块来实现整个系统的功能。多窗口处理技术已成为设计用户界面的重要手段地位,许多基于窗口技术开发用户界面的应用程序,其用户界面部分与应用核心部分没有彻底分离,难于移植。因此,在采用多窗口技术设计用户界面时,提出窗口框架与窗口信息相分离的方法,窗口信息以文件形式存贮,不仅使用户界面部分独立于应用核心部分,而且允许用户参与定义窗口颜色、各级窗口内同及每一菜单项所对应的子功能的函数名,系统集菜单选择窗口、帮助信息窗口,编辑信息区窗口于一体,满足多数应用程序的用

3、户界面需要,加快软件开发周期,统一用户界面风格。关键词:接口;多窗口处理技术;用户界面AbstractSince the Xerox Palo Alto Research Center USASTAR computer using multi-window technique and the mouse as a user interface, multi window technology as a means of improving the man-machine interface, have begun to pop.In a variety of applications, oft

4、en to a number of different applications to cooperate with each other, to complete a job. Multi window technology can help users on a display screen, see several applications at the same time, and can switch between the application programs, which is greatly convenient for users.This paper is based

5、on the visualization project system framework, the processing technology of multi-window. The software system includes multiple window processing technology in general, VC view (window) dynamic segmentation processing technology, processing and display the image of custom window processing technolog

6、y. Through the file preview module, check module, system control module, algorithm modules, window display module to realize the function of the system.Multi-window processing technology has become an important means of status of user interface design, many application window technology development

7、based on user interface, the user interface part and application of core part not completely separated, it is difficult to transplant. Therefore, using multi-window user interface design, method of window frame and window information phase separation is proposed, the window information storage in th

8、e form of a document, not only the user interface application independent core part, and allows the user to participate in defining the window color, all window with each menu item and the corresponding sub function the name of the function, the system set menu selection window, the help information

9、 window, edit the information window in one, meet most application user interface, speed up the cycle of software development, unified user interface style.Key word:Interface; Processing Technology of multi-window; The user Interface目 录摘 要IAbstractII第1章 绪 论11.1 多窗口处理技术概述11.2 多窗口处理技术应用2第2章 多窗口的创建与处理技

10、术32.1 窗口的创建过程32.1.1 系统框架窗口的创建32.1.2 自定义窗口的创建32.2 多窗口处理技术62.2.1 窗口的分割技术62.2.2 主窗口处理技术82.2.3 自定义窗口处理技术9第3章 VC+多窗口处理界面143.1 多窗口界面基本思想143.2 处理结果173.3 讨论17第4章 多窗口处理技术的展望18结 论20致 谢21参考文献22附 录2330第1章 绪 论1.1 多窗口处理技术概述个性化的程序离不开个性化的界面设计,界面编程不仅是编程,也是艺术。在程序设计中也有一句经典的说法:对于一个好的应用程序而言,界面设计部分的代码应该占总程序代码的60%,所以界面设计在

11、程序设计中占有相当的分量与地位。窗口分为三类:菜单窗口、编辑窗口和帮助窗口。菜单窗口提供给用户选择功能;编辑窗口提供给用户录入信息;帮助窗口提供给用户了解本项操作的信息;从内存使用效率、运行速度、通用性上考虑,提出采用窗口框架和显示信息分离的技术,窗口框架包括窗口类型、窗口显示位置大小、窗口颜色、窗口标识符名称和指向保存窗口显示图像信息区的首地址,每一个窗口框架占内存信息、且用一条双向链表管理,窗口框架的插入和删除分别在链表尾部进行,窗口之间允许全部或局部覆盖,系统还采用存贮和重放技术,窗口显示信息页,相应分为三类:菜单信息、编辑信息和帮助信息。同时,系统开辟相应三个系统工作区即:菜单信息区,

12、帮助信息区和编辑工作区,系统还设置了三个当前活动窗口工作区,以便使系统工作区可以动态申请和释放。窗口显示信息时根据窗口类型及其功能自动搜索相应系统工作中的内容,找出匹配的信息送到当前活动窗口工作区,窗口框架大小由窗口类型和窗口显示信息内容和自动调整。多窗口处理技术近年来,作为一种新技术用以改变人机接口手段,各种窗口软件大多数出现在功能很强的位映像在计算机中,它可以将图形标准软件包中的应用程序和其他实用程序同时在不同的窗口中显示和运行。多窗口是指在一个屏幕中划分几个区域,让每个区域执行不同的作业和多种数据表示方法。我们在实际应用程序开发时,多窗口处理技术即在一个主程序界面中,为了数据处理方便通常

13、要在多个窗口中同时处理。因此,多窗口处理技术是工程实践中非常关键的一个技术。当计算机发送每一个数据段时,都必须等待确认,数据的传输的速率就变慢了。单在计算机发送数据段之后,以及在它接受到已接收的信息时,有一段时间间隔,回用于接收方确认,发送方可以利用这个间隔来发送更多的数据。所以,发送方在没有接收到已发送数据的确认时,被允许发送的数据段的数量就称为“窗口”。窗口是屏幕上的一个矩形区域,应用程序在该区域中显示数据并等待鼠标点击。Windows应用系统的用户界面可以包含许多窗口,每个窗口都有不同的特点,但都是互相关联的。在这么多窗口中,基本类型只有三种:重叠(Oberlapped)窗口,弹出(Po

14、pup)窗口和子窗口(Child)。在它们之间并没有太多内在的差异,但是使用不同的窗口风格,它们的外观是不同的。多窗口处理技术是图像处理技术中的基础界面技术,多窗口处理技术需要具有良好的硬件操作能力和内存管理能力。基于VC的多窗口处理技术可以在内存处理和硬件接口方面留有充分的扩充余地,方便、快捷、易于管理和扩充的界面技术,有利于对计算机图像与软件处理算法的实现和仿真。1.2 多窗口处理技术应用计算机的发展速度,让人望而生畏,在短短的几十年里,创造出了巨大的成就,多窗口处理技术也在一点点被发觉,如今已经成为研究领域中热门项目。它目前的应用领域之广,已经是有目共睹。自从Xerox公司首先在 STA

15、R工作站上推出多窗口图形系统以来,多窗口软件得到了很大发展。现在多窗口软件处理技术是所有软件系统设计中的支撑。多窗口软件处理技术不仅为用户提供了良好的用户界面和集成的操作环境。而且能够大大增强软件的使用效率和实用性。目前人机界面的标准越来越趋向于WINDOWS风格的多窗口显示技术。这种 显示技术在有限的物理视屏上,通过多个窗口的显示增大了用户的作业视野,提高 人机界面的友好性。随着网络技术的普及,网络监视系统、视频会议系统这种多窗口画面显示系统的应用越来越广泛。各种CAD工作站,其中多窗口处理技术为发展CAD用户接口提供了开放环境。生活中的智能手机也在慢慢的趋近多窗口化,以至于让人们用着更方便

16、、操作更简便、视野更直观。计算机已经融入到了大部分人的生活中,随着人们日益增长的物质、文化需要,在不停的成长着,在日常生活中、军事上、医疗和工业上等许多领域得到了广泛的应用。已是人们生活需要不可或缺的一部分。第2章 多窗口的创建与处理技术2.1 窗口的创建过程窗口的创建分为系统框架窗口和自定义窗口,系统框架创建:基于VC+开发工具的功能,根据开发工具的向导以及用户点选所需要的功能,所自动生成的统一VC窗口。自定义窗口:根据用户或者开发人员自身需要,独立创建的窗口。2.1.1 系统框架窗口的创建系统框架窗口在VC+中是一种自动系统生成的窗口,创建简便方式如下: 打开Visual C+6.0 选择

17、File菜单的New,在出现的对话框中,选择Projects栏目(新建工程),并点击下面的Win32 Application项,表示使用Win32环境创建应用程序,先Locatin(路径)中填入“C:”,然后在Project Name(项目名称)中填入“HelloWin”,其它按照缺省设置。单击OK按钮,完成。 根据系统下提示的向导,按照step1-step6页面中的功能,自主勾选所需要的功能,点击下一步直到完成,开发软件会自动生成一个系统窗口。 再次选择File菜单的New,在出现的对话框中,选择Files栏目(新建文件),并点击下面的C+ Source File项,表示新建一个C+源文件。

18、在右边的File栏中输入“HelloWin”,最后确定让Add to project框上打上勾。单击OK按钮完成。由于系统框架窗口创建比较简单,此处就不在多加介绍,接下来我会详细介绍自定义窗口的创建过程。2.1.2 自定义窗口的创建自定义窗口的创建过程需要四个步骤,下面列出了创建步骤和这个过程中涉及的类和函数:1. 设计一个窗口类/很多特征(光标,图标,背景)WNDCLASS2. 注册窗口类/Register Class3. 创建窗口/首先定义句柄 如:HWND hwnd; Create Window4. 显示及更新窗口/显示窗口:Show Window,更新窗口:Update Window。

19、(1)设计一个窗口类一个完整的窗口的具有许多特征,包括光标(鼠标进入该窗口时的形状)、图标、背景色等。窗口的创建过程类似汽车的制造过程。我们在生产一个型号的汽车之前,首先要对该型号的汽车进行设计,在图纸上画出汽车的结构图,设计各个零件,同时还要给该型号的汽车取一个响亮的名字。类似地,在创建一个窗口前,也必须对该类型的窗口进行设计,指定窗口的特征。当然,在我们设计一个窗口时,不像汽车的设计那么复杂,因为Windows已经为我们定义好了一个窗口所应具有的基本属性,我们只需要像考试时做填空题一样,将我们填充的部分填写完整,一种窗口就设计好了。在VC+中,窗口的定义结构体是由WNDCLASS来完成的,

20、WNDCLASS结构体定义如下:Typedef Struct_WNDCLASSUINT style,WNDPROC lpfnWndProc,Int cbClsExtra,Int cbWndExtra,HANDLE hinstance,HICON hicon,HCUROSR hCursor,HBRUSH hbrBackground,LPCTSTR lpszMenuName,LPCTSTR lpszClassName,WNDCLASS;(2) 注册窗口类 一个应用程序可以有许多窗口,单只有一个主窗口,它是与该程序的实例句柄唯一关联的。通常要对填充一个窗口类结构WNDCLASS,然后调用Regist

21、erClass()对该窗口类进行注册。每个窗口都有一些基本属性,如窗口标题栏文字、窗口大小和位置、鼠标、背景色、处理窗口消息函数的名称等等。注册的过程也就是将这些属性告诉系统,然后调用CreateWindow()函数创建出窗口。注册函数的原型声明如下:ATOM RegisterClass (CONST WNDCLASS *lpWndClass);当用户创建一个窗口类时,实际上只是在三个操作系统列表之一中注册一个WNDCLASS结构吗。系统为每个类类型维护一个列表:系统全局类(System Global Class)在系统启动时注册,且必须注册,对所有应用程序都有效。应用程序全局类(Applic

22、ation Global Class)由应用程序注册,只对应用程序及应用程序的线程有效。应用程序局部类(Application Local Class)由应用程序注册,并只对注册它们的应用程序或DLL有效。当系统搜索一个窗口类时,从应用程序局部类开始,然后搜索应用程序全局类,最后搜索系统全局类。要创建一个窗口类,可以先创建WNDCLASS结构的实例,然后用MFC类库的AfxRegisterClass()注册它。也可以用MFC类库的AfxRegisterWndClass()来创建一个基于调用参数的WNDCLASS对象。(3) 创建窗口设计好窗口并且将其成功或注册之后,就可以用CreateWind

23、ow函数产生这种类型的窗口了。产生窗口的过程是由操作系统完成的,如果在调用CreateWindow函数之前,没有用Register Class函数注册过,操作系统将无法得知这一类型窗口的相关信息,从而导致创建窗口失败。CreateWindow函数的原型声明如下:HWND CreateWindow(LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,Int x,Int y,Int nWidth,Int nHeight,HWND hWndParent,HMENU hMenu,HANDLE hinstance,LPVOID lpParam);

24、(4) 显示窗口消息创建后,并不会再屏幕上显示出来,要真正把窗口显示在屏幕上,还得使用ShowWindow()函数,由于ShowWindow()函数的执行优先级不高,所以当系统正忙着执行其它的任务时,窗口不会立即显示出来,此时,调用UpdateWindow()函数以可以立即显示窗口。函数原型声明如下所示:BOOL ShowWindow(HWND hWnd,Int nCmdShow);BOOL UpdateWindow(HWND hWnd, ); 2.2 多窗口处理技术现在对于软件中窗口的处理技术分为三类:1. 基于系统框架窗口,通过spllitter控件进行分割的处理技术。2. 基于所有窗口都

25、为主窗口的处理技术。3. 基于根据用户和开发需要自定义的处理技术。2.2.1 窗口的分割技术(1) 窗口创建参照2.1.1系统框架窗口创建的内容。(2) Splitter控件描述这个容器控件包含有一个可移动并且可折叠的条,它可以将该容器控件的显示区域分成两个可调整大小的面板。分离器是可以被无限嵌套下去的,可以为你在UI设计上提供无限的可能性。使用Splitter分离器的嵌套功能,可以将大量的数据整理在一个页面内。C1Splitter控件使你可以嵌套任何方位类型的多个部分,并且,在你调整面板大小的时候,可以允许你为嵌套的分离器调整大小,如下图:Splitter控件用于重新设置停靠在其上的其他控件

26、的大小。一个典型的示例是Windows资源管理器右边的列表视图和左边的树形视图之间的分隔栏。当把鼠标指针放在分隔栏上时,光标会改变,用户可以单击分隔栏,把它向上下或左右拖动。 图2-1 window资源管理器可以设置MinSize和MinExtra属性,限制分隔栏可以移动的距离。其区别是MinSize属性指定在分隔栏和分隔栏所在的容器边界之间最小距离(单位是像素)。MinExtra属性指定容器的对边和分隔栏之间的距离(单位是像素)。用Position属性可以设置最初位置。如果分隔栏没有停靠在容器控件中,该属性值就是1。Splitter控件引发两个与移动相关的事件Splitter Moving和

27、Splitter Moved。Splitter Moving在移动过程中发生,Splitter Moved在移动过程完成后发生。它们都接收一个Splitter Event Args对象。Splitter EventArgs包含的属性是Splitter左上角的XY坐标(Split X和Split Y)和鼠标的XY坐标(X和Y)。 Splitter总是与一个“目标”控件相关联,Splitter直接改变该控件的大小,而其他控件也可收到其影响。Splitter通过docking机制被附加到目标控件的。 如果Splitter是垂直的,则Splitter Position属性表示目标控件的宽度,如果Spl

28、itter是水平的,则表示目标控件的高度。如果Splitter没有与控件绑定,该属性为-1。(3) splitter的静态分割技术一般常用的MFC视窗结构是文档/视窗结构(document/view architecture)。有很多人说这个结构浪费不少资源,不够节约。但我觉得作到界面这一级浪费点资源没什么太大问题。只要不漏内存,不影响效率就已经足够好了。何况这是微软最推崇的标准界面。文档/视窗(document/view architecture)结构主要由四个class组成。document类,view类,framework类和app类。app类是程序的引擎,在MFC中是最不不要关心的一个

29、类。framwork是窗口的框架,在程序运行开始的时候先生成框架,然后是document class,这里是用来存储数据的。然后是view类,用来显示数据同时作数据交换的。单文档界面只有一个document class,但可以又多了view class。至少有一个view class是active的。可以用GetActiveView()得到它的指针。每个和document class 关联的view class都有一个control ID,这个ID是一个整数。如果总共只显示一个view class,这个class的control ID是AFX_IDW_PANE_FIRST,如果同时显示好几个v

30、iew class就需要用分割器(splitter)割开。class 名字叫CSplitterWnd。CSplitterWnd有两种不同的切割framework的方式。一种叫动态的,用Create()来实现,切的很不理想。没见过多少class用这种切法。真正应用广泛的是静态切割,用CReateStatic实现。当然从名字上就可以看出静态切割的缺点,就是不能动态重新切分。被分割器隔开的窗口的Control ID可以通过IdFromRowCol(row, col)函数得到,row和col是窗口的行数和列数。其数值也是在AFX_IDW_PANE_FIRST。也是一个比较大的数字。所以隐藏当前不想显示

31、的view时把他的control ID改成一个1,2,3之类的很小的数就可以了。这里只讲静态窗口的切换,动态的效果不是很好,用户不想切的时候也会自动切。而且基于用户的需要,静态窗口的切换更符合人性化设计和软件开发的需求。1. 在Framework中显示一个View。通过菜单或按钮切换成不同的view。假设有三种view: CViewA, CViewB,CViewC。用三个常数表示他们不显示时的control ID。 enum eView ViewA, ViewB, ViewC;在CMainFrame加上下面一个函数就可以实现不同窗口的切换了。很易懂,唯一没有说的就是CCreateContext

32、 context,这是每次Create一个view时必须设定的。其实也就是m_pCurrentDoc这个指向当前document class的指针需要设定,其它的取默认值就可以了。静态窗口的切换的效果就是Window Explorer那样,左边的目录栏,点击右面就跟着变了。这里需要在已有的CSpllitterWnd的基础上一点小小的增强。需要一个切换功能。允许指定任意的子窗口类型。使用静态分割窗口的步骤如下:1) 创建CSplitterWnd或者其派生类对象。2) 调用CSplitterWnd:CreateStatic创建静态分割。3) 调用CSplitterWnd:CreateView创建各

33、个子窗口(必须在分割窗口被显示前调用)。静态窗口的重新切分,时分时合。需要知道的是CSplitterWnd在最开始切分窗口CreateStatic的时候不可以切成一行一列,也就是不切。CreateStatic一定要作真正的切割。 (4) spllitter处理技术总结Spllitter处理技术:通过系统框架创建好界面后,要用Splitter控件分割界面。但是这种方式有一定的局限性,虽然通过处理,分割成了多窗口,但是主窗口页面是WINDOWS系统下的标准界面,不美观,有时在一定需要上,该界面不符合需求。2.2.2 主窗口处理技术(1) 窗口的创建参照2.1.1自定义窗口的创建内容。(2) 主窗口

34、技术描述一般的多窗口处理是在一个主窗口中,当打开第二个窗口的时候,或者将第一个窗口隐藏起来,或者将第一个窗口销毁掉。以三维可视化项目为例,如图2-2所示;简单介绍一下一般的多窗口处理。软件环境基本的设计思想是基于标准的windows窗口标签形式。在主界面的左下方提供主要的三个标签,通过CMyTabCtrl类负责系统的文件预览界面、图像处理和图像显示界面的切换功能。各个标准界面启动后,可以不依据数据的需要随机切换和显示,方便观察及比较。对于熟悉windows软件操作的人员,这样的软件界面很容易上手,具有良好的人机交互能力。不同的标签都是基于一个标准的后台数据集。因为图像处理和图像显示,主要提供的

35、是观察和界面上的交互,通常不涉及对原始数据的处理。因此,这三个标签可以同时共存。提供这样的界面,可以方便操作人员在文件管理、图像处理和图像显示三个标签之间的相互转换,避免了目前流行的PACS软件上,各种功能模块相互独立,互相排斥,浏览困难,无法比对使用的问题。窗口标签需要根据项目的实际需要而设计,在此项目中,只需要3个标签之间的相互转换,就可以完成项目需求,方便各个界面之间的交互处理。在某些实际工程应用中,需要创建多个标签,这样创建出来的N多个窗口之间的交互存在很大的问题,当程序运行一个主窗口显示在我们的视野中,此时打开第二个窗口,第一个窗口会自动隐藏,然后调出第二个窗口显示出来,打开第三个窗

36、口时,第二个窗口会自动隐藏,调出第三个窗口显示出来,直到第N多个窗口。我们把第一个窗口和第二个窗口关联,创建调用指针,在调用指针时,把发送消息窗口实现隐藏,当有N多个窗口时,我们创建N多个指针,以致在调用窗口时,既能把原窗口隐藏,又能显出调用窗口。当N多个窗口之间进行切换时,每次只能显示一个窗口在视野中,并且窗口的转换不但在显示的内容上有变化,最主要的是后台数据相互之间的衔接,消息处理都需要配合进行,这在数据处理起来很复杂时,非常不方便,不利于高效率工作与使用,造成了一定的麻烦。 图2-2 主界面窗口(3) 总结我们能清晰的分析出来,每次只能显示一个窗口在视野中,这在数据处理时,非常不方便,不

37、利于高效率工作与使用,造成了一定的麻烦。2.2.3 自定义窗口处理技术随着计算机的更新换代,splitter控件、主窗口处理技术已经不能满足我们对于计算机开发的需求,也满足不了用户的需要了。自定义窗口处理技术已经成为计算机窗口处理技术最崭新的技术,它以成为现代计算机发展的前提。在高科技腾飞的今天,如今的软件开发、界面处理,越来越遵循人性化理念了,用户不仅直观上容易接受而且工作简便、利于操作。(1) 窗口的创建参照2.1.2自定义窗口的创建内容。(2) 过程描述VC中支持Windows操作系统的典型窗口技术,但是一般的多窗口处理技术和基于VC提供的视图(窗口)动态分割方法,已经不能完全满足客户的

38、需求;窗口模式管理复杂、不易扩展、后期处理数据不便利,并不是很好的解决方案。这样一来,为了满足客户实际需求,进行自定义窗口处理技术已经在计算机窗口处理方面广泛应用,基于对话框的程序是良好的交互设计的首选,通过在同一个窗口中嵌入CWnd对象,结合CView对象,创建子窗口来实现多窗口处理,是一个简便、易于控制、相对独立、消息响应易于处理的方法,能够符合人们的思维习惯,使得用户容易上手。现代软件中,主窗口只有一个,间接通过功能键,完成各项操作。主要分为三个部分:显示区(界面区)、主数据区、控制区(主窗口+消息)。CWnd类是所有窗口类的基类,它允许用户建立一个窗口。下面我们就从CWnd类是派生的一

39、个子类CSplashWnd。我们以CSplashWnd(显示启动画面)为例,来看一下它的控制中消息处理过程和主要函数。编写窗口类一般先用ClassWizard从CWnd派生出自己的窗口类.我们这里派生出了CSplashWnd类。 重载Create函数,建立一个窗口。void CSplash:Create(CWnd*parentWnd) BOOL bRet = CWnd:CreateEx(WM_EX_TOPMOST,AfxRegister,WndClass(0),0,WS_POPUP,x,y, Width,Height,parentWnd-GetSafeHwnd(),NULL,NULL); If

40、 (bRet) SetOwner(parentWnd); ShowWindow(SW_SHOW); Create函数首先调用CWnd 成员函数CreateEx登记并建立一个窗口,其中第一个参数表示扩展窗口风格,WM_EX_TOPMOST 使本窗口位于其他窗口之上.接下来两个参数分别是指WNDCLASS和WindowName的指针。前者是AfxRegisterWndClass (WNDCLASS wc),登记窗口结构后返回的指针,后者则只是一个字符串指针,WS_POPUP设定窗口模式为弹出式窗口,x,y设定了窗口左上角位置,width,height分别指定了窗口的宽度和高度;下一个参数是一个指向

41、父窗口句柄的指针,可用Cwnd类的GetSafeHwnd()函数返回,最后两个参数用来设定窗口的菜单和鼠标,这里并不需要。 ShowWindow(int nCmdShow)函数可通过参数nCmdShow显示;(SW_SHOW)或隐藏(SW_HIDE)一个窗口。在这种自定义多窗口中,所有子窗口都是用一个数据中心的数据。数据中心会在程序启动时生成一个全局实例指针,在程序的运行阶段,每个窗口只要获得这个全局的数据中心指针,然后到数据中心去取出自己感兴趣的数据即可。数据都必须由数据中心统一控制,即由数据中心产生、发出、保存。算法中心实际是一个黑盒子,负责将数据中心的数据拿来处理,最终结果送还给数据中心

42、保存。每个窗口都不需要知道数据中心到底发生了什么改变,而主需要获取自己需要使用的数据即可。(3) 消息处理窗口创建完成之后,有可能窗口时间会相互通信来交换一下窗口更改的信息。在Windows程序中,主要依靠消息来进行通信,如果某一个窗口发生一些修改,需要其余窗口获知这一情况,它可以发送消息给它,当其余窗口得到发送过来的消息时,就会做出响应。但是这个过程中,窗口之间是不会直接相互发送消息,因为当子窗口数目很多的时候,这个消息过程的控制便变得越来越困难。为了便于控制和管理,这个发消息的过程最好是交由父窗口来做,当需要向其它窗口发消息时,可以先把这个消息告知父窗口,当父窗口接收到消息时,再统一将消息

43、发送至其它窗口。1. 消息的添加接下来我们进行一下消息处理与窗口之间控制的行为,有两种方式:1.自动方式:利用Class Wizard实现自动添加2.手动方式:手动添加消息处理函数。接下来我们对这两种方式进行一下说明。 1) 利用Class Wizard实现自动添加 在菜单中选择View-Class Wizard,也可以用单击鼠标右键,选择Class Wizard,同样可以激活Class Wizard。选择Message Map标签,从Class name组合框中选取我们想要添加消息的类。在Object IDs列表框中,选取类的名称。此时, Messages列表框显示该类的大多数(若不是全部的

44、话)可重载成员函数和窗口消息。类重载显示在列表的上部,以实际虚构成员函数的大小写字母来表示。其他为窗口消息,以大写字母出现,描述了实际窗口所能响应的消息ID。选中我们向添加的消息,单击Add Function按钮,Class Wizard自动将该消息添加进来。有时候,我们想要添加的消息本应该出现在Message列表中,可是就是找不到,我们可以利用Class Wizard上Class Info标签以扩展消息列表。在该页中,找到Message Filter组合框,通过它可以改变首页中Messages列表框中的选项。这里,我们选择Window,从而显示所有的窗口消息,一把情况下,你想要添加的消息就可

45、以在Message列表框中出现了,如果还没有,那就接着往下看。 2) 手动地添加消息处理函数 如果在Messages列表框中仍然看不到我们想要的消息,那么该消息可能是被系统忽略掉或者是你自己创建的,在这种情况下,就必须自己手工添加。根据我们前面所说的消息工作的3个部件,我们一一进行处理: 在类的. h文件中添加处理函数的声明,紧接在/AFX_MSG行之后加入声明,注意:一定要以afx_msg开头。 例如:#define WM_COUNT_MSG WM_USER+100 例如:afx_msg LRESULT OnCountMsg(WPARAM,LPARAM); 通常,添加处理函数声明的最好的地方

46、是源代码中Class Wizard维护的表下面,但是在它标记其领域的括弧外面。这些括弧中的任何东西都将会被Class Wizard销毁。 接着,在用户类的.cpp文件中找到 /AFX_MSG_MAP行,紧接在它之后加入消息入口项。同样,也是放在 的外面。例如:BEGIN_MESSAGE_MAP(CMSGDlg, CDialog) ON_WM_PAINT() ON_MESSAGE(WM_COUNT_MSG,&CMSGDlg:OnCountMsg) /AFX_MSG_MAPEND_MESSAGE_MAP() 最后,在该文件中添加消息处理函数的实体例如:LRESULT CMSGDlg:OnCount

47、Msg(WPARAM wParam,LPARAM lParam) this-SetDlgItemInt(IDC_EDIT,lParam); return 1;另外还有一个函数:BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);注意SendMessage直到消息被处理完毕后才返回,而PostMessage是把一条消息投放到创建hWnd窗口的线程的消息队列中。函数不等消息被处理就立即返回。如果开启了记事本程序,则运行以上程序记事本关闭。另附PeekMessage和GetMessage的区别:PeekMessage返回TRUE的条件是有消息,如果没有消息返回FALSE,GetMessage返回TRUE的条件是有消息且该消息不为WM_QUIT,返回FALSE的条件是有消息且该消息为WM_QUIT。在MFC中SendMessage函数封装到CW

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1