2023年12月15日发(作者:)

wxWidgets-2.9.0 + VC2008 的环境配置:

安装完wxWidgets后,去wxWidgets目录C:wxWidgets-2.9.0buildmsw,找到wx_如果报错: LB_GETITEMRECTZ找不到

解决方法:将默认的Debug模式选择为 Universal 版本

Debug运行库 多线程模式 改为MD

Release 改为MT

然后在VC里面加入路径:

包含文件路径:

C:wxWidgets-2.9.0libvc_libmswud(否则报无法打开文件“wx/setup.h”

C:wxWidgets-2.9.0include

库文件路径:

C:wxWidgets-2.9.0libvc_lib

文件,然后用VC编译,

编译完后会在C:wxWidgets-2.9.0lib里生成一个文件夹 vc_lib .

创建一个基本的wxWidgets窗口

#include "wx/wx.h"

//必须继承wxApp

class MyApp : public wxApp

{

public:

};

//必须继承wxFrame

class MyFrame:public wxFrame

{

public:

private:

};

//必须加这句,否则消息映射回报错

DECLARE_EVENT_TABLE()

MyFrame(const wxString& title);

//入口函数

virtual bool OnInit();

bool MyApp::OnInit()

{

}

//创建MyApp实例的代码在这里面

IMPLEMENT_APP(MyApp)

DECLARE_APP(MyApp)

MyFrame::MyFrame(const wxString& title):wxFrame(NULL,wxID_ANY,title)

{

}

BEGIN_EVENT_TABLE(MyFrame, wxFrame)

至此一个没有任何控件的基本窗口就生成了,下面是一些常用的控件

/*

*/

添加消息映射的地方:例如菜单响应

EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)

MyFrame::OnAbout的声明格式是:

void OnAbout(wxCommandEvent& event);

/*

*/

return;

添加、初始化窗口控件的地方

//创建一个继承自wxFrame的窗口对象

MyFrame *frame = new MyFrame(wxT("wokao"));

frame->Show(true);

return true;

END_EVENT_TABLE()

常用的控件介绍

菜单

wxMenuBar

wxMenu

----菜单栏

----菜单栏里面的元素,直接显示出来的,一级菜单

例:

wxMenuBar *menuBar = new wxMenuBar();

wxMenu *fileMenu = new wxMenu;

wxMenu *helpMenu = new wxMenu;

helpMenu->Append(wxID_ABOUT, "&F1", "FKU!");

fileMenu->Append(wxID_EXIT, "E&xittAlt-X", "FKU too!");

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

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

SetMenuBar(menuBar);

首先new一个菜单栏的对象,然后创建一级菜单,然后用wxMenu::Append创建出二级菜单,

第一个参数是消息ID,

第二个包含了菜单显示的字符和快捷键,&后面的字符代表当前页面时,可

的快捷键,t后面的也是快捷键,不需要打开菜单就能触发

第三个是描述,会显示在属性栏

以触发 然后通过wxMenuBar::Append将菜单加入到菜单栏里面

最后将菜单栏加入到窗口界面中

常用的成员函数

wxMenu::AppendSeparator();//在菜单中添加一条横线

wxMenu::AppendSubMenu(fileMenu,"&QuittAlt-Q","我了个去");//添加一条子菜单,最后一个参数是描述

相应的事件格式

EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)

void MyFrame::OnAbout(wxCommandEvent &event)

按钮

wxButton(wxWindow *parent, //显示该按钮的容器

wxWindowID id, //消息ID

const wxString& label = wxEmptyString, //按钮显示的字符

const wxPoint& pos = wxDefaultPosition,

const wxSize& size = wxDefaultSize,

long style = 0, //具体样式见API

const wxValidator& validator = wxDefaultValidator,

const wxString& name = wxButtonNameStr)

例:new wxButton(Wind1,ID_BUTTON1,wxT("OK"),wxPoint(10,10));

响应的点击事件格式

EVT_BUTTON(ID_BUTTON1,MyFrame::OnButton)

void MyFrame::OnButton(wxCommandEvent& event);

位图按钮

wxBitmapButton

(比较wxButton的区别就是把 显示字符换成图片wxBitmapButton)

//消息ID

wxBitmapButton(wxWindow *parent, //显示该按钮的容器

wxWindowID id,

const wxBitmap& bitmap,

const wxPoint& pos = wxDefaultPosition,

const wxSize& size = wxDefaultSize,

long style = wxBU_AUTODRAW,

const wxValidator& validator = wxDefaultValidator,

const wxString& name = wxButtonNameStr)

例:

//创建一个image对象,外部读取图片资源

wxImage image(wxT(""));

//然后将图片转换成wxBitmap对象

wxBitmap bitmap(image);

new wxBitmapButton(Wind1,ID_BUTT,bitmap,wxPoint(10,30) );

响应的点击事件格式

EVT_BUTTON(wxID_OK,MyFrame::OnButton)

void MyFrame::OnButton(wxCommandEvent& event);

静态文本

//消息ID

wxStaticText(wxWindow *parent, //显示该控件的容器

wxWindowID id,

const wxString& label,

const wxPoint& pos = wxDefaultPosition,

const wxSize& size = wxDefaultSize,

long style = 0,

const wxString& name = wxStaticTextNameStr)

例:

new wxStaticText(Wind1, ID_STXT,wxT("wolegequ"),wxPoint(500,10));

label就是要显示的字符 ->SetLabel(wxString)可以修改字符

文本输入框

wxTextCtrl(wxWindow *parent,

wxWindowID id,

const wxString& value = wxEmptyString,

const wxPoint& pos = wxDefaultPosition,

const wxSize& size = wxDefaultSize,

long style = 0,

const wxValidator& validator = wxDefaultValidator,

const wxString& name = wxTextCtrlNameStr)

EVT_TEXT(id,func) //当文字发生改变时触发

EVT_TEXT_ENTER(id,func)//当按下enter建时触发

例:

new wxTextCtrl(Wind1, ID_TT1,

wxT("WOLEGEQU"),wxPoint(100,10),

wxSize(200,100),wxTE_MULTILINE);

value 默认显示的字符

style = wxTE_MULTILINE代表多行,其他样式见API

SetEditable(bool editable) 设置是否可以编辑

Func格式:void funcName(wxCommandEvent& event)

常用函数:

响应事件格式

下拉框

wxComboBox ( wxWindow * parent,

wxWindowID id,

const wxString & value,

const wxPoint & pos,

const wxSize & size,

const wxArrayString & choices,

long style = 0,

const wxValidator & validator = wxDefaultValidator,

const wxString & name = wxComboBoxNameStr

)

例:

wxArrayString MsgArr;

("aaaaaa");

("bbbbb");

("ccccc");

("ddddd");

wxComboBox *CBox = new wxComboBox(Wind1,

wxMYID_COMBO,wxT("ddddd"),wxPoint(10,200),wxSize(100,30),

MsgArr,wxCB_DROPDOWN);

创建一个字符串数组wxArrayString MsgArr; 然后创建出来一个下拉列表

Func格式:void FuncNmae(wxCommandEvent& event);

EVT_COMBOBOX(id, func)://当选择某个元素时触发事件,可以调用GetValue()查看选择了哪一个

事件格式:

滑块

wxSlider(wxWindow *parent, //显示容器

//消息ID

//初始值

//最小值

//最大值

wxWindowID id,

int value,

int minValue,

int maxValue,

const wxPoint& pos = wxDefaultPosition,

const wxSize& size = wxDefaultSize,

long style = wxSL_HORIZONTAL, //水平滑调条

const wxValidator& validator = wxDefaultValidator,

const wxString& name = wxSliderNameStr)

选项框

例:

常用成员函数:

tValue(int)//设置滑块的值

GetValue();//返回滑块的值

new wxSlider(Wind1, wxMYID_SLIDER, 200, 0, 300,

wxPoint(10,140), wxSize(200,-1),

wxSL_HORIZONTAL|wxSL_LABELS|wxSL_TOP);

