友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
第三电子书 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

深入浅出MFC第2版(PDF格式)-第10部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!




      系统也才因此知道要先行加载该函数库。这些适当的信息放在所谓的「import  函数库」 



      中。32 位Windows  的三大模块所对应的import  函数库分别为GDI32。LIB 和USER32。LIB 



      和KERNEL32。LIB 。 



      注:谁都知道,Windows 95 是16/32 位的混合体,所以旗下除了32 位的GDI32。DLL 、 



      USER32。DLL  KERNEL32。DLL    16   GDI。EXE  USER。EXE  

               和             , 又有   位的        、         和 

                                



      KRNL386。EXE 。32 位和16 位两组DLLs 之间以所谓的thunking layer 沟通。站在纯 



      粹APIs 使用者的立场,目前我们不必太搭理这个事实。 



      Windows 发展至今,逐渐加上的一些新的API 函数(例如mon Dialog、ToolHelp ) 



      并不放在GDI 和USER 和KERNEL 三大模块中,而是放在诸如MDLG。DLL 、 



      TOOLHELP。DLL 之中。如果要使用这些APIs ,联结时还得加上这些DLLs 所对应的 



      import  函数库,诸如DLG32。LIB 和TH32。LIB 。 



      很快地,在稍后的范例程序! §Generic! ¨  的makefile  中,你就可以清楚看到联结时期所需 



      的各式各样函数库(以及各种联结器选项)。 



需要什么头文件 ( ) 

                       。H 



      所有Windows 程序都必须包含WINDOWS。H 。早期这是一个巨大的头文件,大约有5000 



            Visual C++ 4。0                       WINDOWS。H  

      行左右,            已把它切割为各个较小的文件,但还以                    总括之。 



      除非你十分清楚什么API 动作需要什么头文件,否则为求便利,单单一个WINDOWS。H 



      也就是了。 



      不过,WINDOWS。H  只照顾三大模块所提供的API 函数,如果你用到其它system DLLs, 



      例如MDLG。DLL 或MAPI。DLL 或TAPI。DLL 等等,就得包含对应的头文件,例如 



      MDLG。H 或MAPI。H 或TAPI。H 等等。 



                                                                       6 


…………………………………………………………Page 69……………………………………………………………

以消息为基础,以事件驱动之 (                                         ,          ) 

                                            message based event driven 



       Windows 程序的进行系依靠外部发生的事件来驱动。换句话说,程序不断等待(利用一 



       个while  回路),等待任何可能的输入,然后做判断,然后再做适当的处理。上述的「输 



       入」是由操作系统捕捉到之后,以消息形式(一种数据结构)进入程序之中。操作系统 



       如何捕捉外围设备(如键盘和鼠标)所发生的事件呢?噢,USER 模块掌管各个外围的 



       驱动程序,它们各有侦测回路。 



       如果把应用程序获得的各种「输入」分类,可以分为由硬件装置所产生的消息(如鼠标 



                                      system queue         Windows  

       移动或键盘被按下),放在系统队列(                         )中,以及由            系统或其它 



       Windows 程序传送过来的消息,放在程序队列(application queue )中。以应用程序的眼 



       光来看,消息就是消息,来自哪里或放在哪里其实并没有太大区别,反正程序调用 



       GetMessage API 就取得一个消息,程序的生命靠它来推动。所有的GUI 系统,包括UNIX 



       的X Window  以及OS/2  的Presentation Manager ,都像这样,是以消息为基础的事件驱 



       动系统。 



       可想而知,每一个Windows 程序都应该有一个回路如下: 



              MSG msg; 



              while  (GetMessage (&msg; NULL; NULL; NULL)) { 



                             TranslateMessage (&msg); 



                             DispatchMessage (&msg); 



              } 



       // 以上出现的函数都是Windows API 函数 



       消息,也就是上面出现的MSG 结构,其实是Windows  内定的一种资料格式: 



       /* Queued message structure */ 



              typedef struct tagMSG 



               { 



                      HWND hwnd; 



                      UINT message; // WM_xxx    WM_MOUSEMOVE  WM_SIZE。。。 

                                            ,例如              , 



                      WPARAM wParam; 



                      LPARAM lParam; 



                      DWORD time; 



                      POINT pt; 



               } MSG; 



                                                                                   7 


…………………………………………………………Page 70……………………………………………………………

接受并处理消息的主角就是窗口。每一个窗口都应该有一个函数负责处理消息,程序员 



必须负责设计这个所谓的「窗口函数」(window procedure,或称为window function )。 



如果窗口获得一个消息,这个窗口函数必须判断消息的类别,决定处理的方式。 



            Windows  

以上就是                   程序设计最重要的观念。至于窗口的产生与显示,十分简单,有专 



      API                                        Windows  

门的         函数负责。稍后我们就会看到                                     程序如何把这消息的取得、分派、处 



