開(kāi)發(fā)環(huán)境
系統(tǒng) | IDE | wxWidgets版本 |
---|---|---|
Win7 | VS2015 | 3.1.1 |
搭建請(qǐng)看 【配置】VS2015下wxWidgets 3.1.1開(kāi)發(fā)環(huán)境
逐步追加代碼讹躯,理解wxWidgets結(jié)構(gòu)。
想簡(jiǎn)單的拖拉控件請(qǐng)用 wxFormBuilder乌庶。
可以看wxWidgets wiki 入門(mén)教程果元。
1、最簡(jiǎn)單的窗口
#if defined(_WIN32) || defined(_WIN64)
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#define wxMSVC_VERSION_AUTO
#define WXUSINGDLL //動(dòng)態(tài)鏈接
//#define __WXMSW__
//#define wxUSE_GUI 1
#endif
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#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"最簡(jiǎn)單的窗口"); //這就是一個(gè)窗口
mframe->Show(true); //顯示窗口
return true;
}
2腾降、動(dòng)態(tài)添加菜單
#if defined(_WIN32) || defined(_WIN64)
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
//#define __WXMSW__
#define wxMSVC_VERSION_AUTO
#define WXUSINGDLL //動(dòng)態(tài)鏈接
//#define wxUSE_GUI 1
#endif
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
class MainApp : public wxApp {
public:
virtual bool OnInit();
};
wxIMPLEMENT_APP(MainApp);
enum
{
ID_OPEN = wxID_HIGHEST + 1, //為避免與wxWidgets本身預(yù)定義的ID重復(fù)拣度,可加wxID_HIGHEST
};
bool MainApp::OnInit() {
//wxWindow *parent, wxWindowID id, const wxString &title,
wxFrame *mframe = new wxFrame(NULL,wxID_ANY,L"最簡(jiǎn)單的窗口");
wxMenu *menuFile = new wxMenu; //菜單項(xiàng)
menuFile->Append(ID_OPEN, L"打開(kāi)"); //添加菜單子項(xiàng)
wxMenuBar *menuBar = new wxMenuBar; //菜單欄
menuBar->Append(menuFile,L"文件"); //控件、菜單項(xiàng)字符
mframe->SetMenuBar(menuBar); //設(shè)置菜單欄到窗口
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 //動(dòng)態(tài)鏈接
//#define wxUSE_GUI 1
#endif
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
class MainApp : public wxApp {
public:
virtual bool OnInit();
};
wxIMPLEMENT_APP(MainApp);
enum
{
ID_OPEN = wxID_HIGHEST + 1, //為避免與wxWidgets本身預(yù)定義的ID重復(fù)抗果,可加wxID_HIGHEST
};
void menu_item_open(wxCommandEvent& event) {
wxLogMessage(L"菜單“打開(kāi)”被點(diǎn)擊");
}
bool MainApp::OnInit() {
//wxWindow *parent, wxWindowID id, const wxString &title,
wxFrame *mframe = new wxFrame(NULL,wxID_ANY,L"最簡(jiǎn)單的窗口");
wxMenu *menuFile = new wxMenu; //菜單項(xiàng)
menuFile->Append(ID_OPEN, L"打開(kāi)"); //添加菜單子項(xiàng)
wxMenuBar *menuBar = new wxMenuBar; //菜單欄
menuBar->Append(menuFile,L"文件"); //控件、菜單項(xiàng)字符
mframe->SetMenuBar(menuBar); //設(shè)置菜單欄到窗口
// 綁定處理function : 事件類(lèi)型 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 //動(dòng)態(tài)鏈接
//#define wxUSE_GUI 1
#endif
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif
class MainApp : public wxApp {
public:
virtual bool OnInit();
};
wxIMPLEMENT_APP(MainApp);
enum
{
ID_OPEN = wxID_HIGHEST + 1, //為避免與wxWidgets本身預(yù)定義的ID重復(fù)蚁滋,可加wxID_HIGHEST
ID_TEXT,
};
void menu_item_open(wxCommandEvent& event) {
wxLogMessage(L"菜單“打開(kāi)”被點(diǎn)擊");
}
bool MainApp::OnInit() {
//wxWindow *parent, wxWindowID id, const wxString &title,
wxFrame *mframe = new wxFrame(NULL, wxID_ANY,L"最簡(jiǎn)單的窗口");
wxMenu *menuFile = new wxMenu; //菜單項(xiàng)
menuFile->Append(ID_OPEN, L"打開(kāi)"); //添加菜單子項(xiàng)
wxMenuBar *menuBar = new wxMenuBar; //菜單欄
menuBar->Append(menuFile,L"文件"); //控件、菜單項(xiàng)字符
mframe->SetMenuBar(menuBar); //設(shè)置菜單欄到窗口
// 綁定處理function : 事件類(lèi)型 wxEVT_MENU 赘淮、function地址辕录、id
mframe->Bind(wxEVT_MENU, menu_item_open, ID_OPEN);
wxTextCtrl *ptextCtrl = new wxTextCtrl(mframe, ID_TEXT); //new 一個(gè)文本控件
/*多行文本控件
wxTextCtrl *ptextCtrl = new wxTextCtrl(mframe, ID_TEXT,wxT(""),wxDefaultPosition,wxDefaultSize,wxTE_MULTILINE);
//wxT(""):初始文本
//wxDefaultPosition(默認(rèn)坐標(biāo)): 是控件坐標(biāo),也可以用wxPoint (int x, int y);
//wxDefaultSize(默認(rèn)大猩倚丁): 控件大小走诞,wxSize (int width, int height)
//wxTE_MULTILINE:多行
*/
/*
https://wiki.wxwidgets.org/Adding_A_Control 上有句話(huà)
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()發(fā)送個(gè)size事件,添加個(gè)別控件時(shí)免得布局不正確蛤高。在這里注釋了也一樣蚣旱。
*/
mframe->Layout();
mframe->Show(true);
return true;
}
官方教程,有個(gè)設(shè)置文本風(fēng)格:
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");
我嘗試用來(lái)切換單行戴陡、多行塞绿,沒(méi)反應(yīng)。
5恤批、添加一個(gè)按鈕
代碼重復(fù)太多异吻,這里只貼出上面的代碼修改部分,對(duì)照修改就可以。
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"最簡(jiǎn)單的窗口");
wxMenu *menuFile = new wxMenu; //菜單項(xiàng)
menuFile->Append(ID_OPEN, L"打開(kāi)"); //添加菜單子項(xiàng)
wxMenuBar *menuBar = new wxMenuBar; //菜單欄
menuBar->Append(menuFile,L"文件"); //控件诀浪、菜單項(xiàng)字符
mframe->SetMenuBar(menuBar); //設(shè)置菜單欄到窗口
// 綁定處理function : 事件類(lèi)型 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,處理函數(shù)(function), ID_BUT)
處理函數(shù)(function)雷猪,例如:
void ButHandle(wxCommandEvent& event) {
//你想觸發(fā)的代碼
wxLogMessage(L"");
}
6睛竣、添加窗口布局wxBoxSizer
bool MainApp::OnInit() {
//wxWindow *parent, wxWindowID id, const wxString &title,
wxFrame *mframe = new wxFrame(NULL, wxID_ANY,L"最簡(jiǎn)單的窗口");
wxMenu *menuFile = new wxMenu; //菜單項(xiàng)
menuFile->Append(ID_OPEN, L"打開(kāi)"); //添加菜單子項(xiàng)
wxMenuBar *menuBar = new wxMenuBar; //菜單欄
menuBar->Append(menuFile,L"文件"); //控件、菜單項(xiàng)字符
mframe->SetMenuBar(menuBar); //設(shè)置菜單欄到窗口
// 綁定處理function : 事件類(lèi)型 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設(shè)置wxBoxSizer
mframe->Layout();
mframe->Show(true);
return true;
}
wxVERTICAL是布局方向。wxBoxSizer只是相當(dāng)于給控件加上座位月帝,按座位落座躏惋,sizer->Add是指定控件受wxBoxSizer布局管理,mframe->SetSizer(sizer)才正式生效嚷辅。
至于SetSizeHints簿姨,我們看圖:
由此可見(jiàn),這是讓wxFrame適配wxBoxSizer大小簸搞,否則雖然控件交由wxBoxSizer布局扁位,但窗口大小沒(méi)有跟隨改變。