MFC #SDK编程#

来源:互联网 发布:淘宝网招聘兼职客服 编辑:程序博客网 时间:2024/06/08 21:04

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完成的),但是应用程序本身并没有结束(因为消息循环结束不了),它还留在内存中。