写C++程序用什么工具?在linux下我觉得netbeans6.1还是不错的,在windows下就没有什么工具会超越MS的vs了。但是专业版太贵,Microsoft Visual C++ 2008 速成版却是免费的。不过速成版里没有MFC,所以还得选择一个GUI库
----其实,MFC不用也罢。。。。。。GUI库很多,但成熟、有丰富文档、免费且跨平台的却没几个。据说QT很好,但QT在vs上的授权不是免费的,且不是标准C++所写,所以选择wxWidgets。这个库很难说出它的缺点,如果非要吹毛求疵的话,就是wxWidgets太像MFC了。还有人说他不够新潮,没有大量使用template等等,如果你也一样的无聊我也不说了。
一个wxWidgets程序至少应该这样:
#include
"
wx/wx.h
"
class
Plot3DApp:
public
wxApp
{
public:
virtual bool OnInit();
}
;
class
Plot3DFrame:
public
wxFrame
{
public:
Plot3DFrame(const wxString& title);
}
;
IMPLEMENT_APP(Plot3DApp)
bool
Plot3DApp::OnInit()
{
Plot3DFrame *frame=new Plot3DFrame(wxT("Plot3D"));
frame->Show(true);
return true;
}
Plot3DFrame::Plot3DFrame(
const
wxString
&
title)
:wxFrame(NULL,wxID_ANY,title)
{}
编译后得到如图所示
关于这个程序,还有几点需要说明:
1)如何编译。当然首先要编译好wxWidgets库.我用的IDE是Microsoft Visual C++ 2008 速成版。
编译好后设置:
包含文件路径:C:\wxWidgets-2.8.7\include
和C:\wxWidgets-2.8.7\lib\vc_lib\mswd;
库路径: C:\wxWidgets-2.8.7\lib\vc_lib
项目属性设置:
预处理器定义 WIN32;_DEBUG;__WXMSW__;__WXDEBUG__;_WINDOWS;NOPCH
连接器输入 wxmsw28d_core.lib wxbase28d_net.lib wxbase28d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib winmm.lib comctl32.lib rpcrt4.lib wsock32.lib odbc32.lib(当然,你看到了我编译的库是debug版)
2)说明一个wxWidgets程序至少要定义两个类:一个继承自wxApp的App类,该类必须定义virtual bool OnInit()函数;一个是继承自wxFrame的Frame类;
3)virtual bool OnInit()函数至少要实现类似
Plot3DFrame
*
frame
=
new
Plot3DFrame(wxT(
"
Plot3D
"
));
frame
->
Show(
true
);
这两句功能,即构造一个Frame类并显示,进入消息循环;
4)Frame类要设置好父类wxFrame的两个参数:
:wxFrame(NULL,wxID_ANY,title)
5)main()或WinMain()在哪里?
#define
IMPLEMENT_APP(appname) \
IMPLEMENT_APP_NO_THEMES(appname) \
IMPLEMENT_WX_THEME_SUPPORT
/*
****************(1)******************
*/
#define
IMPLEMENT_APP_NO_THEMES(appname) \
IMPLEMENT_APP_NO_MAIN(appname) \
IMPLEMENT_WXWIN_MAIN
/*
****************(1.2)******************
*/
#define
IMPLEMENT_WXWIN_MAIN \
extern
"
C
"
int
WINAPI WinMain(HINSTANCE hInstance, \
HINSTANCE hPrevInstance, \
wxCmdLineArgType lpCmdLine, \
int
nCmdShow) \
{ \
return
wxEntry(hInstance, hPrevInstance, lpCmdLine, nCmdShow); \
}
看到了吗?看来每个C++程序必有一个main函数这句话不错,就如能量守恒一个不可能被表象掩盖,区别只在于以何种方式包装,掩藏.
6)可能出现的错误,特别是连接错误:
Linking...
Linking...
main.obj : error LNK2001: unresolved external symbol "public: virtual bool __thiscall wxApp::Initialize(int &,wchar_t * *)" (?Initialize@wxApp@@UAE_NAAHPAPA_W@Z)
注意参数“wchar_t * *”,可见与UNICODE有关,改变设置Project ->Properties->Configuration Properties->General->Project Defaults->Character Set作一下改变(Use Unicode Character Set与Not Set)
7)我错了,其实还可以更短:
#include
"
wx/wx.h
"
class
Plot3DApp:
public
wxApp
{
public:
virtual bool OnInit();
}
;
IMPLEMENT_APP(Plot3DApp)
bool
Plot3DApp::OnInit()
{
wxFrame *frame=new wxFrame(NULL,wxID_ANY,wxT("Plot3D"));
frame->Show(true);
return true;
}