一.WINAPI解析
#define WINAPI __stdcall
该语句指定了一个调用约定,包括如何生成机器代码以在堆栈中放置函数调用的参数,许多windows函数调用声明为WINAPI
注意:#define CALLBACK __stdcall
CALLBACK也定义成__stdcall,但CALLBACK常用于回调函数,比如说窗口过程
例如:
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wparam,LPARAM lParam)
{
........................
..........................
}
具体用WINAPI还是CALLBACK更加具体情况,方便记忆原则,比如说callback,看名次就知道是回调函数,使用WINAPI就没那么明显了
二.消息与窗口
1.窗口分类:
桌面上最明显的窗口就是应用程序窗口。这些窗口含有显示程序名称的标题列、菜单甚至可能还有工具列和滚动条。
另一类窗口是对话框,它可以有标题列也可以没有标题列。
装饰对话框表面的还有各式各样的按键、单选按钮、复选框、清单方块、滚动条和文字输入区域。其中每一个小的视觉对象都是一个窗口。更确切地说,这些都称为「子窗口」或「控件窗口」或「子窗口控件」。
2.windows给程序发送消息
当窗口发生改变时,比如调整了窗口的大小,窗口文本改变等,windows感应这一消息,把这个消息发送给到程序的消息队列中(该消息对列用来存放该程序可能创建的各种不同窗口的消息),应用程序从消息队列中取出这条消息,然后经过转换,重新发给windows系统,系统调用相应的一个窗口过程(父窗口调用父窗口窗口过程,子窗口调用子窗口处理过程),对消息进行处理。
窗口通常是在窗口类的基础上建立的。窗口类标识了处理窗口消息的窗口过程。使用窗口类使多个窗口能够属于同一个窗口类,并使用同一个窗口过程。例如,所有Windows程序中的所有按钮均依据同一个窗口类。这个窗口类与一个处理所有按钮消息的窗口过程(位于Windows的动态链接库中)联结。在创建这些按钮的时候,都需要指定他们的父窗口(createwindow函数中有一个父窗口句柄参数,需要设置)
注意:
有些消息是不会进入对列的
例如:
sendmessage()函数直接调用相应的窗口过程(windows不会感应)
updatewindow()函数会产生WM_PAINT消息,windows进行感应这消息后,也不进入队
直接调用相应的窗口过程,对wm_paint消息进行处理,其它产生wm_
paint消息,则需要入队
iddialogmessage()函数仍然会进入队列,但程序取出消息后,进行判断,若是指定的消息,则立即调用窗口过程,对消息进行
处理,不需要经过转换和分发阶段
translateaccelerator()函数仍然会进入队列,但程序取出消息后,进行判断,若是WM_KEYDOWN货WM_SYSDEYDOWN消息,则把这消息转换为WM_COMMAND消息,然后立即调用窗口过程,对消息进行处理,不需要经过转换和分发阶段