这8行的含义就是不断的从系统里取消息,拿到后再调用系统的服务处理后发给相应的窗口过程。这个过程循环进行,直到推出程序。这就是所谓“消息循环”名字的由来。那么窗口过程在哪里呢?好,我们看看我们创建的窗口的属性吧,从76行开始: 76 wcex.style = CS_HREDRAW | CS_VREDRAW; 77 wcex.lpfnWndProc = (WNDPROC)WndProc; 78 wcex.cbClsExtra = 0; 79 wcex.cbWndExtra = 0; 80 wcex.hInstance = hInstance; 81 wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_TEST); 82 wcex.hCursor = LoadCursor(NULL, IDC_ARROW); 83 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); 84 wcex.lpszMenuName = (LPCSTR)IDC_TEST; 85 wcex.lpszClassName = szWindowClass; 86 wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); 其他我们暂时先不关心,看看第77行,lpfnWndProc是什么?根据匈牙利命名法,这是个函数指针!而(WNDPROC)WndProc就是我们定义的一个函数(第131行)。于是明白了,我们定义的一个函数被保存在窗口结构里传给系统了。再扫描一下前面列的程序,发现(WNDPROC)WndProc并没有被调用!这是怎么回事?原来系统是这样告诉我们的:有个函数你(应用程序)给我定义并实现一下,告诉我,然后你就别管了,我(系统)会根据情况来调用。所以,本质上讲,窗口函数只是系统定义的一个回调函数而已。大家要习惯这种回调函数,在Windows的很多地方都会定义类似的回调函数让你实现的。 以前在用Win32 API直接编程的时候,通常会在(WNDPROC)WndProc看到一个巨大switch/case结构,在这个巨大的结构里完成所感兴趣的消息的处理。那么到底有那些消息呢?查MSDN固然可以,但我是用Visual C++带的工具,Spy++来看的。当你在Spy++里用Ctrl+M打开Message Log窗口后,就可以在第二个tab页里看到几乎所有公开的消息了,并且是分了类的。推荐大家去浏览一下,不求记住,但最好有个大致的印象,尤其是用Visual C++编程的同志。 |
正在阅读:《编程高手箴言》读后感(3)《编程高手箴言》读后感(3)
2004-04-07 10:02
出处:CSDN
责任编辑:sdq
键盘也能翻页,试试“← →”键