可视化程序设计重要概念总结

本文总结了Windows编程中的重要概念,包括模态与非模态对话框、动态链接库(DLL)的优势、MFC的消息映射机制、回调函数、API、指针与句柄的工作原理以及Windows应用程序的工作流程。深入探讨了GDI、ActiveX、RTTI等技术,同时也阐述了多文档界面(MDI)、单文档界面(SDI)以及进程间通信的各种方法。

1.模态对话框与非模态对话框

Windows的对话框按照其与父窗口的关系可以分为model(模式)对话框和modeless(非模式)对话框。Modeless对话框的特点是父窗口与对话框共同运行,model对话框是令其父窗口无效,直到对话框结束运行之后,才将父窗口恢复为有效。

2.动态链接库

动态链接库(DynamicLink Library,缩写为DLL)是一个可以被其它应用程序共享的程序模块,其中封装了一些可以被共享的例程和资源。

动态链接是相对于静态链接而言的。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。函数和过程的代码就在程序的exe文件中,该文件包含了运行时所需的全部代码。当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源。而动态链接所调用的函数代码并没有被拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在Windows的管理下,才在应用程序与相应的DLL之间建立链接关系。

动态链接库具有以下优点:

(1)扩展了应用程序的特性;

(2)可以用许多种编程语言来编写;

(3)简化了软件项目的管理;

(4)有助于节省内存;

(5)有助于资源共享;

(5)有助于应用程序的本地化;

(7)有助于解决平台差异;

(8)可以用于一些特殊的目的。windows使得某些特性只能为DLL所用。

3.消息映射

消息映射机制包括一组宏、映射成员函数等。声明消息映射数据结构之后,还需要为这个数据结构填入消息映射的数据。

MFC使用一种消息映射机制来处理消息,在应用程序框架中的表现就是一个消息与消息处理函数一一对应的消息映射表,以及消息处理函数的声明和实现等代码。当窗口接收到消息时,会到消息映射表中查找该消息对应的消息处理函数,然后由消息处理函数进行相应的处理。SDK编程时需要在窗口过程中一一判断消息值进行相应的处理,相比之下MFC的消息映射机制要方便好用的多。

http://baike.baidu.com/view/3517678.htm

4.回调函数

在计算机程序设计中,回调函数,或简称回调(Callback即callthen back 被主函数调用运算后会返回主函数),是指通过函数参数传递到其它代码的,某一块可执行代码的引用。这一设计允许了底层代码调用在高层定义的子程序。

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

http://baike.baidu.com/link?url=NJgbPVHlwmPH87v1DwSarv6UqPGuNGL50RkTmfhgvol5DqLtXrdPfWq193Vkclv9

