最短的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"
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 SetNot 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;
}

原文地址:https://www.cnblogs.com/eyye/p/1207447.html