l 窗口是屏幕上的一块矩形区域,是windows应用程序与用户进行交互的接口。
l 窗口可以分为客户区和非客户区。
l 在windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。
l 句柄
http://blog.csdn.net/huanjieshuijing/archive/2007/09/03/1770735.aspx
1。句柄,是整个windows编程的基础,一个句柄是指使用的一个唯一的整数值,是指一个四字节长的数值,用于标志应用程序中的不同对象和同类对象中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息。
2。句柄不是一个指针,程序不能利用它句柄来直接阅读文件中的信息。如果句柄不用在I/O文件中,它是毫无用处的。
3。句柄是windows用来标志应用程序中建立的或是使用的唯一整数,windows使用了大量的句柄来来标志很多对象。
l Windows程序设计是一种事件驱动方式的程序设计模式,主要是基于消息的。
l 消息:在windows程序中,消息是由MSG结构体来表示的。
l 消息队列:每个windows程序开始执行后,系统都会为改程序创建一个消息队列。
l 进队消息和不进队消息
l 回调函数: Callback Function
回调函数是应用程序提供给Windows系统DLL或其它DLL调用的函数,一般用于截获消息、获取系统信息或处理异步事件。应用程序把回调函数的地址指针告诉DLL,而DLL在适当的时候会调用该函数。回调函数必须遵守事先规定好的参数格式和传递方式,否则DLL一调用它就会引起程序或系统的崩溃。通常情况下,回调函数采用标准WindowsAPI的调用方式,即__stdcall,当然,DLL编制者可以自己定义调用方式,但客户程序也必须遵守相同的规定。在__stdcall方式下,函数的参数按从右到左的顺序压入堆栈,除了明确指明是指针或引用外,参数都按值传递,函数返回之前自己负责把参数从堆栈中弹出。
理解回调函数!
程序在调用一个函数(function)时(通常指api).相当于程序(program)呼叫(Call)了一个函数(function)关系表示如下:
call(调用)
program --------------------→ dll
程序在调用一个函数时,将自己的函数的地址作为参数传递给程序调用的函数时(那么这个自己的函数称回调函数).需要回调函数的 DLL 函数往往是一些必须重复执行某些操作的函数.关系表示如下:
call(调用)
program --------------------→ dll
↑ ¦
¦_______________________________¦
callback(回调)
当你调用的函数在传递返回值给回调函数时,你就可以利用回调函数来处理或完成一定的操作。至于如何定义自己的回调函数,跟具体使用的API函数有关,很多不同类别的回调函数有各种各样的参数,有关这些参数的描述一般在帮助中有说明回调函数的参数和返回值等.其实简单说回调函数就是你所写的函数满足一定条件后,被DLL调用!
也有这样的说法(比较容易理解):
回调函数就好像是一个中断处理函数,系统在符合你设定的条件时自动调用。为此,你需要做三件事:
1. 声明;
2. 定义;
3. 设置触发条件,就是在你的函数中把你的回调函数名称转化为地址作为一个参数,以便于DLL调用。
l 回调函数实现机制。(p7)
l _stdcall 和 _cdecl
l 在vc++中,资源是通过标识符(ID)来标识的。同一个ID可以标识多个不同的资源。
l 菜单并不是一个窗口。http://topic.csdn.net/t/20030429/17/1722818.html
l 为什么要注册窗口类?
每一个窗口对应一个窗口过程,而该窗口过程是被所有使用这个窗口类的窗口所共享的。每一个进程在要创建窗口之前,必须要先注册改窗口所属的窗口类。注册窗口类就是将窗口过程,窗口风格以及其他窗口属性用一个类名相关连起来。当进程在CreateWindow, CreateWindowEx中使用窗口类名时,所创建的窗口属性就和窗口类中的各属性相联系了。只有注册了窗口类,Windows才知道这个窗口的一些属性,以及窗口的处理函数啊。
l 如果窗口注册成功,CreateWindow函数将返回操作系统为该窗口分配的句柄,佛则否则返回NULL.
l (1)操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。
l (2)应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。
l (3)应用程序调用DispatchMessage,将消息回传给操作系统。消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage函数总能进行正确的传递。
l (4)系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理(即“系统给应用程序发送了消息”)。
l 注意:消息映射为什么不是虚函数呢?
答:C++有一个名为vtable的虚函数分发表。如果用虚函数发送消息CWnd将为超过100个消息来申明虚函数,对于没个虚函数,vtable中对应有4个字节,那么应用程序将需要400多个字节的表来支持虚拟消息处理函数。所以为了避免大型的vtable,MFC使用宏来把WINDOWS消息连接到C++成员函数。MFC消息处理程序需要函数原型,函数体和在消息映射中的输入项(宏调用),ClassWizard帮助我们将消息处理程序添加到类中。
l