5.API

 (ApplicationProgramming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

6.指针与句柄

句柄是WINDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。句柄是一个32位的整数,实际上是windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引。因为windows的内存管理经常会将当前空闲对象的内存释放掉,当需要时访问再重新提交到物理存储,所以对象的物理地址是变化的,不允许程序直接通过物理地址来访问对象。程序将想访问的对象的句柄传递给系统,系统根据句柄检索自己维护的对象列表就能知道程序想访问的对象及其物理地址了。句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各个对象是驻留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象了。但是,如果真这么认为,那么就大错特错了。我们知道windows是一个虚拟内存为基础的操作系统。在这种情况下,windows内存管理器经常在内存中来回移动对象,以此来满足各种应用程序的内存需要,对象被移动意味着它的地址变化了。如果地址总是如此的变化,我们应该去那里找对象呢?为了解决这个问题,windows操作系统为各个应用程序腾出一些内存地址,用来专门登记各个应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。windows内存管理器移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需要记住这个句柄地址就可以间接地知道对象具体在内存中哪个位置了。这个地址是在对象装载(load)时由系统分配的,当系统卸载时又释放给系统。

windows系统用句柄标记系统资源,用句柄隐藏系统信息。你只需要知道有这个东西,然后去调用它就行了,它是32bit的uint。指针则标记某个物理内存的地址,是不同的概念。

7.windows应用程序的工作流程。

(1)Windows通过Shell调用程序

(2)调用入口函数WinMain

(3)注册窗口类

(4)创建窗口实例

(5)创建窗口消息循环

(6)窗口过程函数的实现

(7)退出应用程序

8.MFC的文档/视图结构应用程序有哪些组成部分,各组成部分的作用是什么?

MFC单文档应用程序至少由CTestApp、CTestDoc、CTestView、CMainFrame和CAboutDlg几个部分组成。其意义和作用如下:

(1)CTestDoc类对应文档,文档可以理解为应用程序数据的抽象集合,他负责存储应用程序数据,包括磁盘文件和交换数据。

(2)CTestView类对应视图,视图使应用程序数据在用户面前的表达,该类负责应用程序数据的显示以及处理用户对数据的操作。

(3)CMainFrame类对应窗口,窗口是视图的容器,在高级应用程序中,窗口还容纳了工具栏、状态栏等。

(4)CTestApp类由CWinApp派生,它对应并充当消息传递中心和应用程序对象的容器。CWinApp对象还拥有并控制文档模板。

9.什么是重载,重载的类型有哪些?MFC如何判别重载?

C++允许为同一个函数定义多个版本,这称为函数重载。重载分为函数重载和运算符重载两类。

MFC使用静态联编识别重载函数,由于重载函数的参数类型或参数数量的不同,编译器在编译时,能够根据源代码调用固定的函数标识符,然后由连接器接管这些标志符,并用物理地址代替它们。

10.GDI

GDI是GraphicsDevice Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。

11.ActiveX

ActiveX是Microsoft提出的一组使用COM(Component   Object  Model,部件对象模型)使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序。

12.MDI、SDI

MDI(MultipleDocument Interface)多文档界面

SDI(SingleDocument Interface)单文档界面

13.RTTI

RTTI(Run-TimeType Identification,通过运行时类型识别)程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。

RTTI提供了以下两个非常有用的操作符:

(1)typeid操作符,返回指针和引用所指的实际类型。

(2)dynamic_cast操作符,将基类类型的指针或引用安全地转换为派生类型的指针或引用。

http://baike.baidu.com/view/1042388.htm?fr=aladdin

14.MSDN

MSDN 的全称是Microsoft Developer Network。这是微软公司面向软件开发者的一种信息服务。

15.宏、宏定义

宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。宏定义将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。宏替换在预编译阶段执行。

16.Appwizard

AppWizard 是用类别名称和源程序名产生Windows 应用程序的一个工作向导,整装了程序并作成向导的程序产生器。

17.SDK

SDK(SoftwareDevelopment Kit, 即软件开发工具包 )一般是一些被软件工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。

18.远程注入DLL

为了隐藏自身的进程信息,我们希望将进程作为一个合法进程的线程运行。由于系统进程间不允许直接操作资源,因而我们需要在合法进程内部创建一个线程,为其指定要执行的代码。一种简单的方式是令远程线程载入一个我们编写的DLL,通过DllMain()函数执行我们需要的代码。基本思路是将LoadLibrary()函数作为一个线程函数来调用:

CreateRemoteThread()---->LoadLibrary()---->DllMain()

19.事件驱动机制

事件驱动程序设计是密切围绕消息的产生与处理而展开的,一条消息是关于发生的事件的消息。

Windows操作系统为每一个正在运行的应用程序保持有一个消息队列。当有事件发生后,Windows并不是将这个激发事件直接送给应用程序,而是先将其翻译成一个Windows消息,然后再把这个消息加入到这个应用程序的消息队列中去。应用程序需要通过消息循环来接收这些消息。

20.进程间通信方法

文件映射、共享内存、匿名通道、命名通道、邮件槽、剪贴板、动态数据交换

对象连接与嵌入OLE、动态链接库、远程过程调用

http://blog.youkuaiyun.com/weiwangchao_/article/details/7104940

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值