继注册窗体类、创建窗体往下讲。
我们用Visual Studio创建一个win32项目上会自动生成一个消息处理函数。如下:
//
// 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 目的: 处理主窗口的消息。
//
// WM_COMMAND - 处理应用程序菜单
// WM_PAINT - 绘制主窗口
// WM_DESTROY - 发送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
先看概念:
1)基于消息的事件驱动机制c++中的Windows应用是基于消息的事件驱动的,它不是由事件的顺序来控制,而是由事件的发生来控制,而事件的发生是随机的,不确定的,并没有预定的顺序,这样就允许程序的用户用各种合理的顺序来安排程序的流程。事件驱动围绕这消息的产生与处理展开,一条消息是关于发生的事件的消息,事件驱动是靠消息循环机制来实现的。因此,也有这种说法:c++是消息驱动的,Java和C#是事件驱动的。但其本质的一样的,应为消息是一种报告有关事件发生的通知。
Windows应用程序的消息来源有以下四种:
(1)
输入消息:包括键盘和鼠标的输入。者一类消息先放在系统消息队列中,然后由Windows将他们送入应用程序的消息队列中,有应用程序开处理消息。
(2)
控制消息:用来与windows的控制对象(如列表框、按钮
、复选框等)进行双向通信。这类消息一般不经过应用程序消息队列,而是直接发到控制对象上去。
(3)
系统消息:对程序化的事件和系统时钟中断等做出
反应。(4)用户消息:程序员自己定义并在应用程序中主动发出的,一般由应用程序的某一部分内部处理。
2)MSG结构类型
在Windows应用中,为了实现消息机制,定义了新的结构类型MSG,表示消息类型,如下:
typedef struct {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG,*PMSG;
该结构包含六个域,其中:
hWnd为接受消息的窗口句柄。
message是特定的消息代码。它用一个32为整形值来表示不同的消息,这些消息在windows.h文件中用常量宏名进行定义。
wParam和lParam是与消息连在一起的两个32为福建消息。
time和pt分别表示消息投递到消息队列中的时间和鼠标的当前位置。
3)消息循环
什么是消息队列
?Windows是一个面向对象的系统,即系统内的所有信息交换都是靠传送和接受消息进行的。消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
Windows由两种消息队列,一种是整个系统的消息队列,另一种是为每个线程提供的线程消息队列。
队列被看一个循环缓冲区,当一个程序装入内存后,Windows操作系统为每个线程分配一个消息队列。每个程序必须通过向消息队列发送消息,有系统决定是否马上响应这些请求的消息,并通过回调窗口函数来完成窗口中的某些功能。
在消息循环中,首先,调用GetMessage函数,从消息队列中获取一个消息,并把它放在msg这个消息结构变量中。GetMessage函数的原型如下:
BOOL GetMessage(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)
参数:
lpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。
hWnd:取得其消息的窗口的句柄。当其值取NULL时,GetMessage为任何属于调用线程的窗口检索消息,线程消息通过PostThreadMessage寄送给调用线程。
wMsgFilterMin:指定被检索的最小消息值的整数。
wMsgFilterMax:指定被检索的最大消息值的整数。
返回值:如果函数取得WM_QUIT之外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。例如,当hWnd是无效的窗口句柄或lpMsg是无效的指针时。
在循环体内,对获取的消息调用TranslateAccelerator函数先进行处理,该函数的功能是处理菜单中的快捷键消息。Win32框架自动生成的代码,它带有一些基本处理,如
TranslateAccelerator函数,应为一般的函数都要用到菜单和快件键。
再来看代码:
(1)首先是对于LRESULT的理解
LRESULT是一个数据类型:
指的是从窗口程序或者回调函数返回的32位值
在winnt.h中typedef long LONG; 在windef.h中typedef LONG LRESULT;
所以LRESULT就是long,也就是长整形
之所以取名类LRESULT,L=>long 。 result表示结果,说明这个函数的返回值是某个结果。
(2)对于CALLBACK的理解:
#defineCALLBACK__stdcall
由此可以看出这儿的CALLBACK指的函数调用规范。
可以看出该函数的作用就是通过catch来对不同的消息进行相应的处理
下一节:回调机制
分享到:
相关推荐
在“C++中级与Windows编程”这一主题中,我们探讨的是如何使用C++语言进行高效且复杂的Windows应用程序开发。这通常涉及到对C++语言的深入理解以及Windows API的使用。以下是一些关键的知识点: 1. **C++基础知识**...
在Windows编程领域,Windows API(应用程序接口)是开发者与操作系统交互的核心工具,特别是使用C++进行开发时。Windows API提供了一系列的函数、数据结构和消息机制,使得开发者能够创建具有图形用户界面(GUI)的...
《Visual C++编程之道》是一本深入探讨C++编程在Visual Studio环境下的专业书籍,它涵盖了从基础到高级的各种主题,旨在帮助读者掌握利用Visual C++进行高效开发的技巧和最佳实践。书中不仅讲解了C++语言的核心概念...
学习Windows编程,理解和掌握API调用是基础,例如CreateProcess、CreateThread、WriteFile等。 2. **Win32进程和线程**:在Windows下,进程和线程是程序执行的基本单位。理解它们的创建、管理、同步和通信机制是...
本书覆盖了广泛的Windows编程技术,包括但不限于窗口管理、消息处理、图形用户界面设计等。 #### 二、版权信息与出版详情 - **出版社:** Packt Publishing - **版权所有:** ©2016 Packt Publishing - **首次出版...
通过这份笔试宝典,你不仅可以巩固C++语言基础,还能加深对Windows编程的理解,特别是对于那些打算从事桌面应用开发的程序员来说,这些都是必不可少的知识。同时,这些题目和解答也将帮助你在面试中脱颖而出,提升...
2. **数据结构与算法**:游戏编程中常用的数据结构如数组、链表、树、图以及各种排序和搜索算法,如二分查找、快速排序等,对优化游戏性能至关重要。 3. **图形学与OpenGL**:C++游戏编程往往涉及到计算机图形学,...
本资源是关于青少年C++趣味入门的第二课堂第二讲,主要讲述for循环的使用和应用。for循环是一种常用的循环语句,用于重复执行某些操作。通过for循环,我们可以实现多次重复的操作,从而提高编程效率。 在本资源中,...
C++中,这通常通过消息循环和消息队列实现,其中`GetMessage`、`TranslateMessage`和`DispatchMessage`是关键函数。 3. **窗口类和窗口实例**:在Windows编程中,窗口是应用程序的基本界面元素。窗口类定义了窗口的...
这个CHM文件可能包含了MFC的基本结构、类库的使用、对话框、控件、文档/视图架构等主题的详细讲解,对于熟悉MFC编程和创建Windows GUI程序非常有帮助。 “怎样优化Pentium系列处理器的代码.html”和"How to ...
在学习C++的过程中,首先要理解基本的语法结构,包括变量、常量、数据类型、运算符、流程控制(如if语句、switch语句、循环等)。接着,深入学习类和对象的概念,这是C++的核心,也是面向对象编程的基础。同时,掌握...
- 详述消息队列和消息循环,理解它们在处理用户输入中的作用。 - 学习如何处理各种窗口消息,如WM_CREATE、WM_PAINT和WM_DESTROY等。 3. **第三章:图形设备接口(GDI)** - GDI的概述,它是Windows系统用于绘制...
**4.1.2 消息结构和消息处理** ##### 消息的结构 为了处理消息队列中的消息,Windows提供了一个名为`MSG`的数据结构。这个结构体包含了接收消息所需的所有必要信息,如接收消息的窗口句柄、消息标识、消息参数等。...
4. **事件驱动编程**:Windows 程序通常是基于消息的事件驱动模式,通过消息循环和消息队列处理用户输入和其他事件。 学习这些内容,你可以从基础的变量定义、控制结构开始,逐步深入到函数、指针、内存管理、类和...
8. **事件处理和消息循环**:在Shell编程中,正确处理系统和用户的事件是必要的。理解和实现消息循环、消息队列以及WM_COMMAND、WM_NOTIFY等消息处理是核心技能之一。 9. **调试和测试**:由于Shell编程涉及到操作...
消息队列和消息循环是实现这一模型的关键。 4. **COM(Component Object Model)和ATL(Active Template Library)**:COM是微软提出的一种组件技术,允许不同进程间的对象交互。ATL是微软为简化COM对象创建而设计...
我们需要理解窗口过程(Window Procedure)、消息队列和消息循环的概念,以及如何使用`CreateWindow`和`DefWindowProc`等函数创建和管理窗口。 2. **线程和进程**:Windows操作系统是多任务、多线程的。理解进程...
根据提供的文件信息,我们可以推断出这是一份关于C语言和C++编程在Windows 7系统上兼容性的资源。下面将详细介绍与标题、描述及标签相关的知识点。 ### 一、C语言简介 C语言是一种通用的、过程化的编程语言,具有...
1. **C++语言基础**:教程会首先介绍C++的基础语法,包括变量、数据类型、运算符、控制结构(如if语句和循环)、函数以及类和对象的概念。 2. **MFC(Microsoft Foundation Classes)框架**:MFC是Visual C++ 6.0中...
这个资源旨在帮助那些希望通过C++语言进入游戏开发领域的学习者,让他们能够理解游戏编程的基本概念、技术和流程。 描述中的“VC++6游戏编程.chm”文件很可能是一个帮助文档,使用了CHM(Compiled HTML Help)格式...