星期五, 二月 02, 2007

使用Visual C++ 2005 Express Edition搭建Windows下免费的C/C++跨平台程序开发环境

Visual C++ 2005 Express Edition是微软的免费C/C++开发工具,用它可以进行基于.Net平台的C++程序开发,配合Platform SDK还可以开发基于Windows API的应用程序,但是,但是,微软对它的功能也作了很多限制,其中对个人开发来说最主要的可能是他本身不带资源编辑器,只能手动编写资源文件代码添加资源,而且他也没带MFC,只能编写API程序。其实,借助第三方的免费库和工具,加上VC优秀的代码编辑和调试能力,我们完全可以搭建一个高效的带有GUI界面编辑器的开发环境。
对于Windows的RC格式的资源文件,可以使用ResEdit编辑,C++库可以使用wxWidgets,他也是一个跨平台库,而wxWidgets下XRC资源,可以使用wxFormBuilder生成。下面是他们的下载地址:
VC2005:http://msdn.microsoft.com/vstudio/express/visualc/download/
Platform SDK:http://www.microsoft.com/downloads/details.aspx?FamilyId=0BAF2B35-C656-4969-ACE8-E4C0C0716ADB
ResEdit:http://www.resedit.net/
wxWidgets:http://www.wxwidgets.org/
wxFormBuilder:http://wxformbuilder.org/

1.VC和Platform SDK的安装
基本按照微软的说明来,但是有一个地方需要修改,就是修改默认链接库那一步,微软给的是
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
由于wxWidgets还需要其他的一些库,改成
kernel32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib winmm.lib shell32.lib comctl32.lib ole32.lib oleaut32.lib uuid.lib rpcrt4.lib advapi32.lib wsock32.lib odbc32.lib
这样编译wxWidgets程序就不需要额外的设置了

2.ResEdit
这个工具只对Windows开发有用,ResEdit能够编辑RC格式的文件,而且界面和VC2005很相近,经过配置很容易集成到vc中使用。ResEdit不需要安装,下载后直接解压缩,放到该放的地方就能用了,但是要和vc配合使用,需要一点配置。在一个win32的项目中(配置第1步应该创建一个以验证其正确),右键点击一个rc文件(如果没有可以添加一个文本文件,把后缀改成rc),点Open with,在弹出对话框中点Add,添加ResEdit,并且把它设置成默认的编辑器,以后在vc中双击rc文件,就可以打开ResEdit进行编辑。ResEdit界面友好,使用方法类似于vc收费版的资源编辑器。

