一、windows程序基础
1. Windows程序的特点
1.用户界面统一、友好
2.支持多任务:允许用户同时运行多个应用程序(窗口)
3.独立于设备的图形操作
使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异,提供了设备无关的图形输出能力
4.队列化消息输入,支持队列特征的消息驱动模型
把从键盘、鼠标等输入设备接收的输入信息放入应用程序的队列中; Windows操作系统管理队列;应用程序需要输入信息时,不读硬件端口,只读消息队列。
5.事件驱动的程序设计
- Windows程序由事件的发展控制,允许程序的用户用各种合理的顺序来安排程序的流程。
6.资源共享
-各个应用程序共享系统提供的资源,包括设备上下文、画刷、画笔、字体、对话框、图标、定时器、通信端口。
7.程序和资源分开
-菜单、对话框、位图等可视对象被单独分离出来加公的,全部资源定义都放在资源文件中(通常以.rc为后缀名)
8.支持应用程序间的数据交换
2. 一个简单的Windows应用程序
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINS TANCE
hPrevInstance, LPSTR IpCmdLine, int nCmdShow)
{
MessageBox (NULL, "你好,我的Visual C++世界! ", "问候",MB_ OKCANCEL);
return 0 ;
}
运行结果:
3.事件及事件驱动
●Windows系统也叫事件驱动的系统。当用户按下一个键、移动鼠标或单击鼠标按钮时,计算机通知Windows系统已经发生了一一个事件,以及事件的种类、发生的时间、发生的位置(如坐标值)。
●事件通常以下列三种方式产生:
-通过输入设备,如键盘和鼠标;
-通过屏幕上可视的对象,如菜单、工具栏按钮、动条和对话框上的控件;
-来自Windows内部,如当一个后面的窗口显示到窗口前面时。
基于事件驱动的程序模型
4.消息
●当Windows捕获一 条事件后 ,它会编写一条消息,将相关信息放入一个数据结构MSG中,然后将包含此数据结构的消息发给需要消息的程序。。
●消息处理是Windows应用程序的核心。
●消息是操作系统通知应用程序某件事情已经发生的一种方式。
●Windows消息是在Windows.h文件中用宏定义的常数。
●消息常数名常以WM_ 开头,格式为WM_XX。
(1)Windows消息来源
Windows应用程序的消息来源于以下四种:
(1)输入消息:键盘和鼠标的输入。此类消息先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由应用程序来处理消息。
(2)控制消息:与Windows的控制对象,如列表框、复选框等进行双向通信。这类消息一般不经过应用程序的消息队列,而是直接发送到控制对象。
(3)系统消息:对程序化的事件或系统时钟中断作出的一些反应。
(4)用户消息:程序员自己定义并在应用程序中主动发生的,一般由应用程序的某一部分内部处理。
VC+ +存在几种系统定义的消息分类,不同的前缀符号经常用于识别不同的消息类,系统定义的消息宏前缀如下:
BM :按钮控制消息
CB :组合框控制消息
DM :默认下压式按钮控制消息
EM :编辑控制消息
LB :列表框控制消息
SBM :滚动条控制消息
WM :窗口控制消息
(2)Windows消息数据结构
消息号:由事先定义好的消息名标识
字参数(wParam) :用于提供消息的附加信息
长字参数(IParam) :用于提供消息的附加信息
Windows消息的数据结构
typedef struct tagMSG
{
HWND hwnd; //窗口句柄,为nul则可检索所有驻留在消息队交中的消息
UINT message; //消息值,由Windows h头文件中的宏定义标识
WPARAM wParam; //包含有关消息的附加信息,不同消息其值不同
LPARAM IParam;
DWORD time; 1指定消息送至队列的时间
POINT p:/消息发送时屏幕光标位置,POINT是一个结构体
}MSG;
注意:字参与长字参是作为消息的附加信息的,它与具体消息号的值有关;Windows中消息用结构体MSG表示;DWORD是32位无符号整型;
POINT是一个结构体:
typedef struct tagPOINT
{
LONGX;
LONG y;
}POINT,
二、消息队列和API
1. Windows消息队列
●当产生某消息时,该消息进入消息队列,操作系统根据消息提供的信息值决定由哪个应用程序来处理;
●应用程序按一定的方式查找应用程序中各个类的消息映射(一组宏,用来确定某个消息及相应的处理程序;的对应关系) ;
●找到处理程序后,由处理程序执行相应的操作。
●消息队列是一一个系统定义的内存块,用于临时存储消息,或把消息直接发给窗口函数。
●每个窗口维护自己的消息队列,并从队列中取出消息,利用窗口函数进行处理。
2. Windows程序常用消息
( 1 )标准Windows消息(前缀为WM_ )
分为三类:鼠标消息、键盘消息和窗口消息
(2)控件消息
控件或其他子窗口向父窗口发送WM_ COMMAND消息
(3 )命令消息
菜单项、工具栏按钮、加速键等用户界面对象发送的WM_ COMMAND消息。
●焦点消息: WM_ SETFOCUS,WM_ KILLFOCUS
●定时器消息: WM_ TIMER
( 1 )标准Windows消息- -鼠标消息
-WM_ LBUTTONDOWN :单击鼠标左键时产生的消息
-WM_ LBUTTONUP :放开鼠标左键时产生的消息
-WM_ RBUTTONDOWN ;单击鼠标右键时产生的消息
-WM_ RBUTTONUP :放开鼠标右键时产生的消息
-WM_ LBUTTONDBLCLK :双击鼠标左键时产生的消息
-WM_ RBUTTONDBLCLK :双击鼠标右键时产生的
-WM_ MOUSEMOVE :鼠标在窗C中移动时产生的
( 1 )标准Windows消息- -键盘消息
-WM_KEYDOWN :按下一一个非系统键时产生的消息,附加信息参数wParam为按下键的虚拟键码,虚拟键码用以标识按下或释放的键, IParam记录按键的重复次数、扫描码等状态信息;
- WM_KEYUP :弹起一个非系统键时产生的消息
- WM_CHAR :按下一个非系统键时产生的消息加信息参数wParam为按下键的ASCII码,IPare的意思同上;
( 1 )标准Windows消息- -窗口消息
- WM_CREATE : CreateWindows函数产生的消息;
-WM_CLOSE :关闭窗口时产生的消息;
- WM_DESTROY :消除窗口时由DestroyWindows()发出的消息
- WM_QUIT :退出应用程序时由PostQuitMessage()发出的消息
- WM_ PAINT ; Windows系统需重绘时产生的消息。
- WM_ SIZE
- WM_MOVE