理动作表现出来。 



                                                                                    MYAPP。EXE 



                                                                             WinMain(hInst; hPrev; 。。。) 

                                                                              { 

                                                                             MSG  msg; 

                                       Messages from                         RegisterClass(。。。); 

                                      other windows                          CreateWindow(。。。); 

       Mouse        Keyboard                                                 ShowWindow(。。。); 

       Driver        Driver            PostMessage()                         UpdateWindow(。。。); 

                                                                             while(GetMessage(&msg。。。)) { 

                                                                                 TranslateMessage(。。。); 

                                                                                 DispatchMessage(。。。); 

   System                                           Application              } 

   message                                          message                  return msg。wParam; 

   queue                                            queue                    } 



                                                                          Window  Procedure 



                                                                           WndProc(hwnd; msg; wParam; lParam) 

                                                                           { 

                                                                           switch (msg) { 

                                                                               case WM_CREATE: 。。。 

                            USER              SendMessage()                    case WM_MAND: 。。。 

                            Module                                             case WM_LBUTTONDOWN: 。。。 

                                                                               case WM_PAINT: 。。。 

                                                                               case WM_CLOSE: 。。。 

                                                                               case WM_DESTROY: 。。。 

  Windows                                                                      default: return DefWindowProc(。。。); 

                                                                           } 

                                                                           return(0); 

                                                                           } 



               图1…2 Windows 程序的本体与操作系统之间的关系。 



                                                                                                                        8 


…………………………………………………………Page 71……………………………………………………………

一个具体而微的Win32 程序 



     许多相关书籍或文章尝试以各种方式简化Windows 程序的第一步,因为单单一个Hello 



     程序就要上百行,怕把大家吓坏了。我却宁愿各位早一点接触正统写法,早一点看到全 



     貌。Windows  的东西又多又杂,早一点一窥全貌是很有必要的。而且你会发现,经过有 



     条理的解释之后,程序代码的多寡其实构不成什么威胁(否则无字天书最适合程序员阅 



     读)。再说,上百行程序代码哪算得了什么! 



     你可以从图1…2 得窥Win32 应用程序的本体与操作系统之间的关系。Win32 程序中最 



     具代表意义的动作已经在该图显示出来,完整的程序代码展示于后。本章后续讨论都围绕 



     着此一程序。 



                makefile   makefile  

     稍后会出现一个          。关于        的语法,可能已经不再为大家所熟悉了。我想 



     我有必要做个说明。 



        makefile                              … 

     所谓       ,就是让你能够设定某个文件和某个文件相比  比较其产生日期。由其比 



     较结果来决定要不要做某些你所指定的动作。例如: 



     generic。res  : generic。rc generic。h 



     rc generic。rc 



                  :      generic。res      generic。rc  generic。h  

     意思就是拿冒号( )左边的              和冒号右边的           和       的文件日 



     期相比。只要右边任一文件比左边的文件更新,就执行下一行所指定的动作。这动作可 



                          rc generic。rc 

     以是任何命令列动作,本例为                。 



     因此,我们就可以把不同文件间的依存关系做一个整理,以makefile 语法描述,以产生 



                       makefile   NMAKE。EXE  Microsoft    MAKE。EXE 

     必要的编译、联结动作。             必须以            (       工具)或 



      Borland                                             MAKE。EXE 

      (     工具)处理之,或其它编译器套件所附的同等工具(可能也叫做                           ) 



     处理之。 



                                                                        9 


…………………………………………………………Page 72……………………………………………………………

                   Generic。mak  (请在DOS 窗口中执行nmake generic。mak。环境设定请参考p。224) 



                   #0001  # filename : generic。mak 

                   #0002  # make file for generic。exe (Generic Windows Application) 

                   #0003  # usage : nmake generic。mak (Microsoft C/C++ 9。00) (Visual C++ 2。x) 

                   #0004  # usage : nmake generic。mak (Microsoft C/C++ 10。00) (Visual C++ 4。0) 

                   #0005 

                   #0006  all: generic。exe 

                   #0007 

                   #0008  generic。res : generic。rc generic。h 

                   #0009      rc generic。rc 

                   #0010 

                   #0011  generic。obj : generic。c generic。h 

                   #0012      cl …c …W3 …Gz …D_X86_ …DWIN32 generic。c 

                   #0013 

                   #0014  generic。exe : generic。obj generic。res 

                   #0015      link /MACHINE:I386 …subsystem:windows generic。res generic。obj  

                   #0016           libc。lib kernel32。lib user32。lib gdi32。lib 



                   Generic。h 



                   #0001  //……………………………………………………………………………………………………………………………………………………………………

                   #0002  // 档名 : generic。h 

                   #0003  //……………………………………………………………………………………………………………………………………………………………………

                   #0004  BOOL InitApplication(HANDLE); 

                   #0005  BOOL InitInstance(HANDLE; int); 
返回目录 上一页 下一页 回到顶部 0 0
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!