ORIZONTAL 是水平显示

SL_LABELS

SL_TOP

显示刻度

在上面显示刻度

部分常用样式:

响应事件格式

Func格式: void funcName(wxScrollEvent& event);

EVT_SLIDER(wxMYID_SLIDER, funcName) //当滑动的值改变时触发

wxCheckBox(wxWindow *parent,

wxWindowID id,

const wxString& label,

const wxPoint& pos = wxDefaultPosition,

const wxSize& size = wxDefaultSize,

long style = 0,

const wxValidator& validator = wxDefaultValidator,

const wxString& name = wxCheckBoxNameStr)

常用成员函数:

常用事件

Func格式void OnCheckBox(wxCommandEvent& event)

EVT_CHECKBOX(wxMYID_CHBOX, OnCheckBox)//当状态改变时触发

Enable(bool enable = true) 设置是否能点击改变状态

SetValue(bool value) 主动设置状态

bool IsChecked() 返回状态

void SetLabel(wxString)设置文本字符

例:

new wxCheckBox(Wind1, wxMYID_CHBOX, wxT("我是字符"),wxPoint(10,110));

通过样式可以设置成3种状态的选项框

滚动条

wxScrollBar(wxWindow *parent, wxWindowID id,

const wxPoint& pos = wxDefaultPosition,

const wxSize& size = wxDefaultSize,

long style = wxSB_HORIZONTAL,

const wxValidator& validator = wxDefaultValidator,

const wxString& name = wxScrollBarNameStr)

这个是单独创建一个滚动条组件(详见API文档,这里主要介绍wxScrolledWindow)

如果需要创建带滚动条的窗口 可以直接使用容器wxScrolledWindow

wxScrolledWindow(wxWindow *parent,

wxWindowID winid = wxID_ANY,

const wxPoint& pos = wxDefaultPosition,

const wxSize& size = wxDefaultSize,

long style = wxScrolledWindowStyle,

const wxString& name = wxPanelNameStr)

例:

wxScrolledWindow *Wind = new wxScrolledWindow(this, wxMYID_SCROLLED,

wxPoint(0,0), wxSize(500,400) );

1000,1000); //总共能有多少个单位

Wind->SetScrollbars(1,1, //每次移动像素

该函数主要设置窗口视口的大小和滑块每移动一次 里面容器移动的步长

int pixelsPerUnitY, //每次移动像素

wxScrolledWindow::SetScrollbars(int pixelsPerUnitX, //每次移动像素

int noUnitsX, int noUnitsY,//总共能有多少个单位

int xPos = 0, int yPos = 0,

bool noRefresh = false );

树结构

wxWindowID id = wxID_ANY,

const wxPoint & pos = wxDefaultPosition,

const wxSize & size = wxDefaultSize,

long style = wxTR_DEFAULT_STYLE,

const wxValidator & validator = wxDefaultValidator,

const wxString & name = wxTreeCtrlNameStr

)

