最短的wxWidgets程序
    写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"
#include"wx/wx.h"
 class Plot3DApp:public wxApp{
class Plot3DApp:public wxApp{
 public:
public:
 virtual bool OnInit();
     virtual bool OnInit();
 };
};

 class Plot3DFrame:public wxFrame{
class Plot3DFrame:public wxFrame{
 public:
public:
 Plot3DFrame(const wxString& title);
     Plot3DFrame(const wxString& title);
 };
};

 IMPLEMENT_APP(Plot3DApp)
IMPLEMENT_APP(Plot3DApp)
 bool Plot3DApp::OnInit(){
bool Plot3DApp::OnInit(){
 Plot3DFrame *frame=new Plot3DFrame(wxT("Plot3D"));
     Plot3DFrame *frame=new Plot3DFrame(wxT("Plot3D"));
 frame->Show(true);
     frame->Show(true);
 return true;
     return true;
 }
}

 Plot3DFrame::Plot3DFrame(const wxString &title)
Plot3DFrame::Plot3DFrame(const wxString &title)
 :wxFrame(NULL,wxID_ANY,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()函数至少要实现类似
这两句功能,即构造一个Frame类并显示,进入消息循环;
4)Frame类要设置好父类wxFrame的两个参数::wxFrame(NULL,wxID_ANY,title)
5)main()或WinMain()在哪里?
看到了吗?看来每个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"
#include"wx/wx.h"
 class Plot3DApp:public wxApp{
class Plot3DApp:public wxApp{
 public:
public:
 virtual bool OnInit();
     virtual bool OnInit();
 };
};
 IMPLEMENT_APP(Plot3DApp)
IMPLEMENT_APP(Plot3DApp)
 bool Plot3DApp::OnInit(){
bool Plot3DApp::OnInit(){
 wxFrame *frame=new wxFrame(NULL,wxID_ANY,wxT("Plot3D"));
     wxFrame *frame=new wxFrame(NULL,wxID_ANY,wxT("Plot3D"));
 frame->Show(true);
     frame->Show(true);
 return true;
     return true;
 }
}
一个wxWidgets程序至少应该这样:
 #include"wx/wx.h"
#include"wx/wx.h" class Plot3DApp:public wxApp{
class Plot3DApp:public wxApp{ public:
public: virtual bool OnInit();
     virtual bool OnInit(); };
};
 class Plot3DFrame:public wxFrame{
class Plot3DFrame:public wxFrame{ public:
public: Plot3DFrame(const wxString& title);
     Plot3DFrame(const wxString& title); };
};
 IMPLEMENT_APP(Plot3DApp)
IMPLEMENT_APP(Plot3DApp) bool Plot3DApp::OnInit(){
bool Plot3DApp::OnInit(){ Plot3DFrame *frame=new Plot3DFrame(wxT("Plot3D"));
     Plot3DFrame *frame=new Plot3DFrame(wxT("Plot3D")); frame->Show(true);
     frame->Show(true); return true;
     return true; }
}
 Plot3DFrame::Plot3DFrame(const wxString &title)
Plot3DFrame::Plot3DFrame(const wxString &title) :wxFrame(NULL,wxID_ANY,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->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); \
}
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"
#include"wx/wx.h" class Plot3DApp:public wxApp{
class Plot3DApp:public wxApp{ public:
public: virtual bool OnInit();
     virtual bool OnInit(); };
}; IMPLEMENT_APP(Plot3DApp)
IMPLEMENT_APP(Plot3DApp) bool Plot3DApp::OnInit(){
bool Plot3DApp::OnInit(){ wxFrame *frame=new wxFrame(NULL,wxID_ANY,wxT("Plot3D"));
     wxFrame *frame=new wxFrame(NULL,wxID_ANY,wxT("Plot3D")); frame->Show(true);
     frame->Show(true); return true;
     return true; }
} 
                    
                     
                    
                 
                    
                
 


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号