五、消息处理机制

十四、winMain函数

  14.1、函数原型:

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
              _In_opt_ HINSTANCE hPrevInstance,
              _In_ LPWSTR lpCmdLine,
              _In_ int nCmdShow)

  14.2、函数名前面的w说明是宽字符,当然存在宽字符那就会有与之对应的窄字符版本,

  14.3、窄字符版本下唯一不同的是第三个参数,没有W。

  14.4、APIENTRY(一种调用约定):

    14.4.1、#define APIENTRY WINAPI

    14.4.2、#define WINAPI __stdcall

    14.4.3、__stdcall:实际上是一种调用约定

    14.4.4、调用约定:

      14.4.4.1、在函数中将调用约定去掉也是可以正常的运行这个函数的,因为已经存在默认。

      14.4.4.1、那么调用约定有什么作用呢:

        14.4.4.1.1、首先我们进行函数参数传递的时候都是通过栈进行的参数的传递。

        14.4.4.1.2、当函数结束的时候栈帧将会被清理(平栈)。

        14.4.4.1.3、__stdcall:指的是调用方进行清理。

        14.4.4.1.4、__cdecl:由被调用方进行清理。

        14.4.4.1.5、__fastcall:指的是不通过栈进行参数的传递,而是通过寄存器来进行参数的传递。

        14.4.4.1.6、在C编译中使用的都是__cdecl,而在win32中全部用的都是__stdcall。

  14.5、HINSTANCE:和之前讲的HANDLE 是一样的,同样是来表示一个内核对象、但是这个我们称之为一个实例对象。

  14.6、我们可以像操作HANDLE 一样来进行HINSTANCE 对进程进行操作。

  14.7、实例对象:指的是一个进程,

  14.8、第一个参数hInstance是当前实例的实例句柄。

  14.9、第二个参数hPrevInstance是父进程的实例句柄。

  14.10、为什么需要由外部传递当前的实例句柄呢?

    14.10.1、其实我们写的程序之所以能成为一个进程:是因为有操作系统的存在。

    14.10.2、其实呢,winMain是一个被动调用的程序,而本身是不能自己进行进程的创建的,必须要由操作系统来进行进程的创建。

    14.10.3、既然是由操作系统来创建这个进程的,所以本身程序是不知道这个进程编号的。

    14.10.4、所以只能由外部来告知程序,你当前进程的ID是多少。

  14.11、lpCmdLine:程序命令行。

  14.12、nCmdShow:首先winMain所代表的是一个窗口进程,这个参数是指定这个窗口是如何来进行显示的。

  14.13、通过CreateWindowW函数创建了一个窗口,返回一个窗口对象,以后要对窗口进行操作都是对这个窗口对象进行。

十五、窗口过程:

  15.1、在win32的子系统中进行了所有消息的响应。

  15.2、当硬件有任何的改变(比如鼠标点击),都会存储在一个共享区,这个区会被win32子系统不停的进行扫描。  

  15.3、win32子系统会把这种改变翻译成消息。

  15.4、这个翻译成消息的过程之所以不放在内核中来进行:是因为内核需要非常的精简的(越简单越好),这会占用内核太多的资源。

  15.5、在win32子系统为每个应用程序建立消息队列。

  15.6、win32子系统所派发下来的消息一定是本程序的消息。

  15.7、

typedef struct tagMSG {
      HWND hwnd;    //在进来的时候就交代了窗口。
      UINT message;    //消息数值化,数值类型。
      WPARAM wParam;    //只有一个message的话,有时候不能来进行判断,该消息想要做什么。
      LPARAM lParam;    //这两个是消息附加信息,而这两个附加值的意义由message来决定。所以三个值加在一起,将会告知该消息将会做什么。
      DWORD time;    //消息创建的时间。用来判断消息处理前后。
      POINT pt;    //当前消息创建时,鼠标所在屏幕的位置。
#ifdef _MAC
DWORD lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;

    15.7.1、WPARAM和LPARAM:就是UINT类型,传进来一般是指针数值。

    15.7.2、有了这个结构体之后呢,程序会一直的去GetMessage。

    15.7.3、所有的消息都存在当前软件的消息队列中,所有必须使用GetMessage函数进行消息的获取。

十六、消息

  16.1、WM:表示的是Windows Message。

  16.2、窗口消息:针对窗口来说的(比如窗口的移动),就是有关窗口的所有消息,创建窗口CreateWindow函数的调用也是。

  16.3、命令消息。

  16.4、控件通知消息:比如按钮。

posted @ 2017-05-12 10:36  _xiaohaige  阅读(204)  评论(0编辑  收藏  举报