您的位置:首页 > 编程语言 > C语言/C++

《VC++深入详解》读书笔记 第一章:Windows程序内部运行机制

2012-09-13 11:33 267 查看
1.1API与SDK

API:Application Programming Interface

SDK:Software Development Kit

1.2窗口与句柄

一个Windows应用程序至少要有一个窗口,称为主窗口。

一个应用程序窗口通常都包含标题栏、菜单栏、系统菜单、最大最小化框、可调边框、及滚动条。

窗口分为客户区和非客户区。

在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。句柄(HANDLE)。

1.3消息与消息队列

Windows程序设计是一种事件驱动方式的程序设计模式,主要是基于消息的。

在Windows程序中,消息是由MSG结构体来表示的。

typedf struct tagMSG{

HWND hwnd;//成员变量hwnd表示消息所属窗口

UINT message;//成员变量message指定了消息的标识符

WPARAM wParam;//用于指定消息的附加消息

LPARAM lParam;//用于指定消息的附加消息

DWORD time;//消息投递到消息队列中的时间

POINT pt;//鼠标当前位置

}MSG;

每一个Windows程序开始执行后,系统都会为该程序创建一个消息队列,这个消息队列用来存放该程序创建的窗口的消息。

Windows程序中的消息可以分为“进队消息”和“不进队消息”。

进队的消息由系统放入到应用程序的消息队列中,然后由应用程序取出并发送。

不进队消息在系统调用窗口过程时直接发送给窗口。

不论进队与否,消息最终都由系统调用窗口过程函数对消息进行处理。

1.4WinMain函数

WinMain函数是Windows程序的入口函数,当WinMain函数结束或返回时,Windows应用程序结束。

int WINAPI WinMain(

HINSTANCE hInstance,//程序当前运行的实例的句柄,这是一个数值

HINSTANCE hPrevInstance,//当前实例的前一个实例的句柄

LPSTR lpCmdLine,//指定传递给应用程序的命令行参数

int nCmdShow//指定窗口的显示方式

);

窗口的创建:1.设计窗口;2.注册窗口;3.创建窗口;4.显示窗口

设计窗口,Windows已经为我们定义好一个窗口应该具有的基本属性,我们只需要将要填充的部分填好窗口就设计好了。窗口的特征是通过结构体

WNDCLASS来定义的。

typedef structure _WNDCLASS{

UINT style;//指定这一类型窗口的样式

WNDPROC lpfnWndProc;//函数指针,指向窗口过程函数

int cbClsExtra;//Windows为系统中的每一个窗口类管理一个WNDCLASS结构

int cbWndExtra;//窗口附加内存

HANDLE hInstance;//指定包含窗口过程的程序的实例句柄

HICON hIcon;//指定窗口类的图标句柄

HCURSOR hCursor;//指定窗口类的光标句柄

HBRUSH hbrBackground;//指定窗口类的背景画刷句柄

LPCTSTR lpszMenuName;//一个以空终止的字符串,指定菜单资源的名字

LPCTSTR lpszClassName;//一个以空终止的字符串,指定窗口类的名字

}WNDCLASS;

注册窗口,窗口类(WNDCLASS)设计完后,需要调用RegisterClass函数进行注册。

ATOM RegisterClass(CONST WNDCLASS *lpWndClass);//*lpWndClass即窗口类对象的指针

创建窗口,设计并注册好窗口类之后,就可以用CreateWindow函数产生这种类型窗口。

HWND CreateWindow(

LPCTSTR lpClassName,//指定窗口类的名称

LPCTSTR lpWindowName,//指定窗口的名字

DWORD dwStyle,//指定创建的窗口的样式

int x,//窗口左上角的x坐标

int y,//窗口左上角的y坐标

int nWidth,//窗口的宽度

int nHeight,//窗口的高度

HWND hWndParent,//指定被创建窗口的父窗口句柄

HMENU hMenu,//指定窗口菜单的句柄

HANDLE hInstance,//指定窗口所属应用程序实例的句柄

LPVOID lpParam//作为WM_CREATE消息的附加参数lParam传入的数据指针

);

显示窗口,调用函数ShowWindow来显示窗口

BOOL ShowWindow(

HWND hWnd,//成功创建窗口后返回的窗口句柄

int nCmdShow//窗口的显示状态

);

更新窗口,调用ShowWindow函数后,我们调用UpdateWindow来刷新窗口

BOOL UpdateWindow(

HWND hWnd//创建成功后的窗口句柄



消息循环,在创建窗口、显示窗口、更新窗口后,我们需要编写一个消息循环,不断的从消息队列中取出消息并响应。

从消息队列中取出消息,我们调用GetMessage()函数

BOOL GetMessage(

LPMSG lpMsg,//指向一个消息(MSG)结构体,GetMessage从线程的消息队列中取出的消息信息将保存在该结构体对象中

HWND hWnd,//指定接受属于哪一个窗口的消息

UINT wMsgFilterMin,//指定要获取的消息的最小值

UINTwMsgFiletermax//指定要获取的消息的最大值,若min和max都设置为0,则接收所有消息

);

GetMessage函数接收到除WM_QUIT外的消息均返回非零值。

对于WM_QUIT消息,该函数返回零。

如果出现了错误,返回-1

Windows应用程序消息处理机制:(1)操作系统接受到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。(2)应用程序在消息循环中调用

GetMessage函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如放弃对某些消息的响应,或者调用

TranslateMessage产生新的消息。(3)应用程序调用DispatchMessage,将消息回传给操作系统。(4)系统利用WNDCLASS结构体的lpfnWndProc成员

保存的窗口过程函数的指针调用窗口过程,对消息进行处理。

窗口过程函数,用于处理发送给窗口的消息。一个Windows应用程序的主要代码部分就集中在窗口过程函数中。

LRESULT CALLBACK WindowProc(

HWND hwnd,//消息的窗口句柄

UINT uMsg,//消息代码

WPARAM wParam,//消息代码的附加参数

LPARAM lParam//消息代码的附加参数

);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: