一直在寻找一个方便使用的C++GUI库。今天终于把WxWidgets搞定。
大致的步骤是四步:
第一步,Eclipse及CDT的安装
第二步,MinGW及编译器的安装配置
第三步,wxWidget的下载及编译
第四步,Eclipse下有关wxWidget的配置
mingw32-make -f makefile.gcc BUILD=release SHARED=0 UNICODE=1 USE_ODBC=1 通过makefile.gcc 这个文件将整个项目编译好,你会等很久大约半个多小时,编译后目录涨到800多M,因为一部分是.o的中间文件, 可以删除。 编译后你会在安装目录的(c:\wxWidgets-2.8.0\lib\gcc_lib)下看到一堆扩展名为 .a 的Archive文件(windows下的库文件为.lib linux下为 .a)和几个目录,类似mswu,mswud。 第三步完成。 第四步,Eclipse下有关wxWidgets的配置 首先启动你的Eclipse并建立一个Managed C++ Project。创建完成后右键该项目并选择"Properties"属性对话框在其中选择“C/C++ Build"选项。 在C/C++Build选项界面中,选择“Configuration Settings”的"Tool Settings“。 在Tool Settings中选择"GCC C++ Compiler"->"Preprocessor", 在Defined symbols列表中加入:__WXMSW__ (注意,两侧都是双下划线), __WXDEBUG__ 和 _UNICODE (此处是单下划线, 因为你的wxWidgets是用unicode编码编译的,所以此处一定要设置该宏,不然在编译时会收到大量"undefined reference")。 接下来你需要选择Directories项并添加include及lib目录,在这里你需要添加 "C:\wxWidgets-2.8.0\lib\gcc_lib\mswud" "C:\wxWidgets-2.8.0\lib\gcc_lib\mswu" "C:\wxWidgets-2.8.0\include" "C:\wxWidgets-2.8.0\contrib\include" 这四个目录进Directories。 接下来在下面的 Miscellaneous 选项中的Other Flags中输入以下这句 -c -Wundef -Wno-ctor-dtor-privacy -fno-strict-aliasing
接下来点选到 "GCC C++ Linker" 部分。在这部分,首先选择"Libraries"并在右侧的Libraries栏中按顺序键入以下库名:
wxmsw28ud_xrc,wxmsw28ud_richtext, wxbase28ud_net, wxmsw28ud_dbgrid, wxbase28ud_odbc,wxmsw28ud_media, wxmsw28ud_aui, wxmsw28ud_html, wxmsw28ud_adv,wxbase28ud_xml, wxmsw28ud_core, wxbase28ud, wxtiffd, wxjpegd, wxpngd,wxzlibd, wxregexud, wxexpatd, kernel32, user32, gdi32, comdlg32,winspool, winmm, shell32, comctl32, ole32, oleaut32, uuid, rpcrt4,advapi32, wsock32, odbc32
库名全部加入后在下面一栏的"Library search path (-L)"中加入以下目录
"C:/wxWidgets-2.8.0/lib/gcc_lib"
"C:/wxWidgets-2.8.0/lib"
添加完成后,选择该部分中的"Miscellaneous"项,并在"Linker flags"中键入
-Wl,--subsystem,windows -mwindows
此时,点击应用。
再切换到"Build Settings"标签页,勾掉"Build Command"中的,"Use default command"前的勾儿,并将命令 make 改为
mingw32-make -fmakefile
最终,点击"OK"使设置生效。
到这里,你可以把wxwidgets中的samples拿来试一试了,把代码Copy进你的工程,编译运行一下,看看结果。
我想,你应该成功了。。。。
下面是第一个WxWidgets程序的代码:
#include "wx/wx.h"
using namespace std;
class MyApp:public wxApp
{
public:
vrtual bool OnInit();
};
class MyFrame:public wxFrame
{
public:
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) ;
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
DECLARE_EVENT_TABLE()
};
enum
{
ID_Quit = 1,
ID_About,
};
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(ID_Quit, MyFrame::OnQuit)
EVT_MENU(ID_About, MyFrame::OnAbout)
END_EVENT_TABLE()
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
MyFrame *frame = new MyFrame( wxT("Hello World"), wxPoint(50,50), wxSize(450,340) ) ;
frame->Show(TRUE);
SetTopWindow(frame);
return TRUE;
}
MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
: wxFrame((wxFrame *)NULL, -1, title, pos, size)
{
wxMenu *menuFile = new wxMenu;
menuFile->Append( ID_About, wxT("&About...") ) ;
menuFile->AppendSeparator();
menuFile->Append( ID_Quit, wxT("E&xit") ) ;
wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append( menuFile, wxT("&File") ) ;
SetMenuBar( menuBar ) ;
CreateStatusBar();
SetStatusText( wxT("Welcome to wxWindows!") ) ;
}
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(TRUE);
}
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxMessageBox(wxT("This is a wxWindows Hello world sample"),
wxT("About Hello World"), wxOK | wxICON_INFORMATION, this) ;
}
注: