Windows程序设计笔记-------调用约定

CreateWindow只是创建了一个窗口,在内存里面有了,而在屏幕上没。

UpdateWindow是将窗口显示在屏幕上。

一个非常重要的时刻:在创建窗口完成后(CreateWindow) 与显示窗口前(ShowWindow),即两CreateWindow函数中会发送一个重要的消息,也是第一个消息:WM_CREATE

在这个消息中,可以装载动态链接库(这是一个最好装载的点,程序已经在内存中,而且用户还不能使用)

 

WM_CREATE:消息属于不进队列的消息,

WM_PAINT:又有进队的又有不进队的,第一个WM_PAINT消息是在UpadteWindow函数中发的,不进入消息队列(因为还没执行到消息循环那里)

 

InvalidateRect:使指定的窗口区域无效,从而发送WM_PAINT消息引起指定的矩形区域重绘,不到万不得已不是用该函数,因为频繁使用该函数会使窗口发生严重的闪烁现象,而且是用该函数,尽量使无效的矩形区域大小最小则最好!

 

#define WM_USER 0x0400

 

对于鼠标双键“同时按下”,处理使要对称处理,及WM_LBUTTON和WM_RBUTTON中要分别进行处理,因为所谓同时按下是不可能的,所以存在着有个先后的判断。

 

 

 

WINAPICALLBACK

 

WINAPI见windef.h这个头文件

#define WINAPI__stdcall

默认情况下,我们的函数调用都是遵循__cdecl这个规则的。当然,也有__stdcall、__pascal等规则。(可以根据自己的需要在属性中设置调用约定!)

使用__stdcall还是__cdecl或__pascal,在纯Windows编程下并非特别需要。

__stdcall

1、进行函数调用,函数参数的入栈方式是最右边先入栈。

2、同时__stdcall规定,被调函数负责栈的回收(调用者只负责压栈). 题外话:__pascal的调用规则是从左到右,正好与__stdcall相反。

3、C调用约定(即用__cdecl关键字说明)(The Cdefault calling convention)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数vararg的函数(printf)只能使用该调用约定)当然,这些工作是应用程序自己完成的,不需要编写者动手。汇编语言另当别论(POP SP POP BP等)。另外,在函数名修饰约定方面也有所不同。 _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。

2MFC缺省调用约定

在函数调用过程中,会使用栈。__stdcall与__cdecl是两种不同的函数调用约定,定义了函数参数入栈的顺序,由调用函数还是被调用函数将参数弹出栈,以及产生函数修饰名的方法。关于这两个调用约定的详细信息,读者可参看MSDN。对于参数个数可变的函数,例如printf,使用的是__cdecl调用约定,Win32的API函数都遵循__stdcall调用约定。VC++开发环境中,默认的编译选项是__cdecl,对于那些需要__stdcall调用约定的函数,在声明时必须显式地加上__stdcall在Windows程序中,回调函数必须遵循__stdcall调用约定,所以我们在声明回调函数时要使用CALLBACK。使用CALLBACK而不是__stdcall的原因是为了告诉我们这是一个回调函数。注意,在Windows 98和Windows 2000下,声明窗口过程函数时,即使不使用CALLBACK也不会出错,但在Windows NT4.0下,则会出错

 

引用自:

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

 

 

WM_CLOSE----------DestroyWindow------>WM_DESTROY-------PostQuitMessage----->导致退出消息循环

 

需求分析

         分解问题:将一个大的问题划分为若干个小的子问题,形如洋葱剥皮一样,找到最内层的东西,也即最本质的东西,在此基础上逐步求解。就像找突破口一样,从这点入手,以达到目的。

你可能感兴趣的:(Win32)