开发环境
系统 | IDE | wxWidgets版本 |
---|---|---|
Win7 | VS2015 | 3.1.1 |
搭建请看 【配置】VS2015下wxWidgets 3.1.1开发环境
逐步追加代码,理解wxWidgets结构。
想简单的拖拉控件请用 wxFormBuilder。
可以看wxWidgets wiki 入门教程。
1、最简单的窗口
#if defined(_WIN32) || defined(_WIN64)
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#define wxMSVC_VERSION_AUTO
#define WXUSINGDLL //动态链接
//#define __WXMSW__
//#define wxUSE_GUI 1
#endif
#include
#ifndef WX_PRECOMP
#include
#endif
class MainApp : public wxApp {
public:
virtual bool OnInit();
};
wxIMPLEMENT_APP(MainApp); //绑定程序入口
bool MainApp::OnInit() {
//wxWindow *parent, wxWindowID id, const wxString &title,
wxFrame *mframe = new wxFrame(NULL,wxID_ANY,L"最简单的窗口"); //这就是一个窗口
mframe->Show(true); //显示窗口
return true;
}
2、动态添加菜单
#if defined(_WIN32) || defined(_WIN64)
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
//#define __WXMSW__
#define wxMSVC_VERSION_AUTO
#define WXUSINGDLL //动态链接
//#define wxUSE_GUI 1
#endif
#include
#ifndef WX_PRECOMP
#include
#endif
class MainApp : public wxApp {
public:
virtual bool OnInit();
};
wxIMPLEMENT_APP(MainApp);
enum
{
ID_OPEN = wxID_HIGHEST + 1, //为避免与wxWidgets本身预定义的ID重复,可加wxID_HIGHEST
};
bool MainApp::OnInit() {
//wxWindow *parent, wxWindowID id, const wxString &title,
wxFrame *mframe = new wxFrame(NULL,wxID_ANY,L"最简单的窗口");
wxMenu *menuFile = new wxMenu; //菜单项
menuFile->Append(ID_OPEN, L"打开"); //添加菜单子项
wxMenuBar *menuBar = new wxMenuBar; //菜单栏
menuBar->Append(menuFile,L"文件"); //控件、菜单项字符
mframe->SetMenuBar(menuBar); //设置菜单栏到窗口
mframe->Show(true);
return true;
}
3、添加菜单处理
#if defined(_WIN32) || defined(_WIN64)
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
//#define __WXMSW__
#define wxMSVC_VERSION_AUTO
#define WXUSINGDLL //动态链接
//#define wxUSE_GUI 1
#endif
#include
#ifndef WX_PRECOMP
#include
#endif
class MainApp : public wxApp {
public:
virtual bool OnInit();
};
wxIMPLEMENT_APP(MainApp);
enum
{
ID_OPEN = wxID_HIGHEST + 1, //为避免与wxWidgets本身预定义的ID重复,可加wxID_HIGHEST
};
void menu_item_open(wxCommandEvent& event) {
wxLogMessage(L"菜单“打开”被点击");
}
bool MainApp::OnInit() {
//wxWindow *parent, wxWindowID id, const wxString &title,
wxFrame *mframe = new wxFrame(NULL,wxID_ANY,L"最简单的窗口");
wxMenu *menuFile = new wxMenu; //菜单项
menuFile->Append(ID_OPEN, L"打开"); //添加菜单子项
wxMenuBar *menuBar = new wxMenuBar; //菜单栏
menuBar->Append(menuFile,L"文件"); //控件、菜单项字符
mframe->SetMenuBar(menuBar); //设置菜单栏到窗口
// 绑定处理function : 事件类型 wxEVT_MENU 、function地址、id
mframe->Bind(wxEVT_MENU, menu_item_open, ID_OPEN);
mframe->Show(true);
return true;
}
4、添加文本控件
#if defined(_WIN32) || defined(_WIN64)
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
//#define __WXMSW__
#define wxMSVC_VERSION_AUTO
#define WXUSINGDLL //动态链接
//#define wxUSE_GUI 1
#endif
#include
#ifndef WX_PRECOMP
#include
#endif
class MainApp : public wxApp {
public:
virtual bool OnInit();
};
wxIMPLEMENT_APP(MainApp);
enum
{
ID_OPEN = wxID_HIGHEST + 1, //为避免与wxWidgets本身预定义的ID重复,可加wxID_HIGHEST
ID_TEXT,
};
void menu_item_open(wxCommandEvent& event) {
wxLogMessage(L"菜单“打开”被点击");
}
bool MainApp::OnInit() {
//wxWindow *parent, wxWindowID id, const wxString &title,
wxFrame *mframe = new wxFrame(NULL, wxID_ANY,L"最简单的窗口");
wxMenu *menuFile = new wxMenu; //菜单项
menuFile->Append(ID_OPEN, L"打开"); //添加菜单子项
wxMenuBar *menuBar = new wxMenuBar; //菜单栏
menuBar->Append(menuFile,L"文件"); //控件、菜单项字符
mframe->SetMenuBar(menuBar); //设置菜单栏到窗口
// 绑定处理function : 事件类型 wxEVT_MENU 、function地址、id
mframe->Bind(wxEVT_MENU, menu_item_open, ID_OPEN);
wxTextCtrl *ptextCtrl = new wxTextCtrl(mframe, ID_TEXT); //new 一个文本控件
/*多行文本控件
wxTextCtrl *ptextCtrl = new wxTextCtrl(mframe, ID_TEXT,wxT(""),wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
//wxT(""):初始文本
//wxDefaultPosition(默认坐标): 是控件坐标,也可以用wxPoint (int x, int y);
//wxDefaultSize(默认大小): 控件大小,wxSize (int width, int height)
//wxTE_MULTILINE:多行
*/
/*
https://wiki.wxwidgets.org/Adding_A_Control 上有句话
The call to Layout() is there because windows doesn't always send a size-event at the right moment for wxWidgets to catch in an OnSize handler (where it calls Layout() itself).
Layout()发送个size事件,添加个别控件时免得布局不正确。在这里注释了也一样。
*/
mframe->Layout();
mframe->Show(true);
return true;
}
官方教程,有个设置文本风格:
text->SetDefaultStyle(wxTextAttr(*wxRED));
text->AppendText("Red text\n");
text->SetDefaultStyle(wxTextAttr(wxNullColour, *wxLIGHT_GREY));
text->AppendText("Red on grey text\n");
text->SetDefaultStyle(wxTextAttr(*wxBLUE);
text->AppendText("Blue on grey text\n");
我尝试用来切换单行、多行,没反应。
5、添加一个按钮
代码重复太多,这里只贴出上面的代码修改部分,对照修改就可以。
enum
{
ID_OPEN= wxID_HIGHEST + 1,
ID_TEXT,
ID_BUT, //按钮ID
};
bool MainApp::OnInit() {
//wxWindow *parent, wxWindowID id, const wxString &title,
wxFrame *mframe = new wxFrame(NULL, wxID_ANY,L"最简单的窗口");
wxMenu *menuFile = new wxMenu; //菜单项
menuFile->Append(ID_OPEN, L"打开"); //添加菜单子项
wxMenuBar *menuBar = new wxMenuBar; //菜单栏
menuBar->Append(menuFile,L"文件"); //控件、菜单项字符
mframe->SetMenuBar(menuBar); //设置菜单栏到窗口
// 绑定处理function : 事件类型 wxEVT_MENU 、function地址、id
mframe->Bind(wxEVT_MENU, menu_item_open, ID_OPEN);
//多行文本
wxTextCtrl *ptextCtrl = new wxTextCtrl(mframe, ID_TEXT,wxT(""),wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
//添加按钮
wxButton *but = new wxButton(mframe, ID_BUT,wxT("BUT"), wxPoint(100,100));
mframe->Layout();
mframe->Show(true);
return true;
}
为按钮添加处理事件
mframe->Bind(wxEVT_BUTTON,处理函数(function), ID_BUT)
处理函数(function),例如:
void ButHandle(wxCommandEvent& event) {
//你想触发的代码
wxLogMessage(L"");
}
6、添加窗口布局wxBoxSizer
bool MainApp::OnInit() {
//wxWindow *parent, wxWindowID id, const wxString &title,
wxFrame *mframe = new wxFrame(NULL, wxID_ANY,L"最简单的窗口");
wxMenu *menuFile = new wxMenu; //菜单项
menuFile->Append(ID_OPEN, L"打开"); //添加菜单子项
wxMenuBar *menuBar = new wxMenuBar; //菜单栏
menuBar->Append(menuFile,L"文件"); //控件、菜单项字符
mframe->SetMenuBar(menuBar); //设置菜单栏到窗口
// 绑定处理function : 事件类型 wxEVT_MENU 、function地址、id
mframe->Bind(wxEVT_MENU, menu_item_open, ID_OPEN);
//多行文本
wxTextCtrl *ptextCtrl = new wxTextCtrl(mframe, ID_TEXT,wxT(""),wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
//添加按钮
wxButton *but = new wxButton(mframe, ID_BUT,wxT("BUT"));
//窗口布局wxBoxSizer
wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(ptextCtrl); //wxBoxSizer处理文本控件布局
sizer->Add(but); //wxBoxSizer处理按钮控件布局
sizer->SetSizeHints(mframe); //让wxFrame适配大小
mframe->SetSizer(sizer); //为wxFrame设置wxBoxSizer
mframe->Layout();
mframe->Show(true);
return true;
}
wxVERTICAL是布局方向。wxBoxSizer只是相当于给控件加上座位,按座位落座,sizer->Add是指定控件受wxBoxSizer布局管理,mframe->SetSizer(sizer)才正式生效。
至于SetSizeHints,我们看图:
由此可见,这是让wxFrame适配wxBoxSizer大小,否则虽然控件交由wxBoxSizer布局,但窗口大小没有跟随改变。