wxTreeCtrl ( wxWindow * parent,

wxTreeCtrl *MyTree=new wxTreeCtrl(Wind1, wxMYID_TREE, wxPoint(10, 260), wxSize(100,200));

wxTreeItemId rootID1 = MyTree->AddRoot(wxT("我是第一个ROOT"));

wxTreeItemId citem1 = MyTree->AppendItem(rootID1,wxT("child11"));

wxTreeItemId citem2 = MyTree->AppendItem(citem1,wxT("child12"));

wxTreeItemId citem3 = MyTree->AppendItem(citem1,wxT("child13"));

创建一个wxTreeCtrl对象, 然后使用成员函数wxTreeCtrl::AddRoot创建一个根目录,返回一个wxTreeItemID对象,这个当作根节点,一个树形结构只能有一个根节点,否则会报错,然后使用成员函数

wxTreeCtrl::AppendItem创建子节点.

遍历某个树状控件的所有子项可以使用GetRootItem函数获得根节点,然后使用GetFirstChild和GetNextChild遍历所有子节点

常用事件响应

Func格式: void funcName(wxTreeEvent& event)

EVT_TREE_ITEM_ACTIVATED(wxMYID_TREE, funcName)//双击节点的时候触发

SetItemText(const wxTreeItemId & item, const wxString & text );设置某个节点的文字

DeleteChildren ( const wxTreeItemId & item ) ;删除所有该节点的直接子节点

标签页

wxNotebook ( wxWindow * parent,

wxWindowID id,

const wxPoint & pos = wxDefaultPosition,

const wxSize & size = wxDefaultSize,

long style = 0,

const wxString & name = wxNotebookNameStr

)

wxNotebook *MyNotebook;

MyNotebook = new wxNotebook(Wind1, wxMYID_NOTEBOOK, wxPoint(150,260),wxSize(400,300));

//创建面板

wxPanel *myPandl1 = new wxPanel(MyNotebook, wxID_ANY);

wxPanel *myPandl2 = new wxPanel(MyNotebook, wxID_ANY);

wxPanel *myPandl3 = new wxPanel(MyNotebook, wxID_ANY);

wxPanel *myPandl4 = new wxPanel(MyNotebook, wxID_ANY);

//将面板加入标签

MyNotebook->AddPage(myPandl1, wxT("我"));

MyNotebook->AddPage(myPandl2, wxT("了"));

MyNotebook->AddPage(myPandl3, wxT("个"));

MyNotebook->AddPage(myPandl4, wxT("去"));

创建一个wxNotebook对象,然后创建wxPanel对象,显示的容器设置为创建的MyNotebook,这就创建了容器.然后使用wxNotebook:: AddPage将容器绑定相应的标签,这就创建完成了,然后往响应的容易里面创建各个控件.(标签的显示可以通过样式style控制)

事件响应:

Func格式: void funcName(wxBookCtrlEvent& event);

EVT_NOTEBOOK_PAGE_CHANGED(id, func)://切换出当前页面时触发

EVT_NOTEBOOK_PAGE_CHANGING(id, func):// 切换到当前标签时触发

属性格

wxPropertyGrid

头文件 #include

库文件 wxmsw29ud_ wxmsw29ud_

wxPropertyGrid::wxPropertyGrid

( wxWindow*

wxWindowID*

parent,

id = wxID_ANY,

pos = wxDefultPosition

style = wxPG_DEFAULT_STYLE

const wxPoint&

long

const wxSize& size = wxDefaultSize

const wxChar* name = wxPropertyGridNameStr);

wxPropertyGrid *MyProperty;

//创建一个下拉列表形式的属性格

wxPGChoices chs;//列表对象

(wxT("我是傲娇的图片"), bitmap, 60+i); //直接将图片资源传入进去

MyProperty->Append( new wxEnumProperty(wxT("ddddd"),

chs) );//将列表加入到该属性格

常用的成员函数

wxPGProperty* wxPropertyGridEvent ::GetProperty();//获取当前改变的属性

void funcName(wxPropertyGridEvent& event)

事件格式:

Func格式:

EVT_PG_CHANGED( wxMYID_PROPERTY, funcName )//当某个属性发生变更时触发

MyProperty = new wxPropertyGrid(Wind1, wxMYID_PROPERTY, wxPoint(450,10),wxSize(300,200));

//创建一个字符串形式的属性格

//创建一个只能输入数字的属性格

//创建一个BOOL行的

//创建一个选择色块的属性

MyProperty->Append( new wxColourProperty(wxT("CustomColourProperty"), wxPG_LABEL) );

//创建一个选择路径的属性格

MyProperty->Append( new wxStringProperty("String Property", wxPG_LABEL) );

MyProperty->Append( new wxIntProperty("Int Property", wxPG_LABEL,10) );

MyProperty->Append( new wxBoolProperty("Bool Property", wxPG_LABEL) );

MyProperty->Append( new wxFileProperty( wxT("FileProperty"), wxT("TextFile") ) );

(wxT("我擦"),40);

wxPG_LABEL,