wxWidgets 常用的基本控件使用(转)
wxwidgets吧
全部回复
仅看楼主
level 8
.......往下看
2013年08月25日 01点08分 1
level 8
创建一个基本的wxWidgets窗口
#include "wx/wx.h"
//必须继承wxApp
class MyApp : public wxApp
{
public:
//入口函数
virtual bool OnInit();
};
//必须继承wxFrame
class MyFrame:public wxFrame
{
public: MyFrame(const wxString& title);
private:
//必须加这句,否则消息映射回报错
DECLARE_EVENT_TABLE()
};
bool MyApp::OnInit()
{
//创建一个继承自wxFrame的窗口对象
MyFrame *frame = new MyFrame(wxT("wokao"));
frame->Show(true);
return true;
}
//创建MyApp实例的代码在这里面
IMPLEMENT_APP(MyApp)
DECLARE_APP(MyApp)
MyFrame::MyFrame(constwxString& title):wxFrame(NULL,wxID_ANY,title)
{
/*
添加、初始化窗口控件的地方
*/
}
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
/*添加消息映射的地方:例如菜单响应
EVT_MENU(wxID_ABOUT, MyFrame::OnAbout)
MyFrame::OnAbout的声明格式是:
void OnAbout(wxCommandEvent& event);
*/
END_EVENT_TABLE()
2013年08月25日 01点08分 2
记号
2023年07月19日 14点07分
level 8
常用的控件介绍
菜单
wxMenuBar----菜单栏
wxMenu----菜单栏里面的元素,直接显示出来的,一级菜单
例:
wxMenuBar *menuBar = new wxMenuBar();
wxMenu *fileMenu = new wxMenu;
wxMenu *helpMenu = new wxMenu;
helpMenu->Append(wxID_ABOUT, "&About...\tF1", "FKU!");
fileMenu->Append(wxID_EXIT, "E&xit\tAlt-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,"&Quit\tAlt-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)
wxBitmapButton(wxWindow *parent, //显示该按钮的容器
wxWindowID id,//消息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("ta.bmp"));
//然后将图片转换成wxBitmap对象
wxBitmap bitmap(image);
new wxBitmapButton(Wind1,ID_BUTT,bitmap,wxPoint(10,30) );
响应的点击事件格式
EVT_BUTTON(wxID_OK,MyFrame::OnButton)
void MyFrame::OnButton(wxCommandEvent& event);
静态文本
wxStaticText(wxWindow *parent,//显示该控件的容器
wxWindowID id,//消息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)可以修改字符
2013年08月25日 01点08分 3
level 8

文本输入框
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)
例:
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)
EVT_TEXT(id,func) //当文字发生改变时触发
EVT_TEXT_ENTER(id,func)//当按下enter建时触发
下拉框
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;
MsgArr.Add("aaaaaa");
MsgArr.Add("bbbbb");
MsgArr.Add("ccccc");
MsgArr.Add("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,//显示容器
wxWindowID id,//消息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)
例:
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在上面显示刻度
常用成员函数:
tValue(int)//设置滑块的值
GetValue();//返回滑块的值
响应事件格式
Func格式: void funcName(wxScrollEvent& event);
EVT_SLIDER(wxMYID_SLIDER, funcName) //当滑动的值改变时触发
2013年08月25日 01点08分 4
level 8

选项框
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)
例:
new wxCheckBox(Wind1, wxMYID_CHBOX, wxT("我是字符"),wxPoint(10,110));
通过样式可以设置成3种状态的选项框
常用成员函数:
Enable(bool enable = true) 设置是否能点击改变状态
SetValue(bool value)主动设置状态
bool IsChecked()返回状态
void SetLabel(wxString)设置文本字符
常用事件
Func格式void OnCheckBox(wxCommandEvent& event)
EVT_CHECKBOX(wxMYID_CHBOX, OnCheckBox)//当状态改变时触发
滚动条
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) );
Wind->SetScrollbars(1,1, //每次移动像素
1000,1000); //总共能有多少个单位
该函数主要设置窗口视口的大小和滑块每移动一次 里面容器移动的步长
wxScrolledWindow::SetScrollbars(int pixelsPerUnitX, //每次移动像素
int pixelsPerUnitY,//每次移动像素
int noUnitsX, int noUnitsY,//总共能有多少个单位
int xPos = 0, int yPos = 0,
bool noRefresh = false );
树结构
wxTreeCtrl ( wxWindow * parent,
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 *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遍历所有子节点
SetItemText(const wxTreeItemId & item, const wxString & text );设置某个节点的文字
DeleteChildren ( const wxTreeItemId & item ) ;删除所有该节点的直接子节点
常用事件响应
Func格式: void funcName(wxTreeEvent& event)
EVT_TREE_ITEM_ACTIVATED(wxMYID_TREE, funcName)//双击节点的时候触发
2013年08月25日 01点08分 5
level 8
标签页
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 <wx/propgrid/propgrid.h>
库文件wxmsw29ud_propgrid.lib wxmsw29ud_adv.lib
wxPropertyGrid::wxPropertyGrid
( wxWindow*parent,
wxWindowID*id = wxID_ANY,
const wxPoint&pos = wxDefultPosition
const wxSize&size = wxDefaultSize
longstyle = wxPG_DEFAULT_STYLE
const wxChar*name= wxPropertyGridNameStr);
wxPropertyGrid *MyProperty;
MyProperty = new wxPropertyGrid(Wind1, wxMYID_PROPERTY, wxPoint(450,10),wxSize(300,200));
//创建一个字符串形式的属性格
MyProperty->Append( new wxStringProperty("String Property", wxPG_LABEL) );
//创建一个只能输入数字的属性格
MyProperty->Append( new wxIntProperty("Int Property", wxPG_LABEL,10) );
//创建一个BOOL行的
MyProperty->Append( new wxBoolProperty("Bool Property", wxPG_LABEL) );
//创建一个选择色块的属性
MyProperty->Append( new wxColourProperty(wxT("CustomColourProperty"), wxPG_LABEL) );
//创建一个选择路径的属性格
MyProperty->Append( new wxFileProperty( wxT("FileProperty"), wxT("TextFile") ) );
//创建一个下拉列表形式的属性格
wxPGChoices chs;//列表对象
chs.Add(wxT("我擦"),40);
chs.Add(wxT("我是傲娇的图片"), bitmap, 60+i); //直接将图片资源传入进去
MyProperty->Append( new wxEnumProperty(wxT("ddddd"),
wxPG_LABEL,
chs) );//将列表加入到该属性格
常用的成员函数
wxPGProperty* wxPropertyGridEvent ::GetProperty();//获取当前改变的属性
事件格式:
Func格式:void funcName(wxPropertyGridEvent& event)
EVT_PG_CHANGED( wxMYID_PROPERTY, funcName )//当某个属性发生变更时触发
2013年08月25日 01点08分 6
level 2
楼主好贴啊,很有用
2014年06月23日 06点06分 7
level 1
赞一个,widgets的学习资料少的可怜[怒]
2020年10月19日 07点10分 8
level 2
您好,我想请问下,这种导航栏应该怎么做啊?有示例代码或者相关资料吗?感谢!
2021年11月04日 06点11分 9
1