[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教程我們簡單介紹了一下對話框的基本知識。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM