windows程序内部运行机制


windows API:

当我们在写程序时,经常会用到一些库函数来辅助完成某些功能,比如C库函数中的printf函数,或者C++中的cout函数,但是这些函数都是你所使用的编译器厂商提供的,在windows平台下,也有类似的函数可供调用,这些函数式由windows系统本身提供的。(PS:这些函数就是windows API)

 

窗口与句柄:

在windows程序中,窗口是通过窗口句柄(HWND)来标识的。我们如果要对某个窗口调用就首先要先得到这个窗口的句柄。因为在windows程序中,有各种各样的资源(窗口,图标,光标等等),系统在创建这些资源的时候会为他们分配内存,并且返回标识这些资源的标识号,即句柄。(注意句柄都是以H开头的)

 

消息与消息队列:

在windows程序中,它是一种事件驱动方式的程序设计(PS:DOS是顺序的、关联的、过程驱动的设计方式),主要是基于消息的。因此操作系统会调用程序的一个专门负责处理消息的函数,这个函数为一个窗口过程。

 

消息的结构:

typedef struct tagMSG
{
	HWND hwnd;//消息所属的窗口
	UINT message;//消息的标识符,用数值来标识,不同数值代表不同消息
	WPARAM wParam;
	LPARAM lParam;
	DWORD time;//消息投递到消息队列时间
	POINT pt;//鼠标当前位置
}


消息队列:

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

而应用程序依靠一个消息循环不断地从消息队列中取出消息,并进行相应。

 

Windows程序的实现步骤:

1、WinMain函数定义

2、创建一个窗口

3、进行消息循环

4、编写窗口过程函数

 

WinMain函数的定义声明:

int WINAPI WinMain   //注意修饰符WINAPI作用:_stdcall    函数调用约定
(
 HINSTANCE hInstance,//表示该程序当前运行的实例的句柄,这是一个数值
 HINSTANCE hPrevInstance,//表示当前实例的前一个实例的句柄
 LPSTR lpCmdLine,//一个以空终止的字符串
 int nCmdShow//指定程序的窗口应该如何显示
)


窗口的创建:

具体步骤如下:

1、设计一个窗口类

2、注册窗口类

3、创建窗口

4、显示及更新窗口

 

设计窗口中WNDCLASS结构体:

typedef struct _WNDCLASS{
UINT style;//指定这一个类型窗口的样式(PS:这是一个枚举类型)
WNDPROC lpfnWndProc;//函数指针,指向窗口过程函数
int cbClsExtra;//Windows会为每个窗口类管理一个WNDCLASS结构
int cbWndExtra;
HANDLE hInstance;//指定包含窗口过程的实例句柄
HICON hIcon;//指定窗口类的图标句柄
HCURSOR hCursor;//窗口类的光标句柄
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
}WNDCLASS;


 

 

创建窗口:

CreateWindows函数的原型声明:

HWND CreateWindow(
LPCTSTR lpClassName,//指定窗口类的名称
LPCTSTR lpWindowName,//指定窗口名称
DWORD dwStyle,//创建窗口的样式(枚举)
int x,//水平位子
int y,//垂直位置
int nWidth,
int nHeight,
HWND hWndParent,//父窗口句柄
HMENU hMenu,//窗口菜单句柄
HANDLE hInstance,//窗口所属的应用程序实例的句柄
LPVOID lpParam
);

如果窗口创建成功,CreateWindow函数将返回系统为该窗口分配的句柄,否则返回NULL。

 

显示以及跟新窗口:

(1)显示窗口:调用ShowWindow来显示

ShowWindow的函数声明如下:

BOOL ShowWindow(
HWND hWnd,//窗口的句柄
int nCmdShow//指定了窗口的显示状态(枚举)
);


(2)跟新窗口:调用UpdataWindows

UpdataWindows函数原型声明入下:

BOOL UpdataWindo(
HWND hWnd//跟新窗口的句柄
);


 

 

 

消息循环

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

要从消息队列中取出消息,我们需要调用GetMessage()函数,具体声明如下:

BOOL GetMessage(
LPMSG lpMsg,//表示一个指向MSG结构体的指针,GetMessage从线程的消息队列中取出的消息信息保存在结构体对象中
HWND hWnd,//指定接受属于哪个窗口的消息
UINT wMsgFilterMin,
UINT wMsgFilterMax
);


PS:在消息循环中用到TranslateMessage():用于将虚拟按键消息转化为字符消息。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值