一. 编译
例子工程代码: http://download.csdn.net/source/3188860
根据你自己的安装目录来定
C:/wxWidgets 2.8.0/build/msw 目录,分别输入如下命令行:
清理: mingw32-make -f makefile.gcc clean
Release:mingw32-make -f makefile.gcc MONOLITHIC=0 SHARED=1 UNICODE=1 BUILD=release
Debug: mingw32-make -f makefile.gcc MONOLITHIC=0 SHARED=1 UNICODE=1 BUILD=debug
1.1 VC编译器:
// Unicode 发布动态版 (生成的文件在vc_dll中)
nmake -f makefile.vc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=1
nmake -f makefile.vc BUILD=release SHARED=1 MONOLITHIC=0 UNICODE=1
// Unicode 发布静态版 (生成的文件在vc_lib中)
nmake -f makefile.vc BUILD=release SHARED=0 MONOLITHIC=1 UNICODE=1
nmake -f makefile.vc BUILD=release SHARED=0 MONOLITHIC=0 UNICODE=1
// Unicode 调试动态版 (生成的文件在vc_dll中)
nmake -f makefile.vc BUILD=debug SHARED=1 MONOLITHIC=1 UNICODE=1
nmake -f makefile.vc BUILD=debug SHARED=1 MONOLITHIC=0 UNICODE=1
// Unicode 调试静态版(生成的文件在vc_lib中)
nmake -f makefile.vc BUILD=debug SHARED=0 MONOLITHIC=1 UNICODE=1
nmake -f makefile.vc BUILD=debug SHARED=0 MONOLITHIC=0 UNICODE=1
// 多字节发布动态版(生成的文件在vc_dll中)
nmake -f makefile.vc BUILD=release SHARED=1 MONOLITHIC=1 UNICODE=0
nmake -f makefile.vc BUILD=release SHARED=1 MONOLITHIC=0 UNICODE=0
// 多字节发布静态版 (生成的文件在vc_lib中)
nmake -f makefile.vc BUILD=release SHARED=0 MONOLITHIC=1 UNICODE=0
nmake -f makefile.vc BUILD=release SHARED=0 MONOLITHIC=0 UNICODE=0
// 多字节调试动态版 (生成的文件在vc_dll中)
nmake -f makefile.vc BUILD=debug SHARED=1 MONOLITHIC=1 UNICODE=0
nmake -f makefile.vc BUILD=debug SHARED=1 MONOLITHIC=0 UNICODE=0
// 多字节调试静态版 (生成的文件在vc_lib中)
nmake -f makefile.vc BUILD=debug SHARED=0 MONOLITHIC=1 UNICODE=0
nmake -f makefile.vc BUILD=debug SHARED=0 MONOLITHIC=0 UNICODE=0
// BUILD=debug/release 调试版/发布版
// SHARED=1/0 编译成动态库/静态库
// MONOLITHIC=1/0 生成一个dll/生成一个静态库对应一个dll
// UNICODE=1/0 Unicode版/多字节版
还有很多其他选项, 慢慢理解吧
编译好后, 在C:/wxWidgets 2.8.0/lib目录生成对应的文件和目录
SHARED=1 生成vc_dll目录 该目录下有对应的lib和dll文件, 还有对应的setup.h文件, 该文件VC中需要.
SHARED=0 生成vc_lib目录 该目录下有对应的lib, 还有对应的setup.h文件, 该文件VC中需要 vc_lib 的lib文件时静态链接时使用.
二. 创建VC工程使用wxWidget
http://hi.baidu.com/mingyueye/blog/item/c8b2ab0f04e2f7e8ab64575f.html
wxWidgets 是跨平台的GUI库,用VC6会影响它的跨平台性吗?当然不会,我们只是用VC6充当编译器和编辑器,只要编写代码时注意不使用Windows相关的特性,写出的代码仍然是跨平台的,仍然是可以在其它操作系统下(如Linux)使用其它C++编译器(如GCC)编译并运行的。
2.1创建VC工程
点击菜单:File -> New... 创建一个“Win32 Application” Project,项目名称为“wxProject”,点击OK按钮,
在下一步的提示中选择“An Empty Project”,点击Finish按钮完成项目的创建。
2.2设置编译的版本Debug/Release/…
我这里设置了有3个选项可以组合, 他们的配置是不同的
Win32 Debug // 多字节 动态链接 调试版
Win32 Release // 多字节 动态链接 发布版
Win32 Unicode Debug // Unicode 动态链接 调试版
Win32 Unicode Release // Unicode 动态链接 发布版
Win32 Debug Static // 多字节 静态链接 调试版
Win32 Release Static // 多字节 静态链接 发布版
Win32 Unicode Debug Static // Unicode 静态链接 调试版
Win32 Unicode Release Static // Unicode 静态链接 发布版
添加这些可以在VC菜单 Build | Configurations 中配置.
2.2.1 Win32 Debug // 多字节 动态链接 调试版
Win32 Debug:
C/C++ | General:
Preprocessor definitions:
WIN32,_DEBUG,__WXMSW__,WXUSINGDLL,__WXDEBUG__,_MBCS,_WINDOWS,NOPCH
C/C++ | Code Generation:
Use run-time library:
Debug Multithreaded DLL
C/C++ | Preprocessor
Additional include directories:
$(MyWxWidgets)/include,$(MyWxWidgets)/lib/vc_dll/mswd
Link | General:
Object/library modules:
wxmsw28d_xrc.lib wxmsw28d_html.lib wxmsw28d_adv.lib wxmsw28d_core.lib wxbase28d_xml.lib wxbase28d.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib 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
Link | Input
Additional library path:
$(MyWxWidgets)/lib/vc_dll
其中: __WXMSW__ 告诉wxWidget这是在Window系统中使用.
WXUSINGDLL 告诉VC 使用动态链接(运行时需要dll).
__WXDEBUG__ 告诉wxWidget这是调试版本.
$(MyWxWidgets) 这是wxWidget的安装目录, 在这里设置成系统环境变量, 并把其设置到VC工程中而不设置在VC工具中(避免换电脑时重新设置.可以参考文章 “关于VC的一些路径设置问题(h文件和lib文件的路径)”)
2.2.2 Win32 Release // 多字节 动态链接 发布版
Win32 Release:
C/C++ | General:
Preprocessor definitions:
WIN32,NDEBUG,_WINDOWS,_MBCS,__WXMSW__,WXUSINGDLL,NOPCH
C/C++ | Code Generation:
Use run-time library:
Multithreaded DLL
C/C++ | Preprocessor
Additional include directories:
$(MyWxWidgets)/include,$(MyWxWidgets)/lib/vc_dll/msw
Link | General:
Object/library modules:
wxmsw28_xrc.lib wxmsw28_html.lib wxmsw28_adv.lib wxmsw28_core.lib wxbase28_xml.lib wxbase28.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib 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
Link | Input
Additional library path:
$(MyWxWidgets)/lib/vc_dll
2.2.3 Win32 Unicode Debug // Unicode 动态链接 调试版
Win32 Unicode Debug:
C/C++ | General:
Preprocessor definitions:
WIN32,_DEBUG,__WXMSW__,__WXDEBUG__,WXUSINGDLL,_UNICODE,_WINDOWS,NOPCH
C/C++ | Code Generation:
Use run-time library:
Debug Multithreaded DLL
C/C++ | Preprocessor
Additional include directories:
$(MyWxWidgets)/include,$(MyWxWidgets)/lib/vc_dll/mswud
Link | General:
Object/library modules:
wxmsw28ud_xrc.lib wxmsw28ud_html.lib wxmsw28ud_adv.lib wxmsw28ud_core.lib wxbase28ud_xml.lib wxbase28ud.lib wxtiffd.lib wxjpegd.lib wxpngd.lib wxzlibd.lib wxregexd.lib wxexpatd.lib 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
Link | Input
Additional library path:
$(MyWxWidgets)/lib/vc_dll
2.2.4 Win32 Unicode Release // Unicode 动态链接 发布版
Win32 Unicode Release:
C/C++ | General:
Preprocessor definitions:
WIN32,NDEBUG,_WINDOWS,NOPCH,_UNICODE,__WXMSW__,WXUSINGDLL
C/C++ | Code Generation:
Use run-time library:
Multithreaded DLL
C/C++ | Preprocessor
Additional include directories:
$(MyWxWidgets)/include,$(MyWxWidgets)/lib/vc_dll/mswu
Link | General:
Object/library modules:
wxmsw28u_xrc.lib wxmsw28u_html.lib wxmsw28u_adv.lib wxmsw28u_core.lib wxbase28u_xml.lib wxbase28u.lib wxtiff.lib wxjpeg.lib wxpng.lib wxzlib.lib wxregex.lib wxexpat.lib 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
Link | Input
Additional library path:
$(MyWxWidgets)/lib/vc_dll
其他版本照着做就可以了. 要注意的地方就是 静态链接vc_dll 改为vc_lib, 还有就是WXUSINGDLL不需要.
2.3创建wxWidgets预编译头文件
各个编译器不同,有的支持预编译头文件,有的不支持,支持预编译头文件的,使用的语法也有所不同,如果在每个源文件中都重复的写未免不爽,还是集中到一个头文件中来比较好。但是注意,有了此文件并不决定或限制你使用还是不使用预编译头文件,用不用以及怎么用还是在你。
点击菜单 File -> New...,新建一个C/C++头文件 wx_pch.h,其内容如下:
// wx_pch.h
#pragma once
#if(defined(USE_PCH) && !defined(WX_PRECOMP))
#define WX_PRECOMP
#endif// USE_PCH
/*
// basic wxWidgets headers
#include<wx/wxprec.h>
// for use xrc files
#include<wx/xrc/xmlres.h>
#include <wx/app.h>
*/
// basic wxWidgets headers
#include <wx/wxprec.h>
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#include <wx/wx.h>
#include <wx/dc.h>
#include <wx/listctrl.h>
#include <wx/stattext.h>
#include <wx/textctrl.h>
#include <wx/srchctrl.h>
#include <wx/statline.h>
#include <wx/choice.h>
#include <wx/radiobut.h>
#include <wx/dynarray.h>
#include <wx/grid.h>
#include <wx/aui/aui.h>
#include <wx/splitter.h>
#ifndef WX_PRECOMP
#include<wx/wx.h>
#endif
#ifdef USE_PCH
// put here all your rarely-changing header files
#endif// USE_PCH
wxWidgets官方文档是大概也是这样推荐
创建wxApp子类
点击菜单 Insert -> New Class...,新建一个名称为“CBaseApp”的类(类名称可以随意),此操作将生成文件 BaseApp.h 和 BaseApp.cpp。
VC在这里生成的类代码显然是不满足我们的要求的,需要进行以下修改:BaseApp.h
增加预编译头文件 wx_pch.h 的包含(以后创建的每个.h文件都要包含它):#include"wx_pch.h"
指定App类的父类为wxApp:即将“class App”修改为“class App :public wxApp”
为类增加虚方法OnInit()的声明:virtual bool OnInit();
在类声明的下方增加 wxWidgets App 声明:DECLARE_APP(App)
最终 app.h 的内容如下
// BaseApp.h: interface for the CBaseApp class.//
//
#if !defined(AFX_BASEAPP_H__0AD39875_90C3_42E6_AF12_91C7FBA61B7B__INCLUDED_)
#define AFX_BASEAPP_H__0AD39875_90C3_42E6_AF12_91C7FBA61B7B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "wx_pch.h"
class CBaseApp : public wxApp
{
public:
CBaseApp();
virtual ~CBaseApp();
virtual bool OnInit();
};
DECLARE_APP(CBaseApp)
#endif // !defined(AFX_BASEAPP_H__0AD39875_90C3_42E6_AF12_91C7FBA61B7B__INCLUDED_)
//
增加头文件包含(此头文件将在下面创建MainFrame类时创建):#include"mainframe.h"
增加 OnInit() 方法的定义(其中用到的MainFrame类定义于mainframe.h,见后文)
// BaseApp.cpp
// BaseApp.cpp: implementation of the CBaseApp class.
//
//
#include "BaseApp.h"
#include "MainFrame.h"
IMPLEMENT_APP(CBaseApp)
//
// Construction/Destruction
//
CBaseApp::CBaseApp()
{}
CBaseApp::~CBaseApp()
{}
bool CBaseApp::OnInit()
{
CMainFrame* mainFrame = new CMainFrame(NULL, _("MainFrameby liigo.com"));
mainFrame->Show();
SetTopWindow(mainFrame);
return true;
}
2.4 创建wxFrame子类
点击菜单 Insert -> New Class...,新建一个名称为“CMainFrame”的类(类名称可以随意).
此操作将生成文件 MainFrame.h 和 MainFrame.cpp。
下面对VC生成的类代码进行相应的修改:
MainFrame.h
增加预编译头文件的包含:#include"wx_pch.h"
指定CMainFrame类的父类为wxFrame:class CMainFrame :public wxFrame
修改构造函数的声明:MainFrame(wxWindow*parent,const wxString&title);
在类定义的末尾增加事件表声明:DECLARE_EVENT_TABLE()
最终 MainFrame.h 的内容如下:
// MainFrame.h: interface for the CMainFrame class.//
//
#if !defined(AFX_MAINFRAME_H__7A6D7ABF_9D22_4DCD_B256_9543B6FB022B__INCLUDED_)
#define AFX_MAINFRAME_H__7A6D7ABF_9D22_4DCD_B256_9543B6FB022B__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include"wx_pch.h"
class CMainFrame : public wxFrame
{
public:
CMainFrame(wxWindow*parent, const wxString&title);
virtual ~CMainFrame();
DECLARE_EVENT_TABLE()
};
#endif // !defined(AFX_MAINFRAME_H__7A6D7ABF_9D22_4DCD_B256_9543B6FB022B__INCLUDED_)
/
MainFrame.cpp
修改构造函数的定义:
CMainFrame:: CMainFrame (wxWindow*parent,const wxString&title) :wxFrame(parent,wxID_ANY,title)
{
//wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, _("some text"));}
增加事件表定义(BEGIN_EVENT_TABLE 与 END_EVENT_TABLE 之间保留空白,留待以后绑定事件):
BEGIN_EVENT_TABLE(CMainFrame,wxFrame)
END_EVENT_TABLE()
最终 MainFrame.cpp 的内容如下
// MainFrame.cpp: implementation of the CMainFrame class.
//
//
#include "MainFrame.h"
//
// Construction/Destruction
//
BEGIN_EVENT_TABLE(CMainFrame, wxFrame)
END_EVENT_TABLE()
CMainFrame::CMainFrame(wxWindow*parent,const wxString& title)
: wxFrame(parent, wxID_ANY, title)
{}
CMainFrame::~CMainFrame()
{}
2.5 执行结果