Q:一个经典的helloworld程序需要几个文件?
l 一个安装文件bld.inf,这个文件内容很简单,只给出了要编译的工程文件,当然如果有多个工程文件要编译,可以直接写到后面如x.mmp。
PRJ_MMPFILES
HelloworldApp.mmp
x.mmp
l 一个工程文件helloworldApp.mmp,这个文件列出了工程需要的所有文件和用到的库,还有UID等。
TARGET HelloworldApp.app
TARGETTYPE app
TARGETPATH \system\apps\helloworldapp
UID 0x100039CE 0x0a3c7184
USERINCLUDE ..\inc
SYSTEMINCLUDE \epoc32\include
SOURCEPATH ..\src
SOURCE HelloworldApp.cpp
SOURCEPATH ..\data
RESOURCE HelloworldApp.rss
RESOURCE HelloworldApp_caption.rss
LANG SC
LIBRARY euser.lib apparc.lib cone.lib eikcore.lib eikcoctl.lib avkon.lib
AIF HelloworldApp.aif ..\aif HelloworldAppaif.rss c8 context_pane_icon.bmp context_pane_icon_mask.bmp list_icon.bmp list_icon_mask.bmp
l 一个UID的文件HelloworldApp.uid.cpp,该文件包含了一个程序的uid。
l 一个程序的资源文件helloworldApp.rss, HelloworldApp_caption.rss,这两个文件包含了程序的大多数文本资源。
l 一个程序的头文件HelloworldApp.h和一个程序的源文件HelloworldApp.cpp。
l 一个包文件HelloworldApp.pkg。
l 若干个图片文件在aif目录中。
一个经典的HelloworldApp程序有四个类,并且采用了MVC模式来构建程序,这四个类分别是应用程序类CHelloworldAppApplication,文档类CHelloworldAppDocument,程序界面控制类CHelloworldAppUi和程序界面视图类CHelloworldAppView。
一般情况下,一个经典的HelloworldApp程序包含的头文件有:
#include <eikapp.h> // CEikApplication
#include <eikdoc.h> // CEikDocument
#include <coecntrl.h> // CCoeControl
#include <uikon.hrh> // Command codes
#include <eikenv.h> // CEikonEnv
#include <eiklabel.h> // CEikLabel
#include <aknappui.h> // CAknAppUi
#include <aknnotewrappers.h> // CAknInformationNote
CHelloworldAppApplication继承自CEikApplication,
CHelloworldAppDocument继承自CEikDocument,
CHelloworldAppView继承自CCoeControl,并使用了CEikLabel类,
CHellowroldAppUi继承自CAknAppUi。
uikon.hrh文件包含了控件界面的命令映射,aknnotewrappers.h文件包含了一个显示提示信息的便签类CAknInformationNote(有点类似于VC中的MessageBox)。
下面是四个类的声明代码:
//----------------------------------------------------------------------------
// CHelloworldAppApplication
//----------------------------------------------------------------------------
class CHelloworldAppApplication : public CEikApplication
{
private: // From CEikApplication
CApaDocument* CreateDocumentL();
private: // From CApaApplication (via CEikApplication)
TUid AppDllUid() const;
};
//----------------------------------------------------------------------------
// CHelloworldAppDocument (Model)
//----------------------------------------------------------------------------
class CHelloworldAppDocument : public CEikDocument
{
public: // Constructor
CHelloworldAppDocument(CEikApplication& aApp);
private: // From CEikDocument
CEikAppUi* CreateAppUiL();
};
//----------------------------------------------------------------------------
// CHelloworldAppAppUi (Controller)
//----------------------------------------------------------------------------
class CHelloworldAppAppUi : public CAknAppUi
{
public: // Constructors and destructor
void ConstructL(void); // 两段构造
~CHelloworldAppAppUi(); // 为什么要用虚的
private: // From CEikAppUi
void HandleCommandL(TInt aCommand); // 处理按键命令
private: // Data
CHelloworldAppContainer* iAppContainer;
};
//----------------------------------------------------------------------------
// CHelloworldAppContainer (View)
//----------------------------------------------------------------------------
class CHelloworldAppContainer : public CCoeControl, MCoeControlObserver
{
public: // Constructors and destructor
void ConstructL(const TRect& aRect);
~CHelloworldAppContainer();
public: // New functions
public: // From CCoeControl
void SizeChanged();
TInt CountComponentControls() const;
CCoeControl* ComponentControl(TInt aIndex) const;
void Draw(const TRect& aRect) const;
public: // From MCoeControlObserver
void HandleControlEventL(CCoeControl* aControl,TCoeEvent aEventType);
private: // Data
CEikLabel* iLabel; // example label
CEikLabel* iToDoLabel; // example label
};