wxWidgets

【wxWidgets】最简单的窗口

2018-05-27  本文已影响35人  Kernel32

开发环境

系统 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 <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"最简单的窗口"); //这就是一个窗口
    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 <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本身预定义的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 <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本身预定义的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 <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本身预定义的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,我们看图:


设置SetSizeHints 没有设置SetSizeHints

由此可见,这是让wxFrame适配wxBoxSizer大小,否则虽然控件交由wxBoxSizer布局,但窗口大小没有跟随改变。

上一篇下一篇

猜你喜欢

热点阅读