• [ZETCODE]wxWidgets教程七:对话框


    本教程原文链接:http://zetcode.com/gui/wxwidgets/dialogs/

    翻译:瓶哥

    日期:2013年12月9日星期一

    邮箱:414236069@qq.com

    主页:http://www.cnblogs.com/pingge/

    若有翻译错误或者歧义请联系我!

    对话框窗口或者对话框是现代GUI应用程序重要的组成部分。一次对话被定义为两个或两个以上的人之间的谈话,在计算机中对话框是一个被用来和程序交流的窗口。对话框被用来输入数据、修改数据或者改变应用程序的设置。对话框是人和计算机之间交流的重要手段。

    基本上有两种类型的对话框,预定义的对话框和自定义的对话框。

    预定义的对话框

    预定义的对话框是wxWidgets工具集中可用的一个对话框组件,这些对话框被用来完成一些基本任务,例如显示一段文本、接收输入、加载或者保存文件。它们大大节省了程序员的时间并且带有一些基本行为。

    消息对话框

    消息对话框用来把信息显示给用户,它们是可以定制的,我们能够修改对话框上面的图标和按钮。

    message.h

    #include <wx/wx.h>
    
    class Message : public wxFrame
    {
    public:
        Message(const wxString & title);
    
        void ShowMessage1(wxCommandEvent & event);
        void ShowMessage2(wxCommandEvent & event);
        void ShowMessage3(wxCommandEvent & event);
        void ShowMessage4(wxCommandEvent & event);
    
        enum{ID_INFO, ID_ERROR, ID_QUESTION, ID_ALERT};
    };
    View Code

    message.cpp

    #include "message.h"
    
    Message::Message(const wxString & title)
           : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(210, 110))
    {
        wxPanel * panel = new wxPanel(this, wxID_ANY);
    
        wxBoxSizer * hbox = new wxBoxSizer(wxHORIZONTAL);
        wxGridSizer * gs = new wxGridSizer(2, 2, 2, 2);
    
        wxButton * btn1 = new wxButton(panel, ID_INFO, _T("Info"));
        wxButton * btn2 = new wxButton(panel, ID_ERROR, _T("Error"));
        wxButton * btn3 = new wxButton(panel, ID_QUESTION, _T("Question"));
        wxButton * btn4 = new wxButton(panel, ID_ALERT, _T("Alert"));
    
        gs->Add(btn1, 1, wxEXPAND);
        gs->Add(btn2, 1);
        gs->Add(btn3, 1);
        gs->Add(btn4, 1);
    
        Connect(ID_INFO, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Message::ShowMessage1));
        Connect(ID_ERROR, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Message::ShowMessage2));
        Connect(ID_QUESTION, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Message::ShowMessage3));
        Connect(ID_ALERT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Message::ShowMessage4));
    
        hbox->Add(gs, 0, wxALL, 15);
        panel->SetSizer(hbox);
    
        Centre();
    }
    
    void Message::ShowMessage1(wxCommandEvent & event)
    {
        wxMessageDialog * dial = new wxMessageDialog(NULL, _T("Download completed"), _T("Info"), wxOK);
        dial->ShowModal();
    }
    void Message::ShowMessage2(wxCommandEvent & event)
    {
        wxMessageDialog * dial = new wxMessageDialog(NULL, _T("Error loading file"), _T("Error"), wxOK | wxICON_ERROR);
        dial->ShowModal();
    }
    void Message::ShowMessage3(wxCommandEvent & event)
    {
        wxMessageDialog * dial = new wxMessageDialog(NULL, _T("Are you sure to quit?"), _T("Question"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION);
        dial->ShowModal();
    }
    void Message::ShowMessage4(wxCommandEvent & event)
    {
        wxMessageDialog * dial = new wxMessageDialog(NULL, _T("Unallowed Operation"), _T("Exclamation"), wxOK | wxICON_EXCLAMATION);
        dial->ShowModal();
    }
    View Code

    main.h

    #include <wx/wx.h>
    
    class MyApp : public wxApp
    {
    public:
        virtual bool OnInit();
    };
    View Code

    main.cpp

    #include "main.h"
    #include "message.h"
    
    IMPLEMENT_APP(MyApp)
    
    bool MyApp::OnInit()
    {
        Message * msgs = new Message(_T("Message"));
        msgs->Show(true);
    
        return true;
    }
    View Code

    在我们的例子中,我们创建了四个按钮,并把它们当在一个网格布局控件中,这四个按钮会显示四个不同的对话框窗口,我们通过指定不同的类型标识符来创建它们。

    wxMessageDialog * dial = new wxMessageDialog(NULL, _T("Error loading file"), _T("Error"), wxOK | wxICON_ERROR);

    dial->ShowModal();

    创建消息对话框是很简单的,我们通过把parent参数设为NULL把对话框放在桌面顶层,接下来两个参数指定了对话框显示的消息和它的标题。我们通过指定wxOK和wxICON_ERROR标识来显示一个OK按钮和一个错误图标,调用ShowModal()方法显示对话框。

    wxFileDialog

    这是一个用来打开或者保存文件的常用对话框

    openfile.h

    #include <wx/wx.h>
    
    class Openfile : public wxFrame
    {
    public:
        Openfile(const wxString & title);
    
        void OnOpen(wxCommandEvent & event);
    
        wxTextCtrl * tc;
    };
    View Code

    openfile.cpp

    #include "openfile.h"
    
    Openfile::Openfile(const wxString & title)
            : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(300, 200))
    {
        wxMenuBar * menubar = new wxMenuBar;
        wxMenu * file = new wxMenu;
        file->Append(wxID_OPEN, _T("&Open"));
        menubar->Append(file, _T("&File"));
        SetMenuBar(menubar);
    
        Connect(wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED,
                wxCommandEventHandler(Openfile::OnOpen));
    
        tc = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
    
        Centre();
    }
    
    void Openfile::OnOpen(wxCommandEvent & event)
    {
        wxFileDialog * openFileDialog = new wxFileDialog(this);
    
        if(openFileDialog->ShowModal() == wxID_OK)
        {
            wxString fileName = openFileDialog->GetPath();
            tc->LoadFile(fileName);
        }
    }
    View Code

    main.h

    #include <wx/wx.h>
    
    class MyApp : public wxApp
    {
    public:
        virtual bool OnInit();
    };
    View Code

    main.cpp

    #include "main.h"
    #include "openfile.h"
    
    IMPLEMENT_APP(MyApp)
    
    bool MyApp::OnInit()
    {
        Openfile * open = new Openfile(_T("Openfile"));
        open->Show(true);
    
        return true;
    }
    View Code

    在我们的例子中,我们显示了一个打开文件的菜单选项和一个简单的多行文本控件。如果我们单击了打开文件的菜单选项,会显示一个wxFileDialog窗口,我们能够加载一些简单的文本文件到文本控件中。

    tc = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);

    我们把文本文件加载在wxTextCtrl中

    wxFileDialog * openFileDialog = new wxFileDialog(this);

    这里我们创建了一个wxFileDialog,我们使用了默认的参数。(这个打开文件的对话框是一个默认的对话框)

    if(openFileDialog->ShowModal() == wxID_OK)

    {

    wxString fileName = openFileDialog->GetPath();

    tc->LoadFile(fileName);

    }

    这里我们显示这个对话框,我们获得了一个选中的文件的路径名,并且把这个文件加载到文本控件中。

    wxFontDialog

    这是一个普通的字体选择对话框。

    fontdialog.h

    #include <wx/wx.h>
    
    class ChangeFont : public wxFrame
    {
    public:
        ChangeFont(const wxString & title);
    
        void OnOpen(wxCommandEvent & event);
    
        wxStaticText * st;
    
        enum{ID_FONTDIALOG};
    };
    View Code

    fontdialog.cpp

    #include <wx/fontdlg.h>
    #include "fontdialog.h"
    
    ChangeFont::ChangeFont(const wxString & title)
              : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(300, 200))
    {
        wxPanel * panel = new wxPanel(this, wxID_ANY);
    
        wxMenuBar * menubar = new wxMenuBar;
        wxMenu * file = new wxMenu;
        file->Append(ID_FONTDIALOG, _T("&Change Font"));
        menubar->Append(file, _T("&File"));
        SetMenuBar(menubar);
    
        Connect(ID_FONTDIALOG, wxEVT_COMMAND_MENU_SELECTED,
                wxCommandEventHandler(ChangeFont::OnOpen));
    
        st = new wxStaticText(panel, wxID_ANY, _T("PingGe"), wxPoint(20, 20));
    
        Centre();
    }
    
    void ChangeFont::OnOpen(wxCommandEvent & WXUNUSED(event))
    {
        wxFontDialog * fontDialog = new wxFontDialog(this);
    
        if(fontDialog->ShowModal() == wxID_OK)
        {
            st->SetFont(fontDialog->GetFontData().GetChosenFont());
        }
    }
    View Code

    main.h

    #include <wx/wx.h>
    
    class MyApp : public wxApp
    {
    public:
        virtual bool OnInit();
    };
    View Code

    main.cpp

    #include "main.h"
    #include "fontdialog.h"
    
    IMPLEMENT_APP(MyApp)
    
    bool MyApp::OnInit()
    {
        ChangeFont * change = new ChangeFont(_T("Change font"));
        change->Show(true);
    
        return true;
    }
    View Code

    在这个例子中,我们通过一个设置字体对话框来改变一个静态文本控件的文字。

    st = new wxStaticText(panel, wxID_ANY, _T("PingGe"), wxPoint(20, 20));

    这里我们在panel上面显示了一段静态文本,我们将通过wxFontDialog改变它的字体。

    wxFontDialog * fontDialog = new wxFontDialog(this);

    if(fontDialog->ShowModal() == wxID_OK)

    {

    st->SetFont(fontDialog->GetFontData().GetChosenFont());

    }

    在这几行代码中,我们显示了这个字体设置对话框,然后我们获得了选中的字体信息,最后我们用这个字体去改变我们早先创建的静态文本。、

    一个自定义的对话框

    在接下来的这个例子中,我们创建了一个自定义的对话框,一款图像编辑器可以改变一张图片的色深,为了提供这个功能,我们应该定义一个适当的对话框。

    customdialog.h

    #include <wx/wx.h>
    
    class CustomDialog : public wxDialog
    {
    public:
        CustomDialog(const wxString & title);
    };
    View Code

    customdialog.cpp

    #include "customdialog.h"
    
    CustomDialog::CustomDialog(const wxString & title)
                : wxDialog(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(250, 230))
    {
        wxPanel * panel = new wxPanel(this, wxID_ANY);
    
        wxBoxSizer * vbox = new wxBoxSizer(wxVERTICAL);
        wxBoxSizer * hbox = new wxBoxSizer(wxHORIZONTAL);
    
        wxStaticBox   * st  = new wxStaticBox(panel,   wxID_ANY, _T("Colors"), wxPoint(5, 5), wxSize(240, 150));
        wxRadioButton * rb1 = new wxRadioButton(panel, wxID_ANY, _T("16 Colors"), wxPoint(15, 55));
        wxRadioButton * rb2 = new wxRadioButton(panel, wxID_ANY, _T("2 Colors"), wxPoint(15, 80));
        wxRadioButton * rb3 = new wxRadioButton(panel, wxID_ANY, _T("Custom"), wxPoint(15, 105));
        wxTextCtrl    * tc  = new wxTextCtrl(panel, wxID_ANY, _T(""), wxPoint(95, 105));
    
        wxButton * okButton    = new wxButton(this, wxID_ANY, _T("OK"), wxDefaultPosition, wxSize(70, 30));
        wxButton * closeButton = new wxButton(this, wxID_ANY, _T("Close"), wxDefaultPosition, wxSize(70, 30));
    
        hbox->Add(okButton, 1);
        hbox->Add(closeButton, 1, wxLEFT, 5);
    
        vbox->Add(panel, 1);
        vbox->Add(hbox, 0, wxALIGN_CENTRE | wxTOP | wxBOTTOM, 10);
    
        SetSizer(vbox);
    
        Centre();
        ShowModal();
    
        Destroy();
    }
    View Code

    main.h

    #include <wx/wx.h>
    
    class MyApp : public wxApp
    {
    public:
        virtual bool OnInit();
    };
    View Code

    main.cpp

    #include "main.h"
    #include "customdialog.h"
    
    IMPLEMENT_APP(MyApp)
    
    bool MyApp::OnInit()
    {
        CustomDialog * custom = new CustomDialog(_T("CustomDialog"));
    
        custom->Show(true);
    
        return true;
    }
    View Code

    这个例子是一个基于对话框的程序,我们简单展示了如何制定一个自定义的对话框。

    class CustomDialog : public wxDialog

    一个基于wxDialog的自定义对话框。

    wxStaticBox * st = new wxStaticBox(panel, wxID_ANY, _T("Colors"), wxPoint(5, 5), wxSize(240, 150));

    wxRadioButton * rb1 = new wxRadioButton(panel, wxID_ANY, _T("16 Colors"), wxPoint(15, 55));

    注意:wxStaticBox这个组件必须在它所包含的组件之前定义,而且这些组件相互之间不能是父子关系,只能是兄弟关系。

    ShowModal();

    Destroy();

    我们调用ShowModal()方法显示这个对话框,Destroy()方法关闭并且清理这个对话框。

    这一部分的wxWidgets教程我们简单介绍了一下对话框的基本知识。

  • 相关阅读:
    二维树状数组的区间加减及查询 tyvj 1716 上帝造题的七分钟
    hdu5399
    WebLogicSSL解决苹果IOS itms下载问题
    怎样封装RESTful Web Service
    ie8下面版本号(包含ie8)的浏览器不支持html5标签属性解决方式(Modernizr 2.6.2插件的使用)
    在Linux平台使用VNC连接树莓派
    合作开发——设计阶段
    HDU-1165-Eddy&#39;s research II
    Iocomp控件教程之LinearGauge--线性刻度尺控件
    VB中的排序问题 15个
  • 原文地址:https://www.cnblogs.com/pingge/p/3466263.html
Copyright © 2020-2023  润新知