VC++深入详解的学习
来源:互联网 发布:呼和浩特乾宇网络 编辑:程序博客网 时间:2024/05/23 01:14
Windows程序内部运行机制
WinMain函数是Windows程序的入口点函数,与DOS程序的入口点哈市南湖main的作用相同,当WinMain函数结束或返回时,Windows应用程序结束。
一个实现的功能为创建一个窗口,并在该窗口中响应键盘及鼠标消息的Win32程序实现的步骤为:
·1 WinMain函数的定义;
·2 创建一个窗口;
·3 进行消息循环;
·4 编写窗口过程函数。
WinMain函数的原型声明:
int WINAPI WinMain(
HINSTANCE hInstance , //表示该程序当前运行的实例句柄,是一个数值
HINSTANCE hPrevInstance , //表示当前实例的前一个实例的句柄
LPSTR lpCmdLine , // 以空终止的字符串,指定传递给应用程序的命令行参数
int nCmdShow // 指定程序的窗口应该如何显示
) ;
注:WINAPI 实际就是_stdcall, _stdcall是函数调用约定(函数调用约定主要约束了两件事:一是参数传递的顺序,二是调用堆栈由谁(调用函数或被调用函数)清理)的一种,_stdcall表示1.参数从右向左压入堆栈,2.函数由调用者修改堆栈。相关介绍参见百度百科。
窗口的创建
创建一个完整的窗口,需要经过以下步骤:
1. 设计一个窗口类;
2. 注册窗口类;
3. 创建窗口;
4. 显示及更新窗口。
在创建一个窗口前,必须对该类型的窗口进行设计,指定窗口的相关特征,这就是窗口类的设计。
窗口的特征是由WNDCLASS结构体定义的,WNDCLASS结构体定义为:
tpyedef struct _WNDCLASS{
UINT style ; //该变量指定这一类型窗口的样式
WNDPROC lpfnWndProc ; //该变量是一个函数指针,指向窗口过程函数
int cbClsExtra ; //该变量为Windows为系统中的每一个窗口类管理一个WNDCLASS ,该变量用于存储类的附加信息。
int cbWndExtra ; //该变量为应用程序存储窗口所特有的数据的变量, 称之为窗口附加内存
HANDLE hInstance ; //该变量指定包含窗口过程的程序的实例句柄
HICON hIcon ; //指定窗口类的图标句柄,该变量为NULL时,系统将提供一个默认的图标
HCURSOR hCursor ; //指定窗口类的光标句柄
HBRUSH hbrBackground ; //指定窗口类的背景画刷句柄
LPCTSTR lpszMenuName ; //该变量是一个以空终止的字符串,指定菜单资源的名字(注:菜单并不是一个窗口)
LPCTSTR lpszClassName ; //该变量是一个以空终止的字符串,指定窗口类的名字
} WNDCLASS ;
注:窗口过程函数是一个回调函数,回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另一方调用的,用于对该事件或条件进行响应。
回调函数的实现机制: ·1 定义一个回调函数; ·2 提供函数实现的一方在初始化的时候,将回调函数的函数指针注册给调用者; ·3 当特定的事件或条件发生的时候,调用者使用指针调用回调函数对事件进行处理。
针对Windows的消息处理机制,窗口过程函数被调用的过程为: ·1 在设计窗口类的时候,将窗口过程函数的地址赋值给lpfnWndProc成员变量; ·2调用RegisterClass(&wndclass)注册窗口类,那么系统就有了该窗口函数的地址; ·3当应用程序接收到某一窗口的消息时,调用DispatchMessage( &msg)将消息回传给系统。系统则利用先前注册窗口类时得到的回调函数的指针,调用回调函数对消息进行处理。
基于一个窗口类创建的窗口使用同一个窗口过程函数。
注册窗口类:这相当于在设计窗口类之后,告知操作系统所设计的窗口类,以便在调用该窗口类创建窗口时,系统知道该窗口类已被设计出,并可以找到该窗口类的基本特征,去创建窗口。
调用RegisterClass函数对其进行注册,注册成功后方可创建该类型的窗口。注册函数的声明为:
ATOM RegisterClass( CONST WNDCLASS *lpWndClass ) ;
该函数的参数为所设计的窗口类对象的指针。
创建窗口:
使用CreateWindow函数创建该注册过的窗口类的窗口,该函数声明为:
HWND CreateWindow (
LPCTSTR lpClassName , //该参数指定窗口类的名称,即在设计窗口类时WNDCLASS结构体中lpszClassName成员变量所指定的名称
LPCTSTR lpWindowName , //指定窗口的名字,如果在窗口样式中指定标题栏,窗口的名字将 显示在标题栏上
DWORD dwStyle , //指定创建的窗口的样式,该变量表示的某个具体的窗口的样式
int x ,
int y ,
int nWidth ,
int nHeight , // x ,y ,nWidth ,nHeight分别指定窗口左上角的x,y坐标,窗口的宽度,高度。当x为CW_USEDEFAULT,系统将为窗口选择默认的左上角坐标并忽略y参数;当nWdith为CW_USEDEFAULT,系统将为窗口选择默认的宽度和高度,并忽略nHeight参数。
HWND hWndParent , //指定被创建窗口的父窗口句柄
HMENU hMenu , //指定窗口的菜单句柄
HANDLE hInstance , //指定窗口所属的应用程序实例的句柄
LPVOID lpParam //作为WM_CREATE消息的附加参数lParam传入的数据指针。注:在创建多文档界面的客户窗口时,lParam必须指向CLIENTCREATESTRUCT结构体。多数窗口将该参数设为NULL
) ;
最后显示及更新窗口
窗口创建之后,调用ShowWindow函数显示窗口,该函数声明为
BOOL ShowWindow (
HWND hWnd, //创建窗口后返回的窗口句柄
int nCmdShow //指定窗口显示的状态
) ;
更新窗口,在调用ShowWindow函数之后,紧接着调用UpdateWindow函数来刷新窗口,该函数声明为
BOOL UpdateWindow (
HWND hWnd //指定的是创建成功后的窗口的句柄
) ;
UpdateWindow函数通过发送一个WM_PAINT消息来刷新窗口(发送给窗口过程函数进行处理,并没有放到消息队列里)。
总结:创建一个完整的窗口的过程为 ·1设计一个窗口类,这一步设计的是一类窗口的基本特征; ·2注册窗口类, 这一步是告知操作系统已设计好了一类窗口,当调用该类创建窗口时,系统知道该类的存在; ·3创建窗口,这一步时根据已注册的窗口类,创建具体的窗口,这一步涉及到所要创建的窗口的具体特征; ·4显示和更新窗口,将上步创建的窗口进行显示及更新。
- VC++深入详解的学习
- VC++深入详解的学习
- VC 深入详解 学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- 《VC++深入详解》学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习笔记
- VC++深入详解学习记录
- VC++深入详解学习笔记
- 《vc++深入详解》部分学习笔记
- VC++ 深入详解 学习笔记 对话框编程
- VC++深入详解第一章学习笔记
- vc++深入详解第二章学习笔记
- VC++深入详解第三章学习笔记
- 重新再写如何ios中解析xml文件
- 四色问题:证明、推广和应用
- aspnetpager复杂分页记录备忘
- 音视频参数解释
- java版本的expect: 简单方式实现ssh/telnet与服务器端的交互和自动化测试
- VC++深入详解的学习
- 多态
- 服务器tomcat报错:BAD packet signature 18245
- HQL总结
- MongoDB数据类型
- 输入浮空 输入上拉 输入下拉 模拟输入 开漏输出 推挽式输出 推挽式复用功能 开漏复用功能
- 基于UML的面向对象分析与设计方法
- memset函数使用注意事项
- 山东理工周赛 3 简单单调队列优化dp