3.wxWidgets
wxWidgets是一个开放源代码的跨平台GUI程序开发库,可以开发Mac、Linux、Windows应用程序,本身结构设计与MFC相似(个人认为他的面相对象设计比MFC好),使用称作XRC的XML文件描述资源(基本上所有的GUI元素),资源文件本身可以单独存在,动态加载,也可以集成到程序中,有很大的灵活性,更重要的是现在存在许多XRC编辑器,都能可视化的生成或者编辑XRC文件,进行wxWidgets界面设计。
下载wxWidgets的Windows安装文件,安装。打开vc,菜单中的tools->options左边选择projects and solutions->vc++ directorys,后面那些(wxWidgets_installdir)应该用你的实际安装路径代替,添加(wxWidgets_installdir)\include\msvc、(wxWidgets_installdir)\include、(wxWidgets_installdir)\contrib\include三个目录到vc的include目录,把(wxWidgets_installdir\lib\vc_lib、(wxWidgets_installdir)\contrib\lib两个目录加到vc的library目录里,环境配置好了。然后进入wxWidgets安装目录下的build\msw,打开wx.dsw,在vc中使用build->batch build,选择所有项目中你需要的配置(一般来讲windows xp和2000选择所有的unicode release和unicode debug,强烈不建议选择太多,据说所有的全部编译需要4G以上的空间),build,编译完成后,就可以使用了。

4.wxFormBuilder
安装wxFormBuilder后,就可以可视化的构建wxWidgets的界面,生成XRC文件了。由于wxFormBuilder不支持直接编辑,所以不用在vc中创建文件关联,但是,可以在vc菜单的tools->extern tools里把它加入到vc的外部程序列表中,方便调用。

5.测试
上面几步环境配置好了,下面写一个简单的wxWidgets程序,测试刚才配置的环境。
在vc中创建一个新的win32工程,在向导中选择项目类型为win32 application,并选择其为empty(向导生成的代码是基于windows api的)。向其中添加一个头文件,内容为
wxHello.h
class MyFrame;
class MyApp: public wxApp{
public:
bool OnInit();
protected:
MyFrame * mainWnd;};

DECLARE_APP(MyApp);

class MyFrame: public wxFrame{
public:
void OnExit(wxCommandEvent & evt);
DECLARE_EVENT_TABLE()};

添加一个源代码文件,wxHello.cpp:
#include
#include
#include "wxHello.h"
IMPLEMENT_APP(MyApp);

bool MyApp::OnInit(){
wxXmlResource::Get()->InitAllHandlers();
wxXmlResource::Get()->Load(wxT("wxHello_res.xrc")); //这里用你自己的资源文件名代替
mainWnd = new MyFrame();
wxXmlResource::Get()->LoadFrame(mainWnd, NULL, wxT("MyFrame1")); //这里的资源名字也应该根据你自己的资源文件作相应的修改
mainWnd->Show(true);
SetTopWindow(mainWnd);
return true;}

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(XRCID("menuItem1"), MyFrame::OnExit) //这里的menuItem1应该用你自己编辑的菜单项的实际名字代替
END_EVENT_TABLE()

void MyFrame::OnExit(wxCommandEvent &/*evt*/){ Close(true);}

build项目生成可执行文件,下面创建xrc资源文件,打开wxFormBuilder,首先在修改工程属性,代码生成类型选择为xrc,文件名wxHello_res,然后依次加入一个Frame、wxMenuBar、wxMenu、wxMenuItem,根据需要改变上面显示的文字,并改变控件名(控件的name属性),需要同时在源代码中修改加载资源的名字。添加好后保存,然后在菜单的file中选择generate code或者点f8键,就能导出xrc文件,导出的xrc文件在刚才保存的项目文件同一个目录下。

复制生成的xrc文件到刚才vc生成的可执行文件同一个目录下,运行,就能看到新创建的程序了。这个程序创建过程中,c++源代码没有作任何界面创建的工作,它只是简单的从xrc文件中加载源代码,显示,然后就是处理界面生成的消息,wxWidgets的消息机制很像MFC,消息用ID标识,但是当使用xrc资源时,我们一般没有消息id,所以使用宏XRCID(ctrlname)来从一个控件名转换消息id。而界面的生成全部由可视化的工具wxFormBuilder完成,这大大减小了代码编辑量。程序和界面这样分离带来的其它好处还有比如国际化,只需要提供一个新的xrc文件就可以完成,非常方便。

6.说明
使用这种方法我们搭建了一个windows下工作免费的gui程序开发环境,而且所有软件是经过授权的,这个环境开发出来的代码事实上是可以移植的,将源代码在其它平台上重新编译(当然需要安装相应的wxWidgets),加上那个xrc文件(不用修改)就可以在这个平台上运行了。
但是,需要说明的是,wxWidgets本身是比较新的,还存在许多bug,其稳定性应当不如MFC,而且不支持某些Windows平台专有特性,比如开发ActiveX控件或DirectX,所以,使用上有一定的局限。而且xrc资源编辑器一般也都有这样那样的bug,比如这里介绍的wxFormBuilder,就不能编写独立的工具栏或者菜单栏以供程序动态调用。
据说还有一个开发wxWidgets程序的好软件,叫做codeblocks(http://www.codeblocks.org/),也是免费的,但是这个软件太新,而且现在1.0正式版还没出来呢,想用的只好继续等了。其它还有很多xrc的编辑器,可以在wxWidgets的wiki上找找

下面是一些参考资料:
有关wxWidgets编程的详细信息可以去www.wxwidgets.org 上的document或者wiki里找,有一些很不错的资料
wxFormBuilder的用法可以去他的论坛上看看,www.wxformbuilder.org
codeblock的主页在www.codeblocks.org ,在他的论坛上有最新的工具的源代码,有兴趣的可以自己下载下载编译一个试试。