本教程原文链接: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};
};

message.cpp

#include "message.h"

Message::Message(const wxString & title)
: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
{
wxPanel * panel = new wxPanel(this, wxID_ANY); wxBoxSizer * hbox = new wxBoxSizer(wxHORIZONTAL);
wxGridSizer * gs = new wxGridSizer(, , , ); 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, , wxEXPAND);
gs->Add(btn2, );
gs->Add(btn3, );
gs->Add(btn4, ); 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, , wxALL, );
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();
}

main.h

#include <wx/wx.h>

class MyApp : public wxApp
{
public:
virtual bool OnInit();
};

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;
}

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

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;
};

openfile.cpp

#include "openfile.h"

Openfile::Openfile(const wxString & title)
: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
{
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);
}
}

main.h

#include <wx/wx.h>

class MyApp : public wxApp
{
public:
virtual bool OnInit();
};

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;
}

在我们的例子中,我们显示了一个打开文件的菜单选项和一个简单的多行文本控件。如果我们单击了打开文件的菜单选项,会显示一个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};
};

fontdialog.cpp

#include <wx/fontdlg.h>
#include "fontdialog.h" ChangeFont::ChangeFont(const wxString & title)
: wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
{
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(, )); Centre();
} void ChangeFont::OnOpen(wxCommandEvent & WXUNUSED(event))
{
wxFontDialog * fontDialog = new wxFontDialog(this); if(fontDialog->ShowModal() == wxID_OK)
{
st->SetFont(fontDialog->GetFontData().GetChosenFont());
}
}

main.h

#include <wx/wx.h>

class MyApp : public wxApp
{
public:
virtual bool OnInit();
};

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;
}

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

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);
};

customdialog.cpp

#include "customdialog.h"

CustomDialog::CustomDialog(const wxString & title)
: wxDialog(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
{
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(, ), wxSize(, ));
wxRadioButton * rb1 = new wxRadioButton(panel, wxID_ANY, _T("16 Colors"), wxPoint(, ));
wxRadioButton * rb2 = new wxRadioButton(panel, wxID_ANY, _T("2 Colors"), wxPoint(, ));
wxRadioButton * rb3 = new wxRadioButton(panel, wxID_ANY, _T("Custom"), wxPoint(, ));
wxTextCtrl * tc = new wxTextCtrl(panel, wxID_ANY, _T(""), wxPoint(, )); wxButton * okButton = new wxButton(this, wxID_ANY, _T("OK"), wxDefaultPosition, wxSize(, ));
wxButton * closeButton = new wxButton(this, wxID_ANY, _T("Close"), wxDefaultPosition, wxSize(, )); hbox->Add(okButton, );
hbox->Add(closeButton, , wxLEFT, ); vbox->Add(panel, );
vbox->Add(hbox, , wxALIGN_CENTRE | wxTOP | wxBOTTOM, ); SetSizer(vbox); Centre();
ShowModal(); Destroy();
}

main.h

#include <wx/wx.h>

class MyApp : public wxApp
{
public:
virtual bool OnInit();
};

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;
}

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

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教程我们简单介绍了一下对话框的基本知识。

