Q.C人生

君子博学而日参省乎己,则知明而行无过矣

导航

wxwidgets 学习笔记(1) 从一个空项目Getting Start

Posted on 2010-12-14 22:33  ChanghW  阅读(2609)  评论(2编辑  收藏  举报

1.       启动VS2008并建立一个空项目,暂时命名为wxMyFirst

2.       分别加入wxfirst.h wxfirst.cpp

3.       .h文件中输入如下内容

//首先引入最基础的头文件

#include <wx/wx.h>

//建立一个APP,类似于MFCCWinApp,每个应用程序都只有一个APP

class MyApp : public wxApp

{

public:

// 该函数等同于 _tmain(),不同的是返回true进入消息循环,返回false 应用程序退出

virtual bool OnInit();

};

// 定义我的主运行窗口,应该就是CWnd,但由于是主窗口,因此叫做frame

class MyFrame : public wxFrame

{

public:

// 传入窗口标题

MyFrame(const wxString& title);

// 两个消息处理函数

void OnQuit(wxCommandEvent& event);

void OnAbout(wxCommandEvent& event);

private:

// 这个宏实际上向MyFrame类中加入了事件处理需要的字段和几个处理函数,感觉实现机制同MFC类似,就是用for代替switch进行消息路由

DECLARE_EVENT_TABLE()

};

// 此处声明了一个外部函数 MyApp& GetApp(),该函数返回一个Hinstance

// {return *static_cast< MyApp *>(wxApp::GetInstance());}

DECLARE_APP(MyApp)

// 此宏实际上就是winmain

IMPLEMENT_APP(MyApp)

 

其实仔细观察确实觉得wxwingetsMFC有几分相似

4.       .Cpp中输入如下内容

#include "wxfirst.h"

bool MyApp::OnInit()

{

// 建立主窗体

MyFrame *frame = new MyFrame(wxT("Minimal wxWidgets App"));

// 显示主窗体

frame->Show(true);

// 返回true表示可以进行消息循环,返回false直接退出框架

return true;

}

 

// 事件映射表,MFC相似

BEGIN_EVENT_TABLE(MyFrame, wxFrame)

EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)

EVT_MENU(wxID_EXIT, MyFrame::OnQuit)

END_EVENT_TABLE()

// About处理函数

void MyFrame::OnAbout(wxCommandEvent& event)

{

   wxString msg;

   msg.Printf(wxT("Hello and welcome to %s"),wxVERSION_STRING);

   wxMessageBox(msg, wxT("About Minimal"),wxOK | wxICON_INFORMATION, this);

}

//退出处理函数

void MyFrame::OnQuit(wxCommandEvent& event)

{

// 销毁框架

   Close();

}

//主窗口实现类

MyFrame::MyFrame(const wxString& title)

: wxFrame(NULL, wxID_ANY, title)

{

//手工建立菜单条

wxMenu *fileMenu = new wxMenu;

wxMenu *helpMenu = new wxMenu;

//向菜单中加入menuitem

helpMenu->Append(wxID_ABOUT, wxT("&About...\tF1"),wxT("Show about dialog"));

fileMenu->Append(wxID_EXIT, wxT("E&xit\tAlt-X"),wxT("Quit this program"));

// 菜单加入菜单条.

wxMenuBar *menuBar = new wxMenuBar();

menuBar->Append(fileMenu, wxT("&File"));

menuBar->Append(helpMenu, wxT("&Help"));

// 菜单条加入框架窗体,     ---有点啰嗦,但对于编程实现菜单还是很方便的---

SetMenuBar(menuBar);

// 建立状态条

CreateStatusBar(2);

SetStatusText(wxT("Welcome to wxWidgets!"));

}

我们注意一下宏wxT() 他相当于_T()L

 

5.       完成了程序输入后,现在开始进行编译环境的设置了:

5.1    首先建立一个配置,由于我编译时采用的unicode debug,因此我也需要建立这样一个配置 Universal Debug,并激活.

5.2    常规属性页中内容如下:

             配置类型:应用程序

             MFC的使用: 标准windows

             ATL使用: 不使用

             字符集: 使用Unicode字符集

             公共语言运行时支持:

5.3    C/C++属性页修改的内容比较多

    【常规页面】     首先需要在附加包含目录中加入wxwidgetsinclude目录

【调试信息格式】  /zi 程序数据库,经过等级 4

【优化页面】     优化:禁用(/od)

【预处理器页面】   预处理器定义如下: WIN32  _DEBUG  __WXMSW__  __WXUNIVERSAL__ _UNICODE  __WXMICROWIN__  _WINDOWS NOPCH

【代码生成页面】

  基本运行时检测: 两者 运行库: /MDd

5.4    连接器定义:该处虽然内容不多,但是作用很大

【常规页面】中设定启用增量连接,可以让编译快一些,然后设定附加库(.lib)文件的路径应指向:安装路径\lib\vc_lib.

【输入页面】中的附加依赖项加入下面几个库wxmswuniv29ud_core.lib wxbase29ud.lib comctl32.lib rpcrt4.lib,由于我使用了很小一部库的内容因此我只引用了很少的库,但要注意的是,由于我是从空项目开始,因此必须引入comctl32.lib rpcrt4.lib这两个,否则会出现找不到符号的错误,可能是Core这个库中应用了imagelist的原因吧.

【调试页面】生成调试信息项目选折是,

【系统页面】子系统选中windows

【高级页面】目标计算机项,选中MachineX86

    5.5 编译运行。应该显示出如下wxwigets的第一个界面了。