MFC学习之windows内部运行机制

来源:互联网 发布:天猫数据分析表格 编辑:程序博客网 时间:2024/05/23 12:10

一、基本概念

windows的程序离不开窗口,那么一个窗口是靠什么来标识的呢,就是窗口句柄。

句柄是一个很重要的概念,通俗的说,系统 中有各种的资源,比如窗口,图标等等,当我们要创建这些资源的时候,系统就会为这些资源分配内存并且返回一个标识这些资源的标号,这个标号就是所谓的句柄。我觉得类似指针的概念,当我们在创建资源的时候,我们一定要返回一个标识符,不然的话我们创建的这个在以后的程序中找不到了还创建他做什么呢。句柄的概念主要是针对资源来说的,不同的资源有着不同的句柄。比如。窗口句柄,光标句柄等等。


消息和消息队列

函数和系统之前可能会存在相互的调用,那么这种调用就是靠着消息来进行的。通过消息的传递实现调用

在程序中,消息是有msg结构体来表示的。

MSG的结构可以参照MSDN中的实例。(学windows不装msdn就是傻叉)


消息队列:

每个应用程序开始执行之后系统都会为他创建一个小弟队列, 用来接收消息。程序会从消息队列中取出消息然后进行响应。程序会不断的从消息队列中取出消息来处理。


WinMain函数

WinMain函数就相当于windows程序中的主函数。也就是说,当系统开始执行这个程序的时候首先执行的是这个程序的WinMain函数。




二、窗口的创建

窗口的创建基本分为几个步骤

1、窗口类的创建

2、注册窗口类

3、创建窗口

3、显示以及更新窗口

窗口类的创建,就类似于一个窗口的骨架的创建,在创建窗口的时候并不是什么东西都需要我们自己来定义,而是有很多东西都是windows为我们写好的,我们只要把我们想设置这个窗口的特性的相关参数像填空一样填写进去就可以。

那么在C语言中,我们很自然的就要用到的是结构体这种类型。在用C语言去实现面向对象特性的时候,类这个概念在C语言中就是用结构体来实现的。

一个窗口的特征就是用wndclass这个结构体来定义的。

这个结构体有很多的变量,分别就代表了这个窗口的一些属性,我们可以自由的设置这些属性。


我们在使用一些变量的时候,可能会遇到一些用位表示的变化来说明不同特性的变量。假设一个字节有8位,那么这八位的位模式将有很多种组合,如果让每一种组合(位模式只有一位为1的组合)代表一个特性的话,那么仅仅用一个字节就能够表示很多种不同的类型提供我们使用。但是这些数字都不是很好记,那么千万别忘了我们在C语言中还有一个神奇就是宏定义,我们可以将这些数字常量宏定义位不同的名字,以便我们能够很容易的使用。

由于每一种位模式只有一个位唯一,每一种位模式如果都代表一种窗口类型的话,那么在真正的绘制窗口的过程中,如果我们想让这个窗口同时拥有几种样式,那么我们就用或运算符|来组合这些位模式,达到同时设置几个类型的目的。

由于每种类型的位模式只有一位为1,那么如果我想去掉一种类型的话,就用这个类型的位模式取反再做与的操作,那么由于0&&1 == 0所以我们就会达到取消一种类型的目的。


在每一个窗口中,比如我们点击窗口的某个位置等等,都会生成一个消息,那么这个消息在窗口中怎么被处理呢,就会调用与这个窗口绑定的回调函数,也成为窗口过程函数。当窗口收到I一个消息的时候,就会自动调用这个回调函数,以便处理这个消息。


在对窗口类的其他的成员赋值之后,我们就要注册窗口类,我理解的注册窗口类的功能可能就是让操作系统去得知和了解一下我们已经建立了这个窗口类的一些信息,比如在注册窗口类之后,他会知道我们为回调函数指定的函数地址。

窗口类设计好了,也被注册了,那么现在就可以利用这个窗口类的一些功能来创建一个真正的窗口了。


创建窗口主要用到的就是createwindow,里面的很多参数可以去MSDN查找,很好写。

创建窗口完成之后,窗口并没有显示出来,这就证明我们需要调用showwindow和updatewindow这两个函数来表示和更新窗口,这样我们创建的窗口才会显示出来。


创建了窗口之后,我们难免会对这个窗口做出一些动作,触发一些事件。

我们知道window程序都是用消息来传递信息的。每一个应用程序也都有一个消息队列,这个应用程序会不断的从消息队列中取出消息进行响应。

程序是用getmessage这个函数来从消息队列中取出数据的,这个函数只有取到wm_quit也就是这个程序要退出的消息时才会返回一个0值,其余的正常情况下返回大于0的非0值,出现错误的时候可能会返回一个负数值。

在消息队列这一块,和他一起搭配使用的还有两个函数

一个是translatemessage,另外一个是dispathmessage。前一个函数会把我们做出操作的虚拟按键转化为字符消息,也就是我们按下按键的那个键盘上面的字符是什么,他会产生一个新的wm_char消息投递到消息队列里面且不会改变原有的消息。后一个则会将一个消息传递给操作系统,又操作系统调用我们之前定义的一个过程函数进行处理。

在窗口过程函数中一般来说都会用switch语句进行处理不同的消息。


在书写窗口过程函数的时候,如果我们需要在窗口上画图形,或者写文字的时候,通常会用到一个叫做DC的结构体,它是设备描述表。因为不同的底层设备会有不同的驱动以及使用方式,在画图的时候如果没有DC那我们就需要去学习每一种设备的用法。但是有了DC对象之后,我们可以让DC去与各种图形设备打交道到,我们只要告诉DC要画一个什么图形就可以了,这样剩下的工作就有DC和图形绘制设备来负责了。DC也是一种资源。DC就相当于程序员和物理设备之间交流的媒介,他屏蔽了很多底层设备的复杂性,能够让我们更好的使用。


0 0
原创粉丝点击