相当伤心,本来写了很多的,结果这天杀的新浪…只好重新写了,呼

刚才我们说了Windows编程的基础知识和名词解释,我们现在继续讲述WIN编程的消息机制.

###WIN消息机制

  1. Windows系统我们可以看做是一个消息驱动的操作系统.而实质上它的确就是这样运做的.系统程序记录我们的一切操作信息,并将其翻译发布后堆放在消息队列中,每个应用程序从消息队列中获得自己关心的消息,并对其进行相应的处理.

  2. 消息MSG是由ID和两个消息参数(WPARAM,LPARAM)构成的,当消息被应用程序的窗口获得,该窗口将调用WndProc消息处理函数来对相应消息进行具体处理.我们这里可以看看MSG这个结构体包含的信息

    typedef struct tagMSG{ //消息结构体 HWND hwnd; //窗口的句柄,用来锁定此消息是针对哪个窗口 UINT message; //消息的类型,仅仅可以使用低位数,高位数是由系统来使用的 WPARAM wParam; //消息的额外信息,它由消息的类型来决定 LPARAM lParam; //消息的额外信息,它也由消息的类型来决定 DWORD time; //投递消息的时间 PIONT pt; //投递消息时,鼠标的位置 }MSG;

举例来说吧,当我们按下键盘上的”L”键,那么此时WM_KEYDOWN消息将由系统程序发送到应用程序的当前窗口,此时wParam中的信息就是”L”,当我们按下鼠标左键,此时系统程序将发送WM_LBUTTONDOWN消息给应用程序的当前窗口,而LPARAM参数的低16位和高16位则分别纪录了鼠标点击时的x坐标和y坐标,我们根据x,y的坐标范围,可以确定此时鼠标是否点中了我们设置的按钮,若符合,则进行一些的确定后的程序运行,若不符合,则进行下一个判断,若都不符合,说明鼠标左键按下的位置是无关紧要的,我们没必要使用消息回调函数对其进行相应的处理.

###常见的Windows消息我在此列表

  • WM_CREATE 应用程序创建一个窗口
  • WM_DESTROY 销毁一个窗口
  • WM_MOVE 移动一个窗口
  • WM_SIZE 改变一个窗口的大小
  • WM_SETFOCUS 获得焦点后
  • WM_KILLFOCUS 失去焦点后
  • WM_ACTIVATE 一个窗口被激活或失去了激活状态
  • WM_ENABLE 改变了Enable状态
  • WM_SETREDRAW 设置窗口是否可以重画
  • WM_PAINT 要求一个程序重画自己
  • WM_CLOSE 当一个窗口或者程序即将关闭时,发送的信号
  • WM_QUIT 用于结束程序或者当程序调用了PostQuitMessage函数
  • WM_QUERYOPEN 当用户窗口恢复到原大小时,将此消息发送给窗口图标
  • WM_SHOWWINDOW 当想隐藏或显示某窗口时,将此消息发送给窗口
  • WM_SETFONT 当绘制文本时程序发送消息时可获得控件使用的颜色
  • WM_GETFONT 当绘制文本时程序发送此消息可获得控件使用的字体
  • WM_SETHOTKEY 应用程序发送此消息将让一个窗口和对应的热键相关联
  • WM_GETHOTKEY 应用程序发送此消息可获得一热键和此窗口是否有关联性
  • WM_KEYDOWN 按下一个键
  • WM_KEYUP 释放一个键
  • WM_CHAR 当按下一个键,并已发出WM_KEYDOWN,WM_KEYUP消息
  • WM_SYSKEYDOWN 按下ALT键的同时按下其他键
  • WM_TIMER 发生了定时器事件
  • WM_MOUSEMOVE 鼠标发生了移动
  • WM_LBUTTONDOWN 按下鼠标左键
  • WM_LBUTTONUP 释放鼠标左键
  • WM_LBUTTONDBLCLK 双击了鼠标左键
  • WM_RBUTTONDOWN 按下鼠标右键
  • WM_RBUTTONUP 释放鼠标右键
  • WM_RBUTTONDBLCLK 双击了鼠标右键
  • WM_MBUTTONDOWN 按下鼠标中键
  • WM_MBUTTONUP 释放鼠标中键
  • WM_MBUTTONDBLCLK 双击鼠标中键
  • WM_MOUSEWHEEL 鼠标滚轮发生转动
  • WM_CAPTURECHANGED 失去捕获的鼠标时发送此消息
  • WM_UNDO 撤消最后一次操作
  • WM_CLEAR 清除当前选择的内容
  • WM_PASTE 从剪切版上得到数据
  • WM_COPY 复制当前选择的文本
  • WM_USER 此消息能帮助应用程序自定义消息

呼,打的真累,这里仅仅是部分WIN自带的宏定义好的消息,当然我们也可以自定义消息>_<不过我想也不需要再自定义很多了吧

###消息队列

在上面我有说过,系统将消息发送到应用程序的消息队列中,应用程序从中获取自己关心的有效消息,并对其进行相应的处理.这里我们可以用一个死循环来让应用程序不停的从消息队列中获得消息.典型代码如下

while( GetMessage( &msg, NULL, 0, 0 ))
{
   TranslateMessage( &msg );
   DispatchMessage ( &msg );
}

其中具体的参数我会日后再详细解说,这里大家明白代码意义是,应用程序不停从消息队列中获取消息,并对其进行翻译解析和处理的功能.


下节将对WIN32窗口应用程序进行说明,制作出一个属于我们自己的窗口