Windows是一个基于消息的、事件驱动的操作系统。
在Windows下执行一个程序,只要用户进行了影响窗口的动作(如改变窗口大小或移动、单击鼠标等)该动作就 会触发一个相应的“事件”系统每次检测到一个事件时,就会给程序发送一个“消息”,如果是队列消息,则把这个消息放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统.
有人写了关于在窗口过程中处理消息的一段伪码
LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM)
{
switch(uMessageType)
{//使用SWITCH语句将各种消息分开
case(WM_PAINT):
doYourWindow(...);//在窗口需要重新绘制时进行输出
break;
case(WM_LBUTTONDOWN):
doYourWork(...);//在鼠标左键被按下时进行处理
break;
default:
callDefaultWndProc(...);//对于其它情况就让系统自己处理
break;
}
}
其实每个Windows 应用程序都是基于事件和消息的,而且包含一个主事件循环,它不停地、反复地检测是否有用户事件发生。每次检测到一个用户事件,程序就对该事件做出响应,处理完再等待下一个事件的发生。
Windows 下的应用程序不断地重复这一过程,直至用户终止程序,用代码来描述实际上也就是一个消息处理过程的while循环语句。
下面通过一个实例,来验证一下我说的
1. 打开我们的IDE,新建一个项目,命名为WindowsMessage
2. 在界面所在的类的头文件WindowsMessageDlg.h中声明定义一个消息
afx_msg void OnMouseClickEvent();
3.在WindowsMessage.cpp中映射该消息,使之与按钮 IDC_Test, 如下
ON_MESSAGE(IDC_Test,OnMouseClickEvent)
4.消息的实现息
void CWindowsMessageDlg::OnMouseClickEvent(){
AfxMessageBox("这是一个自定义事件的测试/n")
}
5.触发事件
当鼠标移动我们测试按钮时,我们触发这个事件
BOOL CDlgCls::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
if(pMsg->message==WM_MOUSEMOVE)
{
if(pMsg->hwnd==::GetDlgItem(m_hWnd,IDC_Test)) //获取按钮句柄
{
CWindowsMessageDlg::OnMouseClickEvent(); // 触发OnMouseClickEvent事件
}
}
return CDialog::PreTranslateMessage(pMsg);
}
Ctrl+F5,我们可以看到,当鼠标移动到按钮时
到此为止,一个自定义事件就完成了。我们回到前面所述再回忆一下前面所讲的消息机制
当鼠标移动到按钮时,就会触发相应的事件,就会发送消息OnMouseClickEvent,然后根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环,此时接收窗口就是窗口CWindowsMessageDlg,。此窗口会调用其窗口过程。调用相应的消息处理函数,本实例中就是弹出对话框
由于明天要上班….先写到这里了…..