PALM开发教程-第十二章 专业编程技巧 |
| 作者:palmheart 来源:palmheart.net 发布时间:2005-12-21 3:39:54 |
|
被包括在<>中,我们自定义的头文件被被包括在引号中。 下面是fcalc.c的头文件定义,app.h被分成了几个部分分别处理各个源文件,这样就使我们在将来可以很容易的从程序中摘取必要和充分的代码应用于其它的模块。 ///////////////////////////// // Definitions for fcalc.c // ///////////////////////////// // The menu event handler macro for the "calc" form #define calcFormMenuEventHandler(spEvent) 这里是菜单处理函数的定义。现在的定义没有什么实际意义,在代码中也没有内容,这是因为calc窗体还没有菜单。我特意在函数调用的括号中留出了一个空格,宏会在宏名称后的第一个空格后开始运行,所以你向宏添加参数时,为是编译正常进行,注意不要留出空格。 注意: 只有在必要的时候才使用宏,因为使用宏是十分危险的。一般的函数都是可以利用原型来检查函数的参数,而对于宏来说没有函数原型。如果你向宏中传递了错误的参数,你将很难检查出来。我们在这里使用宏是想创建一个快速简易的“函数”,除了在源文件中被引用,它们不会占有代码空间。我们不想在头文件中添加函数,因为那样会使它们在每次被在源文件调用时都会被执行。 再下面是main.c的定义,首先是函数getEventHandler()的原型,在这里有一个我们以前没有见过的定义:EVENT_HANDLER_LIST。 //////////////////////////// // Definitions for main.c // //////////////////////////// // The prototype for getEventHandler() static FormEventHandlerPtr getEventHandler( Word ); // This creates the function getEventHandler, // which returns the event handler for a given form // in this application. #define EVENT_HANDLER_LIST \ static FormEventHandlerPtr getEventHandler( Word wFormID )\ {\ switch( wFormID )\ {\ case AboutForm:\ return( aboutFormEventHandler );\ case CalcForm:\ return( calcFormEventHandler );\ case PrefsForm:\ return( prefsFormEventHandler );\ }\ return( NULL );\ } EVENT_HANDLER_LIST实际上就是函数getEventHandler()的定义。在main.c中预处理器用这个定义代替了此函数。我们可以在任何地方使用#define语句,它实际上就象文本编译器中的查找替换命令。在每一行后面的反斜杠可以使预处理器忽略每一行后的行中断符,当遇到行中断符时,#define语句就会停止,所以我们在getEventHandler()的最后一行没有反斜杠。 现在,getEventHandler()只是关联了窗体CalcForm中的calcFormEventHandler()。如果想再添加窗体以及事件处理函数,我们可以在头文件中直接扩展。 // This defines the macro that initializes the app #define appInit() // This defines the macro that cleans up the app #define appStop() // This application works on PalmOS 2.0 and above #define ROM_VERSION_MIN ROM_VERSION_2 // Define the starting form #define StartForm CalcForm //////////////////////////////// // Definitions for moptions.c // //////////////////////////////// // Menu ID name conversions #define OptionsAbout OptionsAboutCalculator #endif // APP_H 这里是appInit()和appStop()的宏定义。但它们现在还没有实在意义。文件的最后定义了运行此程序的最低版本为version 2.0,其中变量使用了main.c中的定义。我们还定义了开始窗体是CalcForm。最后是#endif语句,千万不要忘记这一结束语句,否则在编译时会出现很奇怪的错误。 建立一个向app.h这样的文件的主要目的是节省运行时间,并做到尽量在头文件中修改代码,而不要在源文件中修改。这样做有很多好处因为只要你修改代码,就有可能引入bug,但是一般来说,修改程序中的常量可以减少引入bug的机会。如果将代码的修改集中在一些头文件中,就可以减少本来运行正常的程序经修改后崩溃的比率。 如果一个程序员一般不会向程序中引入bug,这样的程序结构也是有好处的,因为即使程序中有良好的注释,也需要花费一些时间来看懂程序并作修改。如果将改变集中在有着好的文件结构的头文件中,就会比重新学习各个模块的细节花费的时间少的多。 调试 所有模块均已完成,现在开始调试。如果不出意外的话,运行后的程序界面如下图所示: 程序从函数PilotMain()开始执行。初始化过程如下:检查ROM的版本并检查运行代码,然后调用了函数FrmGotoForm(),它将产生两个待处理的事件:frmLoadEvent和frmOpenEvent,接着就进入了无限的事件循环。 FrmLoadEvent引发了processEvent(),它将从事件结构中获得窗体的ID并初始化窗体,然后就等待其它事件的发生。 如果你按下了OK按钮,就会发出一个提示声音。 程序列表: 下面是app.h全部的源代码: #ifndef APP_H #define APP_H ////////////////////////////////////////////////////////////////////////////// // app.h // Definitions for the application. // Copyright (c) 1999, Robert Mykland. All rights reserved. ////////////////////////////////////////////////////////////////////////////// ////////////// // Includes // ////////////// #include <Pilot.h> // All the Palm includes #include "Calculator_res.h" // Resource definitions #include "fabout.h" // Definitions for the "about" form #include "fcalc.h" // Definitions for the "calc" form #include "fprefs.h" // Definitions for the "prefs" form #include "main.h" // Definitions for the main entry point #include "moptions.h" // Definitions for the "options" menu ////////////////////////////// // Definitions for fabout.c // ////////////////////////////// // The menu event handler macro for the "about" form #define aboutFormMenuEventHandler(spEvent) ///////////////////////////// // Definitions for fcalc.c // ///////////////////////////// // The menu event handler macro for the "calc" form #define calcFormMenuEventHandler(spEvent) \ {\ optionsMenuEventHandler( spEvent );\ } /////// |
| [] [返回上一页] [打 印] |
|
文章评论 |