[ZETCODE]wxWidgets教程七:对话框的更多相关文章

  1. [ZETCODE]wxWidgets教程六:事件处理

    本教程原文链接:http://zetcode.com/gui/wxwidgets/events/ 翻译:瓶哥 日期:2013年12月7号星期六 邮箱:414236069@qq.com 主页:http: ...

  2. [ZETCODE]wxWidgets教程五:布局管理

    本教程原文链接:http://zetcode.com/gui/wxwidgets/layoutmanagement/ 翻译:瓶哥 日期:2013年12月4日星期三 邮箱:414236069@qq.co ...

  3. [ZETCODE]wxWidgets教程八:组件专题1

    本教程原文链接:http://zetcode.com/gui/wxwidgets/widgets/ 翻译:瓶哥 日期:2013年12月12日星期四 邮箱:414236069@qq.com 主页:htt ...

  4. [ZETCODE]wxWidgets教程四:菜单栏和工具栏

    本教程原文链接:http://zetcode.com/gui/wxwidgets/menustoolbars/ 翻译:瓶哥 日期:2013年11月28日星期四 邮箱:414236069@qq.com ...

  5. [ZETCODE]wxWidgets教程三:第一个窗体程序

    本教程原文链接:http://zetcode.com/gui/wxwidgets/firstprograms/ 翻译:瓶哥 日期:2013年11月27日星期三 邮箱:414236069@qq.com ...

  6. [ZETCODE]wxWidgets教程九:组件专题2

    本教程原文链接:http://zetcode.com/gui/wxwidgets/widgetsII/ 翻译:瓶哥 日期:2013年12月15日星期日 邮箱:414236069@qq.com 主页:h ...

  7. [ZETCODE]wxWidgets教程二:辅助类

    本教程原文链接:http://zetcode.com/gui/wxwidgets/helperclasses/ 翻译:瓶哥 日期:2013年11月27日星期三 邮箱:414236069@qq.com ...

  8. [ZETCODE]wxWidgets教程一:介紹

    本教程原文链接:http://zetcode.com/gui/wxwidgets/introduction/ 翻译:瓶哥 日期:2013年11月26日星期二 邮箱: 414236069@qq.com ...

  9. 【转】PyQt5系列教程(七)控件

    PyQt5系列教程(七)控件   软硬件环境 Windows 10 Python 3.4.2 PyQt 5.5.1 PyCharm 5.0.4 前言 控件是PyQt应用程序的基石.PyQt5自带很多不 ...

随机推荐

  1. HTML知识点纲要(1)

    什么是 HTML?HTML,全称是Hyper Text Markup Language,即超文本标记语言.是用来描述网页的一种标记语言. HTML 标签HTML标签是由尖括号包围的关键词,通常成对出现 ...

  2. Make Ubuntu 14.04 Fullscreen and virtualbox

    sudo apt-get remove libcheese-gtk23 sudo apt-get install xserver-xorg-core sudo apt-get install virt ...

  3. jquery的return this.each()的作用

    经常看到在运用jquery插件绑定事件时候,都会用到each. 下面来比较下使用return this和return this.each()在使用的区别. 注意:使用each的时候引用this,必须使 ...

  4. linux mysql字符编码问题

    发布:thatboy   来源:脚本学堂     [大 中 小] 本文介绍下,linux环境中mysql字符编码问题的解决办法,有遇到mysql编码问题的朋友,可以参考下本文的介绍,希望对你有一定的帮 ...

  5. 双积分式(A/D)转换器电路结构及工作原理

    1.转换方式 V-T型间接转换ADC. 2.  电路结构 图1是这种转换器的原理电路,它由积分器(由集成运放A组成).过零比较器(C).时钟脉冲控制门(G)和计数器(ff0-ffn)等几部分组成 图1 ...

  6. 在Eclipse中搭建C/C++环境

    在Eclipse中搭建C/C++环境 本文地址:http://blog.csdn.net/you_and_me12/article/details/7389934 习惯了使用eclipse编程后,现在 ...

  7. 启动python解释器的命令(python manage.py shell和python的区别)

    如果你曾经使用过Python,你一定好奇,为什么我们运行python manage.py shell而不是python.这两个命令都会启动交互解释器,但是manage.py shell命令有一个重要的 ...

  8. bzoj 1138: [POI2009]Baj 最短回文路 dp优化

    1138: [POI2009]Baj 最短回文路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 161  Solved: 48[Submit][Sta ...

  9. 在MVC或WEBAPI中记录每个Action的执行时间和记录下层方法调用时间

    刚才在博客园看了篇文章,http://www.cnblogs.com/cmt/p/csharp_regex_timeout.html  突然联想到以前遇到的问题,w3wp进程吃光CPU都挂起IIS进程 ...

  10. Mozilla研究—深入理解mozilla所需的背景知识

    mozilla是一个以浏览器为中心的软件平台,它在我们平台中占有重要地位.我们用它来实现WEB浏览器.WAP浏览器.邮件系统.电子书和帮助阅读器等应用程序.为此,我最近花了不少时间去阅读mozilla ...