Windows 程序内部运行机制

    API函数是指Windows提供给应用程序编程的接口。

    SDK(软件开发包):包括了API函数,帮助文档,辅助开发工具。

    在Windows应用程序中,窗口是通过窗口句柄(HWND)来标识的。若要对某个窗口进行操作,首先要得到这个窗口的句柄。系统在创建资源(窗口,图标,光标)时会为它们分内存,并返回标识这些资源的标识号,即句柄。

    Windows程序设计是一种基于事件驱动方式的程序设计模式,主要是基于消息的。例如,当用户在窗口中画图时候,按了鼠标左键,此时操作系统感知到这一事件,将这个事件包装成消息,投递到应用程序的消息队列中,然后应用程序从消息队列中取出消息并进行响应。操作系统也会调用程序中专门负责处理消息的窗口过程函数来给应用程序“发送消息”。

    每一个Windows应用程序开始执行后,系统都会为该程序创建一个用来存放该程序创建的窗口信息的消息队列。例,当按下鼠标左键时,将产生WM_LBUTTIONDOWN消息,系统会将这个消息放到窗口所属的应用程序队列中,等待应用程序的处理。Windows将产生的消息依次放到消息队列中,而应用程序则通过一个消息循环不断从消息队列中取出消息,并进行响应,这种消息机制就是Windows程序运行的机制。

    win32程序步骤:

1.WinMain 函数的定义;

  int  WINAPI   WinMain(

          HINSTANCE hInstance , HINSTANCE hPreInstance, LPSTR   lpcmdLine,   int  nCmdShow

);

hInstance表示程序当前运行的实例的句柄。每运行一个实例,系统都给它分配一个句柄,并通过hInstance参数传递给WinMain

hPreinstance表示当前实例的前一个实例的句柄

lpcCmdline是指定传递给应用程序的命令行参数

2.创建一个窗口     (设计一个窗口类,注册窗口,创建窗口,显示及更新窗口);

设计窗口类:

typedef struct  _WNDCLASS{

                 UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hICon;

                 HCRSOR  hCursor; HBRUSH hBrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName;

} WNDCLASS;

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

lpfnWndProc 是一个函数指针,指向窗口过程函数(是一个回调函数)。回调函数不是用该函数的实现方直接调用,而是在特定的事件或是条件发生时由另一方调用的,对于该事件或是条件进行响应。回调函数实现的机制为:1)定义一个回调函数。2)提供函数实现的一方在初始化的时候,将回调函数的指针注册给调用者。3)当特定的事件或是条件发生时,调用者使用函数指针调用回调函数对事件进行处理。

针对Windows的消息处理机制,窗口过程函数被调用的过程如下:1)在设计窗口类的时候将窗口过程函数的地址指针赋值给lpfnWndProc 成员变量。2)调用RegisterClass(&wndclass)注册窗口类,那么系统就用了我们所编写的窗口过程函数的地址。3)当应用程序接收到某一窗口的消息时,调用DispatchMessage(&msg)将消息回传给系统。系统则利用先前注册时得到的函数指针调用窗口过程函数对消息进行处理。

一个Windows程序可以包含多个窗口过程函数,一个窗口过程总是和某一个特定的窗口类相关联(通过WNDCLASS 结构体总的lpfnWndProc 成员变量指定),基于该窗口类创建的窗口使用同一个窗口函数。从WNDPROC的定义可以知道WDNPROC实际上是函数指针的类型。

hInstance 应用程序实例句柄由WinMain函数传进来。

lpszClassName指定窗口的名字。   例如:“汽车”

注册窗口类:

ATOM RegisterClass(CONST WNDCLASS *lpWndClass);

创建窗口:

HWND CreateWindow(

          LPCTSTR   lpClassName,  LPCTSTR  lpWindowName, DWORD  dwStyle,  int x,  int  y,  int  nWidth ,  int  nHeight,  HWND  hWndParent,

          HMENU hMenu, HANDLE  hInstance,  LPVOID  lpParam

);                            

  例子:(HWND  hwnd;   hwnd=CreteWindow("汽车","http://www.aodi.com",WS_OVERLAPPEDWINDOW,0,0,500,500,NULL,NULL,和Instance,NULL)            )

显示及更新窗口:


3.进行消息循环;   不断从消息队列中取出消息并进行响应。

一般编写的消息循环代码,需要调用GetMessage()函数从消息队列中取出消息。 

MSG  msg;

while(GetMessage(&msg,NULL,0,0))

{

     TranslateMessage(&msg);

     DispatchMessage(&msg);

}

GetMessage只有在接收到WM_QUIT 消息时才返回0.此时,循环退出,程序才有可能结束,在没有接收到WM_QUIT消息时,Windows应用程序就是通过这个while循环保证程序始终处于运行状态。


4.编写窗口过程函数。




Windows应用程序的消息处理机制(详细解释):

1.操作系统接收到应用程序的窗口消息,将消息投递到该应用程序的消息队列中。

2.应用程序在消息循环中调用GetMessage函数从消息队列中取出一条条消息,取出消息后应用程序可以对消息进行一些预处理,例如放弃对某些消息的响应,或是调用TranslateMessage产生新的消息。

3.应用程序调用DispatchMessage,将消息回传给操作系统。消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMesage函数总能进行正确的传递。

4.系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理。





















































































  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值