版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本科毕业设计(论文) 题目名称: VC多窗口处理技术的研究 学 院: 计算机科学技术 专业年级: 计算机科学与技术(师范) 摘 要自从美国Xerox Palo Alto Research Center的STAR计算机采用多窗口技术和鼠标作为用户接口以来,多窗口技术作为一种改善人机接口的手段,已开始流行。在计算机的各种应用中,经常要多个不同的应用程序进行互相配合,共同完成某项工作。多窗口技术使用户能在一个显示屏幕上,同时看到几个应用程序,并在各应用程序之间进行随意切换,从而极大地方便了使用者。本文依托“三维可视化”项目的系统框架,进行了多窗口处理技术的研究。软件系统包含了一般的多窗口处理技术,V
2、C中视图(窗口)的动态分割处理技术,自定义多窗口处理技术对图像进行处理和显示。通过文件预览模块、查看模块、系统控制模块、算法功能模块、窗口显示模块来实现整个系统的功能。多窗口处理技术已成为设计用户界面的重要手段地位,许多基于窗口技术开发用户界面的应用程序,其用户界面部分与应用核心部分没有彻底分离,难于移植。因此,在采用多窗口技术设计用户界面时,提出窗口框架与窗口信息相分离的方法,窗口信息以文件形式存贮,不仅使用户界面部分独立于应用核心部分,而且允许用户参与定义窗口颜色、各级窗口内同及每一菜单项所对应的子功能的函数名,系统集菜单选择窗口、帮助信息窗口,编辑信息区窗口于一体,满足多数应用程序的用户
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, ofte
4、n 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 o
5、n 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 technology
6、. 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 b
7、ased 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 the
8、 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附 录23第1章 绪 论1.1 多窗口处理技术概述个性化的程序离不开个性化的界面设计,界面编程不仅是编程,也是艺术。在程序设计中也有一句经典的说法:对于一个好的应用程序而言,界面设计部分的代码应该占总程序代码的60%,所以界面设计在程序设
11、计中占有相当的分量与地位。窗口分为三类:菜单窗口、编辑窗口和帮助窗口。菜单窗口提供给用户选择功能;编辑窗口提供给用户录入信息;帮助窗口提供给用户了解本项操作的信息;从内存使用效率、运行速度、通用性上考虑,提出采用窗口框架和显示信息分离的技术,窗口框架包括窗口类型、窗口显示位置大小、窗口颜色、窗口标识符名称和指向保存窗口显示图像信息区的首地址,每一个窗口框架占内存信息、且用一条双向链表管理,窗口框架的插入和删除分别在链表尾部进行,窗口之间允许全部或局部覆盖,系统还采用存贮和重放技术,窗口显示信息页,相应分为三类:菜单信息、编辑信息和帮助信息。同时,系统开辟相应三个系统工作区即:菜单信息区,帮助信
12、息区和编辑工作区,系统还设置了三个当前活动窗口工作区,以便使系统工作区可以动态申请和释放。窗口显示信息时根据窗口类型及其功能自动搜索相应系统工作中的内容,找出匹配的信息送到当前活动窗口工作区,窗口框架大小由窗口类型和窗口显示信息内容和自动调整。多窗口处理技术近年来,作为一种新技术用以改变人机接口手段,各种窗口软件大多数出现在功能很强的位映像在计算机中,它可以将图形标准软件包中的应用程序和其他实用程序同时在不同的窗口中显示和运行。多窗口是指在一个屏幕中划分几个区域,让每个区域执行不同的作业和多种数据表示方法。我们在实际应用程序开发时,多窗口处理技术即在一个主程序界面中,为了数据处理方便通常要在多
13、个窗口中同时处理。因此,多窗口处理技术是工程实践中非常关键的一个技术。当计算机发送每一个数据段时,都必须等待确认,数据的传输的速率就变慢了。单在计算机发送数据段之后,以及在它接受到已接收的信息时,有一段时间间隔,回用于接收方确认,发送方可以利用这个间隔来发送更多的数据。所以,发送方在没有接收到已发送数据的确认时,被允许发送的数据段的数量就称为“窗口”。窗口是屏幕上的一个矩形区域,应用程序在该区域中显示数据并等待鼠标点击。Windows应用系统的用户界面可以包含许多窗口,每个窗口都有不同的特点,但都是互相关联的。在这么多窗口中,基本类型只有三种:重叠(Oberlapped)窗口,弹出(Popup
14、)窗口和子窗口(Child)。在它们之间并没有太多内在的差异,但是使用不同的窗口风格,它们的外观是不同的。多窗口处理技术是图像处理技术中的基础界面技术,多窗口处理技术需要具有良好的硬件操作能力和内存管理能力。基于VC的多窗口处理技术可以在内存处理和硬件接口方面留有充分的扩充余地,方便、快捷、易于管理和扩充的界面技术,有利于对计算机图像与软件处理算法的实现和仿真。1.2 多窗口处理技术应用计算机的发展速度,让人望而生畏,在短短的几十年里,创造出了巨大的成就,多窗口处理技术也在一点点被发觉,如今已经成为研究领域中热门项目。它目前的应用领域之广,已经是有目共睹。自从Xerox公司首先在 STAR工作
15、站上推出多窗口图形系统以来,多窗口软件得到了很大发展。现在多窗口软件处理技术是所有软件系统设计中的支撑。多窗口软件处理技术不仅为用户提供了良好的用户界面和集成的操作环境。而且能够大大增强软件的使用效率和实用性。目前人机界面的标准越来越趋向于WINDOWS风格的多窗口显示技术。这种 显示技术在有限的物理视屏上,通过多个窗口的显示增大了用户的作业视野,提高 人机界面的友好性。随着网络技术的普及,网络监视系统、视频会议系统这种多窗口画面显示系统的应用越来越广泛。各种CAD工作站,其中多窗口处理技术为发展CAD用户接口提供了开放环境。生活中的智能手机也在慢慢的趋近多窗口化,以至于让人们用着更方便、操作
16、更简便、视野更直观。计算机已经融入到了大部分人的生活中,随着人们日益增长的物质、文化需要,在不停的成长着,在日常生活中、军事上、医疗和工业上等许多领域得到了广泛的应用。已是人们生活需要不可或缺的一部分。第2章 多窗口的创建与处理技术2.1 窗口的创建过程窗口的创建分为系统框架窗口和自定义窗口,系统框架创建:基于VC+开发工具的功能,根据开发工具的向导以及用户点选所需要的功能,所自动生成的统一VC窗口。自定义窗口:根据用户或者开发人员自身需要,独立创建的窗口。2.1.1 系统框架窗口的创建系统框架窗口在VC+中是一种自动系统生成的窗口,创建简便方式如下: 打开Visual C+6.0 选择Fil
17、e菜单的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。(1)
19、设计一个窗口类一个完整的窗口的具有许多特征,包括光标(鼠标进入该窗口时的形状)、图标、背景色等。窗口的创建过程类似汽车的制造过程。我们在生产一个型号的汽车之前,首先要对该型号的汽车进行设计,在图纸上画出汽车的结构图,设计各个零件,同时还要给该型号的汽车取一个响亮的名字。类似地,在创建一个窗口前,也必须对该类型的窗口进行设计,指定窗口的特征。当然,在我们设计一个窗口时,不像汽车的设计那么复杂,因为Windows已经为我们定义好了一个窗口所应具有的基本属性,我们只需要像考试时做填空题一样,将我们填充的部分填写完整,一种窗口就设计好了。在VC+中,窗口的定义结构体是由WNDCLASS来完成的,WND
20、CLASS结构体定义如下: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,然后调用RegisterC
21、lass()对该窗口类进行注册。每个窗口都有一些基本属性,如窗口标题栏文字、窗口大小和位置、鼠标、背景色、处理窗口消息函数的名称等等。注册的过程也就是将这些属性告诉系统,然后调用CreateWindow()函数创建出窗口。注册函数的原型声明如下:ATOM RegisterClass (CONST WNDCLASS *lpWndClass);当用户创建一个窗口类时,实际上只是在三个操作系统列表之一中注册一个WNDCLASS结构吗。系统为每个类类型维护一个列表:系统全局类(System Global Class)在系统启动时注册,且必须注册,对所有应用程序都有效。应用程序全局类(Applicati
22、on Global Class)由应用程序注册,只对应用程序及应用程序的线程有效。应用程序局部类(Application Local Class)由应用程序注册,并只对注册它们的应用程序或DLL有效。当系统搜索一个窗口类时,从应用程序局部类开始,然后搜索应用程序全局类,最后搜索系统全局类。要创建一个窗口类,可以先创建WNDCLASS结构的实例,然后用MFC类库的AfxRegisterClass()注册它。也可以用MFC类库的AfxRegisterWndClass()来创建一个基于调用参数的WNDCLASS对象。(3) 创建窗口设计好窗口并且将其成功或注册之后,就可以用CreateWindow函
23、数产生这种类型的窗口了。产生窗口的过程是由操作系统完成的,如果在调用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);(4)
24、 显示窗口消息创建后,并不会再屏幕上显示出来,要真正把窗口显示在屏幕上,还得使用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和Spl
27、itter 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属性表示目标控件的宽度,如果Splitt
28、er是水平的,则表示目标控件的高度。如果Splitter没有与控件绑定,该属性为-1。(3) splitter的静态分割技术一般常用的MFC视窗结构是文档/视窗结构(document/view architecture)。有很多人说这个结构浪费不少资源,不够节约。但我觉得作到界面这一级浪费点资源没什么太大问题。只要不漏内存,不影响效率就已经足够好了。何况这是微软最推崇的标准界面。文档/视窗(document/view architecture)结构主要由四个class组成。document类,view类,framework类和app类。app类是程序的引擎,在MFC中是最不不要关心的一个类。f
29、ramwork是窗口的框架,在程序运行开始的时候先生成框架,然后是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,如果同时显示好几个view
30、 class就需要用分割器(splitter)割开。class 名字叫CSplitterWnd。CSplitterWnd有两种不同的切割framework的方式。一种叫动态的,用Create()来实现,切的很不理想。没见过多少class用这种切法。真正应用广泛的是静态切割,用CReateStatic实现。当然从名字上就可以看出静态切割的缺点,就是不能动态重新切分。被分割器隔开的窗口的Control ID可以通过IdFromRowCol(row, col)函数得到,row和col是窗口的行数和列数。其数值也是在AFX_IDW_PANE_FIRST。也是一个比较大的数字。所以隐藏当前不想显示的vi
31、ew时把他的control ID改成一个1,2,3之类的很小的数就可以了。这里只讲静态窗口的切换,动态的效果不是很好,用户不想切的时候也会自动切。而且基于用户的需要,静态窗口的切换更符合人性化设计和软件开发的需求。1. 在Framework中显示一个View。通过菜单或按钮切换成不同的view。假设有三种view: CViewA, CViewB,CViewC。用三个常数表示他们不显示时的control ID。 enum eView ViewA, ViewB, ViewC;在CMainFrame加上下面一个函数就可以实现不同窗口的切换了。很易懂,唯一没有说的就是CCreateContext co
32、ntext,这是每次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 (b
40、Ret) 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,从而显示所有的窗口消息,一把情况下,你想要添加的消息就可以在M
45、essage列表框中出现了,如果还没有,那就接着往下看。 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:OnCountMsg
47、(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返回
48、TRUE的条件是有消息,如果没有消息返回FALSE,GetMessage返回TRUE的条件是有消息且该消息不为WM_QUIT,返回FALSE的条件是有消息且该消息为WM_QUIT。在MFC中SendMessage函数封装到CWnd类中:CWnd:SendMessageLRESULT SendMessage(UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );返回值:消息处理的结果;它的值依赖于发送的消息。2. 消息的处理消息处理函数又叫窗口过程,在这个函数中,不同的消息将用switch语句分配到不同的处理程序中去。Windows的消息处理函
49、数都有一个确定的样式,即这种函数的参数个数和类型以及其返回值的类型都有明确的规定。在VC的说明书中,消息处理函数的原型是这样定义的:LPESULT CALLBACK WindowProc(HWND hwnd, /接收消息窗口的句柄UINT uMsg, /主消息值WPARAM wParam, /副消息值LPARAM lParam /副消息值);如果程序中还有其它的消息处理函数,也都必须按照上面的方式来定义,函数名称可以不唯一的。HelloWin中的WinProc()函数就是这样一个典型的消息处理函数。消息处理函数的四个参数是由GetMessage()函数从消息队列中获得MSG结构,然后分解后得到
50、的。第二个参数uMsg和MSG结构中的message值是一致的,代表了主消息值。程序中用switch语句来将不同类型的消息分配到不同的处理程序中去。WinProc()函数明确的处理了4个消息,分别是WM_KEYDOWN(击键消息)、WM_RBUTTONDOWN(鼠标右键按下消息)、WM_PAINT(窗口重画消息)、WM_DESTROY(销毁窗口消息)。值得注意的是,应用程序发送到窗口的消息远远不止以上这几条,像WM_SIZE、WM_MINIMIZE、WM_CREATE、WM_MOVE等这样频频使用的消息就有几十条。为了减轻编程的负担,Windows的API提供了DefWindowProc()函
51、数来处理这些最常用的消息,调用了这个函数后,这些消息将按照系统默认的方式得到处理。第3章 VC+多窗口处理界面3.1 多窗口界面基本思想表面上,多窗口界面是为了显示和与用户之间的交互。事实上,多窗口设计在程序设计过程中,往往是数据结构、处理过程、交互、控制的多种因素共同作用的结果。多窗口界面的典型特征是:后台具备一组或者多组数据结构;前台具有多个独立的窗口,每一个窗口具有自己独立的消息系统;软件系统整体具备一个统一个控制系统,用于协调所有的消息的窗口过程。程序设计中,如果界面能够通过一个单一窗口解决问题,则尽量不用多窗口进行处理。多窗口处理时,首先考虑是否数据真的需要同时显示及处理,例如CAD
52、设计软件中,由于计算机屏幕为二维平面,只能够表达三维空间中物体的一个观察角度,因此如果需要处理三维数据的话,则必须要进行至少三个观察角度的互动处理,因此必须使用多窗口处理;其次,考虑交互的便利性。例如在一个窗口中,我们需要同时显示多个元素或者多幅图片,一般情况下,只是显示,不需要消息响应和交互,则需要一个消息循环即可,则不需要多窗口处理。但是,如果每一个元素都需要自己独立的消息响应,则必须使用多窗口处理。这个时候则需要详细设计综合控制部分的功能。多窗口处理中,与其他软件开发一样,都需要设计到软件的控制部分、数据部分、多窗口的交互部分。 图3-1 数据处理界面软件的控制部分。多窗口中的各个子窗口
53、的主要功能是用来实现软件的子功能。因此,其功能划分可以划分为主要功能的子功能模块调用中,在代码上类似于函数调用,只不过其具备消息和界面交互能力。因此,子窗口需要主窗口统一创建、使用、调配、销毁。如图所示,每一个子窗口都拥有一个自身的窗口句柄,子窗口的功能调用就是通过窗口句柄来实现的。因此,在主窗口中需要保留每一个子窗口的句柄,当需要某一个子窗口执行调用的时候,通过窗口句柄即可以实现。软件的总体功能,例如菜单、控件、外部调用、内部消息等,都需要通过主窗口的控制模块统一调配。 图3-2 说明图数据部分。VC中常用的一个窗口框架是SDI(单文档框架),该框架提供了一个非常好的数据部分的管理机制。对于
54、窗口而言,其主要的功能是向用户显示数据部分的数据内容,可以通过直接数据显示、图表、图像、图形等方式;同时,用户也会根据数据的内容,对数据进行操作,操作的过程则是窗口接受用户的输入,并通过预定义输入的语义,实现将用户的意愿转化为数据处理的动作的形式。所以,在数据部分,除需要保存具体的数据以外,还需要定义众多的数据处理函数,供窗口调用。需要处理的数据,应该尽量存放在一个数据类对象中,如果需要多种数据并行处理,则一定要注意数据之间的调配,避免数据冲突。多窗口的架构。VC中提供的多窗口处理能力是使用Splitter分割功能,对窗口进行拆分,然后给每一个窗口分配一个视类,作为交互处理的客户区。在简单的窗
55、口过程中,这种方式建立的多窗口可以满足大部分的需要。但是在复杂的程序处理过程中,这种方式就有一些力不从心了。需要大家注意的是,在多窗口处理中,其基本原理就是先创建子窗口(Splitter分割),然后创建子窗口中的视。如图所示: 图3-3 主界面实际上,一个窗口处理过程就是:子窗口+子视图这样的一个结构。这种结构是VC功能划分规则所要求的。子窗口用于管理边框和窗口的位置;子视图则用于管理与用户之间的交互。理论上,在窗口中可以创建无限多个子窗口结构。但是,过多的窗口管理 Splitter是无能为力的,所以在本轮文中,我们采用对话框为主窗口界面,在其中嵌入需要的子窗口,每一个子窗口都包括两个部分:C
56、Wnd窗口对象和CView视图对象。程序实现的基本过程:1、设定CRect对象,用于存储子窗口的大小和位置。如果需要在程序中动态地修改子窗口的位置和大小,则可以修改其对应的CRect对象,然后重新定义窗口。2、在主窗口类中创建子窗口的指针,并在构造函数中将其初始化。然后再OnInitDialog()函数中使用Create函数创建子窗口。同时在子窗口对象中,创建对应的子视图。注意保留窗口对象的指针,便于控制访问。3、将数据类对象的指针传递给子窗口,任何对于窗口上的交互,都以修改数据对象中的对应数据值作为指示和标准。4、所有的控制指令,均由自定义的子窗口消息函数来负责执行。3.2 处理结果 图3-
57、2 处理结果 3.3 讨论多窗口设计注意的问题:1、遵照人们读信息的习惯设计窗口;2、考虑到信息现实位置对对用户的情绪影响;3、窗口上应留有充分的空白;4、窗口布局应整齐、平衡;5、窗口布局应恒定。第4章 多窗口处理技术的展望在八十年代中期,美国麻省理工学院(MIT)与DEC、IBM等计算机大厂商联合组织了一个“雅典娜工程”,共同开发成一种可运行本地应用程序,又可以调用远程资源的窗口系统。八十年代末期随着X窗口第十一版本的问世,越来越多的计算机厂商将它作为自己操作系统的标准配置,当时的X窗口系统有两点:一是网络透明。在CPU上运行的程序可以通过本CPU或另一个CPU的显示器来显示图形,一个X应用程序可以同时将结果显示在不同的工作站上。二是开发商与模型独立。X窗口系统是一个标准的应用执行环境。为一台
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《个人防护用品知识》课件
- 财务会计实训报告范文
- 部门调研报告范文
- 《微生物遗传实验》课件
- 孤独的小熊中班课件
- 聘请人力资源顾问咨询合同书2024年度:某企业与人力资源公司之间的合作协议
- 挖掘机转让合同协议书 3篇
- 版个人简单的施工协议标准版可打印
- 2024版工程材料循环运输协议3篇
- 《β受体激动药》课件
- 第5课 推动高质量发展
- 律师事务所案件管理流程
- 生物医学研究的统计学方法课后答案(思考与联系)
- 2024年新苏教版四年级上册科学全册知识点(复习资料)
- 2023年全国职业院校技能大赛赛项-ZZ019 智能财税基本技能赛题 - 模块三
- 2024-2030年中国海上集装箱行业市场发展趋势与前景展望战略分析报告
- 2024年电力交易员(中级工)职业鉴定理论考试题库-上(单选题)
- YYT 0740-2009 医用血管造影X射线机专用技术条件
- 信息技术产品加工合作
- 【传统文化与现代传媒融合问题探究10000字(论文)】
- QCT1189-2023乘用车用保险杠
评论
0/150
提交评论