visual c++在windows中的编程思想
visual c++在windows中的编程思想
Windows API(Application Programming Interface)是WIndows操作系统与应用程序之间的标准接口,它提供了上千个标准函数、宏和数据结构的定义。
API函数定义在一些动态链接库中(.DLL),其中,最主要的是User.dll、Gdi.dll和Kernel.dll 3个DLL文件。User.dll库中定义了窗口管理函数,包括窗口的创建、显示、移动等;Gdi.dll中定义了许多图形、图像设备函数(GDI),提供了与设备无关的图形绘制功能;Kernel.dll定义了系统服务函数,包括内存调度、进程管理等与操作系统有关的低层函数。
事件驱动程序
Windows操作系统是一个多任务操作系统,它可以同时运行多个程序,而且每一个程序都不可能独占系统资源。如用户可以一边处理Word,一边听MP3,只要机器的配置不是太低,用户绝对不会感觉到音乐是时断时续的。
多任务工作方式主要是通过事件驱动编程模式来完成的。事件驱动程序以窗口为中心,根据用户的不同操作激活处理相应函数以完成相应的任务。事件驱动是一种全新的程序设计方法,它不是由事件顺序来控制的,而是由事件的发生来控制的,而这种事件的发生是随机的、不确定的,并没有预定的顺序,这样就允许程序的用户用各种合理的顺序来安排程序的流程。
因此,可以总结出这样一条结论:Windows程序是面向用户的基于消息的事件驱动程序,而Windows应用程序的核心就是消息传递和消息处理。
消息概述
事件驱动是围绕着消息的产生与处理而展开的,消息是关于发生的事件的信息,而事件驱动是靠消息循环机制来实现的。
什么是消息呢?简单的说,消息是报告有关事件发生的通知。在Windows系统中,消息是一种Windows数据结构,其中包含有消息的名字、消息发生时的一些参数以及处理这个消息的函数的指针。
消息不仅可由Windows发出,也可由应用程序本身或其他程序产生,应用程序的消息还可以是自己定义的。Windows为每个应用程序都维护一个或多个消息队列,发送到每个程序窗口的消息都排成一个队列,称为消息队列。当某种事件发生时,Windows会根据事件发生的具体情况判断当前事件属于哪个程序,进而将对应的消息放入该程序的消息队列。应用程序轮流检测消息队列中的消息,但并不是每个消息都会由应用程序检测的,有些消息会让默认的窗口函数处理。

图1简单描述了这个过程。
图1 消息队列和在应用程序中的轮流处理
在Windows中提供了MSG结构来表示一个消息,MSG结构的定义如下:
typedef struct tagMSG{
HWND hWnd; //目标窗口句柄
UINT message; //消息标识
WPARAM wParam; //消息参数1
LPARAM lParam; //消息参数2
DWORD time; //消息发送时间
POINT pt; //消息发送时鼠标在屏幕上的坐标
//本教程来自http://www.isstudy.com
}MSG;
举个例子,例如现在需要关闭对话框窗口,读者可以向窗口发送一个WM_COMMAND消息,消息的参数是WM_DESTROY。或者向窗口发送一个WM_SYSCOMMAND消息,消息的参数是WC_CLOSE。
对话框(CDialog)类中提供虚函数PreTranslateMessage(),用这个函数可以截获或处理消息:
BOOL CMyDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
return CDialog::PreTranslateMessage(pMsg);
}
除了使用PreTranslateMessage()虚函数,读者还可以使用API函数发送消息,笔者常使用SendMessage()函数,它的格式如下:
SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
当用户单击按钮时,关闭标题为“消息实例”的窗口。
void CMyDlg::OnButton1()
{
CWnd* wnd=this->FindWindow(NULL,"消息实例"); //找到标题为"消息实例"的窗口
::SendMessage(wnd->GetSafeHwnd(),WM_SYSCOMMAND,SC_CLOSE,0);
}