Windows 的运行机制

了解C++builder的函数入口 WinMain 函数
当然,builder自动把那个我们建立了 WinMain 函数

API,是 Application Programming Interface(应用编程接口) 的缩写, C++Builder 中的类、
类库无不是建立在 Windows API 的基础之上,它是 Windows 系统的一部分, 同时 Windows
自身的运行,也需要调用这些 API 函数。所以,要理解如何使用 API,必须先了解一些 Windows
的运行机制。
Windows 系统是由消息(或称事件) 驱动的操作系统, 这是相对于最初的过程驱动来说
的, 在 Windows 中, 系统为应用程序生成一个消息队列, 系统将用户的操作、 系统的信息等
都作为消息发送到队列中, 供应用程序读取并处理这些消息。 消息,也是应用程序与应用程
序以及应用程序和操作系统之间的通信方式。
强调内容*对于一个 Windows 应用程序, 其入口在 WinMain 函数:
WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine , int nCmdShow)*
在第七章屏幕保护程序的制作中, 我们已经用到 WinMain 的入口参数来得到父窗口的句柄以
及其它命令行参数,这里对 WinMain 的入口参数详细说明一下:
hCurInstance:实例句柄,是一个数值, 在 Windows 中用来唯一标志一个应用程序的实
例。 即使同一个应用程序, 当它被运行多次的时候,其实例句柄是不同的。
hPrevInstance:前一个实例的句柄,不过基本没什么用,因为它在 Win32 系统中, 总是
为 NULL。
lpCmdLine:它是一个指针, 指向一个以 0 结束的字符串,在 Win32 中,它里面不仅仅
只是命令行参数,而是整个命令行。
nCmdShow:整形数,决定如何显示窗口。通常窗口显示使用 SW_SHOWNORMAL。
WinMain 函数的返回值在 Windows 系统中并没有被使用, 但是在调试程序的时候它很有
258 第 9 章 系统信息管理程序
用, 因为,可以根据程序终止情况的不同返回不同的值。
在 WinMain 中, 通过三个步骤来实现窗口的显示, 首先注册窗口类, 之后创建窗口, 最
后根据创建的窗口的句柄显示该窗口。
注册窗口使用ATOM RegisterClassEx(CONST WNDCLASSEX *lpwcx),调用该函数之前,
需要先设置入口参数 lpwcx, 它是一个指向 WNDCLASSEX 结构的指针, WNDCLASSEX 结
构声明如下:
typedef struct _WNDCLASSEX { // wc
UINT cbSize; //结构的大小,即 sizeof(WNDCLASSEX)
UINT style; //类风格
WNDPROC lpfnWndProc; //窗口类的窗口过程
int cbClsExtra; //在类结构中预留的空间
int cbWndExtra; //在 Windows 内部保存的窗口结构中预留的空间
HANDLE hInstance; //程序的实例句柄
HICON hIcon; //程序图标
HCURSOR hCursor; //程序光标
HBRUSH hbrBackground; //窗口的背景颜色
LPCTSTR lpszMenuName; //菜单
LPCTSTR lpszClassName; //类名,和程序名相同
HICON hIconSm; //也是程序图标,小图标,为空时会用 hIcon 来代替它
} WNDCLASSEX;
注册窗口类之后就可以创建窗口了,创建窗口使用如下函数:
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 // 创建窗口所用的参数
);
窗口被创建以后,需要调用
BOOL ShowWindow( HWND hWnd, // 窗口句柄
int nCmdShow // 窗口状态,即 WinMain 中的 nCmdShow
);
和 BOOL UpdateWindow(
HWND hWnd // handle of window
第 9 章 系统信息管理程序 259
);
调用这两个函数之后,窗口才会被显示出来。之后窗口通过一个循环来从消息队列中读取消
息, 循环过程如下:
while (GetMessage(&msg, NULL, 0, 0)) //从消息队列中取得消息
{
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);// 检索并生成字符消息 WM_CHAR
DispatchMessage(&msg);// 将消息发送给相应的窗口函数
}
}
通过循环不断的从消息队列中读取消息,然后对消息进行处理之后交给窗口函数过程处理。
而当读取的消息是 WM_QUIT 时, GetMessage 返回 0, 循环终止, 程序运行结束。 而处理消
息的窗口函数形式上是一个巨大的 switch 结构, 每一个 case 语句对应一种消息, 当应用程序
接受到一个消息时,在窗口函数内的相应的case语句就会被激活并执行相应的响应程序模块。
一般来说,窗口函数的格式如下:
LRESULT CALLBACK WndProc( HWND hwnd, //窗口的句柄
UNIT message, //所要处理的消息的类型标志
WPARAM wParam, //消息的附加参数
LPARAM lParam //消息的附加参数
)
{
switch(message) //message 为消息的类型标志,如 WM_PAINT, WM_DESTROY 等
{
case…

break;

case WM_DESTROY:
PostQuitMessage(0); //发送结束程序的消息 WM_QUIT
default:
return DefWindowProc(hwnd,message,wParam,lParam);//采用系统默认的消息处理函数
}
return(0);
}
了解了 Windows 的工作机制之后,使用 API 就只是根据自己的需要调用相应的 API 函
数来处理特定的消息而已, 这也是 API 使用的难点, 因为往往不知道调用哪些函数来实现自
己想要的功能。 查看 API 的相关帮助, 可以得到一些编程中常用的 API 函数以及常用的消息
事件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值