美文网首页wxWidgets
【wxWidgets】最简单的窗口

【wxWidgets】最简单的窗口

作者: Kernel32 | 来源:发表于2018-05-27 17:43 被阅读35次

    开发环境

    系统 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布局,但窗口大小没有跟随改变。

    相关文章

      网友评论

        本文标题:【wxWidgets】最简单的窗口

        本文链接:https://www.haomeiwen.com/subject/sbtijftx.html