现在的位置: 首页 > 综合 > 正文

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

2013年04月22日 ⁄ 综合 ⁄ 共 3159字 ⁄ 字号 评论关闭

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//消息代码的附加参数
    );

抱歉!评论已关闭.