【转载】MiniUtilityFramework(二):第一个程序
转载自:http://blog.csdn.net/norains/article/details/3956940
为了向前辈致敬,我们第一个程序也在设备中输出“HelloWorld”。
我们在vs2005中建立一个工程,各部分代码解释如下:
对于MUF来说,主控是CDominatorBase类,我们进行一切的操作,都必须通过该类的对象来实现。而又因为CDominatorBase有两个纯虚函数,所以一开始我们就必须要继承该类,并实现纯虚函数。不过也不用担心,其实CDominatorBase类中已经实现了这两个函数,所以在派生类中我们只需要明确指出使用该函数即可:
/////////////////////////////////////////////////////////////////// //Dominator.h #include "..//..//..//Dominate//DominatorBase.h" class CDominator: public CDominatorBase { public: //-------------------------------------------------- //Description: // You could see the description in the base class //------------------------------------------------- virtual CUserWnd* CreateWndObj(const TSTRING &strWndName); //-------------------------------------------------- //Description: // You could see the description in the base class //------------------------------------------------- virtual BOOL CloseWndObj(CUserWnd* pObject) ; public: CDominator(); virtual ~CDominator(); private: }; /////////////////////////////////////////////////////////////////// //Dominator.cpp #include "stdafx.h" #include "Dominator.h" CDominator::CDominator() {} CDominator::~CDominator() {} CUserWnd* CDominator::CreateWndObj(const TSTRING &strWndName) { return CDominatorBase::CreateWndObj(strWndName); } BOOL CDominator::CloseWndObj(CUserWnd* pObject) { return CDominatorBase::CloseWndObj(pObject); }
之所以有这两个纯虚函数的出现 ,主要是为了创建子窗口,实现特定的功能。具体关于CDominator类的说明,请查看后续章节。
主程序入口的文件在这里命名为Simple.cpp,代码如下:
/////////////////////////////////////////////////////////////////////// // Simple.cpp : Defines the entry point for the application. // #include "stdafx.h" #include "Dominator.h" #include "..//..//..//control//common.h" TSTRING GetIniPath() { std::vector<TCHAR> vtFileIni(MAX_PATH,0); CCommon::GetCurrentDirectory(&vtFileIni[0],vtFileIni.size()); _tcscat(&vtFileIni[0],TEXT("MUF.ini")); return &vtFileIni[0]; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { CDominator dominator; //Initialize the control from the ini file. dominator.Initialize(GetIniPath()); //Show the main window dominator.ShowMainWnd(TRUE); //Message loop MSG msg; while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0;
GetIniPath函数是获取运行时的配置文件的路径。在这里设定的配置文件名为MUF.ini,存放的位置和应用程序为同级目录。
当然,还有一个我们建立的头文件:
/////////////////////////////////////////////////////////////////// //stdafx.h #pragma once #include "windows.h" #ifdef _X86_ #ifdef _DEBUG #pragma comment (lib,"..//lib//X86em//DEBUG//MUF.lib") #else #pragma comment (lib,"..//lib//X86em//RELEASE//MUF.lib") #endif #endif #ifdef _MIPS_ #ifdef _DEBUG #pragma comment (lib,"..//lib//MIPSII//DEBUG//MUF.lib") #else #pragma comment (lib,"..//lib//MIPSII//RELEASE//MUF.lib") #endif #endif #ifdef _ARM_ #ifdef _DEBUG #pragma comment (lib,"..//lib//ARM4I//Debug//MUF.lib") #else #pragma comment (lib,"..//lib//ARM4I//RELEASE//MUF.lib") #endif #endif}
MUF的使用有两种方式,一种是将框架的所有代码导入工程中进行嵌合编译,另一种是直接采用头文件和lib库的方式。前者编译缓慢,但能调试框架的代码;后者编译快速,但无法调试框架代码。如果框架的代码本来就存在bug,那么采用后者将很难发现。在这里为了简单方便,采用的是后者。
最后,还有一个最重要的配置文件。该文件定义了窗口的所有定义,在程序运行中调用。
配置文件内容如下:
[VARIABLE]
%WND_RECT%=0,0,479,271
[LANGUAGE]
;CHS
EN
[WND_MAIN]
TYPE=WINDOW
BACKGROUND_COLOR=255,255,255
RECT_POS=%WND_RECT%
TEXT_GROUP=GRP_TEXT
BUTTON_GROUP=GRP_BUTTON
[TXT_INFO]
TYPE=TEXT
RECT_POS=%WND_RECT%
POINT_SIZE=30
WEIGHT=0
FORMAT=DT_CENTER|DT_SINGLELINE|DT_VCENTER
COLOR=0,0,0
TRANSPARENT_MODE=TRUE
STRING=STR_INFO
[BTN_EXIT]
TYPE=BUTTON
RECT_POS=%WND_RECT%
COMMAND=CMD_EXIT
[GRP_TEXT]
TXT_INFO
[GRP_BUTTON]
BTN_EXIT
[STR_INFO]
TYPE=STRING
EN="HELLO WORLD!"
CHS="世界,你好!"
将该文件保存为MUF.ini,放置于应用程序的同级目录中即可。目前该配置文件显示的为英文,如果需要显示中文,只需要将[LANGUAGE]字段的EN用;注释掉,然后将CH前的;删掉即可。