Windows API
操作系统把他所能够完成的功能以函数的形式给应用程序使用,应用程序对这些函数的调用叫做系统调用(应用程序是以函数的调用的方式来通知操作系统执行相应的功能),这些函数的集合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称API。
句柄(HANDLE),资源的标识
操作系统要管理和操作这些资源,都是通过句柄来找到相应的资源。
需要什么头文件(.H)
所有Windows程序都必须载入WINDOWS.H。
SDK 程序只要包含WINDOWS.H 就好,所有API 的函数声明、消息定义、常数定义、宏定义、都在WINDOWS.H文件中。除非程序另调用了操作系统提供的新模块(如CommDlg、ToolHelp 、DDEML...),才需要再各别包含对应的.H 文件。
消息为基础,以事件驱动之
Windows程序的进行系依靠外部发生的事件来驱动。
程序进入点WinMain
WinMain是Windows程序的进入点:
int CALLBACK WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
...
}
窗口类之注册与窗口之诞生
窗口产生之前,其属性必须先设定好。程序必须在窗口之前先利用API函数RegisterClass设定属性(注册窗口)。RegisterClass需要一个大型的数据结构WNDCLSS作为参数。
注意,CreatWindow只产生窗口,并不现实窗口,所以必须再利用ShowWindow将它显示在屏幕上。
消息循环
while (GetMessage(&msg,...)) {TranslateMessage(&msg); //转换键盘消息
DispatchMessage(&msg); //分派消息
}
TranslateMessage是为了将键盘消息转化,DispatchMessage会将消息传给窗口函数去处理(消息发生之时,操作系统已经根据当时状态,为它表明了所属窗口,而窗口所属的窗口类又已经明白标示了窗口函数(也就是wc.lpfnWndProc所指函数))。
窗口的生命中枢:窗口函数
消息循环中的DispatchMessage通过USER模块的协助,把消息分配到该窗口的窗口函数,窗口函数通常利用switch/case方式判断消息的种类,以决定处置方式,由于他是被Windows系统调用的(我们并没有在应用程序的任何地方调用此函数),所以这是一种call back 函数,意思是指"在你的程序中,被Windows系统调用"的函数。这些函数虽然由你设计,但永远不会也不该被你调用,她们是为Windows系统准备的。
窗口函数设计为callback形式,才能开发一个接口给操作系统调用。
LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
注意,不论什么消息,都必须被处理,所以 switch/case 指令中的 default:处 必须调用 DefWindowProc ,这是 Windows 内部默认的消息处理函数。
Windows程序的生与死
操作系统与应用程序职责不同,二者是互相合作的关系,所以必须各做各的分内事,并互以消息通知对方。
如果不依据这个游戏规则,可能就会有麻烦产生。你可以作一个小实验,在窗口函数调用WM_DESTROY,但不调用PostQuitMessage。你为发现选择系统菜单中的Close时,屏幕上的这个窗口消失了(因为窗口摧毁及数据结构的释放是DefWindosProc调用DestroyWindows完成的),但是应用程序本身并没有结束(因为消息循环结束不了),它还留在内存中。