本教程原文链接: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. 【DP_背包专题】 背包九讲

    这段时间看了<背包九讲>,在HUST VJUDGE上找到了一个题单,挑选了其中16道题集中做了下,选题全部是HDU上的题,大多是简单题.目前做了点小总结,大概提了下每道题的思路重点部分,希 ...

  2. c语言实现交换两个数的值

    C语言中要实现交换两个数的值,可以有很多种方法,具体如下所述. 不使用中间变量: // 异或, a^=b^=a^=b; a ^= b; b ^= a; a ^= b; // 加减 a = a + b; ...

  3. thinkPHP add、save无法添加、修改不起作用

    案例:数据库新添加一字段,修改值不成功.解决方案:将Runtime/Data/_fields/下面的字段缓存删除,或者直接删除整个Runtime文件也是可以的分析:由于Thinkphp,采用字段缓存机 ...

  4. 学一点 mysql 双机异地热备份----快速理解mysql主从,主主备份原理及实践

    双机热备的概念简单说一下,就是要保持两个数据库的状态 自动同步.对任何一个数据库的操作都自动应用到另外一个数据库,始终保持两个数据库数据一致. 这样做的好处多. 1. 可以做灾备,其中一个坏了可以切换 ...

  5. 【javascript 动态添加数据到 HTML 页面】

    今天简单的学习了一下有关对象字面量的定义和 javascript 如何取出对象字面量的值的知识,javascript 动态添加数据到 HTML 页面的问题. [学习目标]有如下的一组数据通过 Ajax ...

  6. sublime 编译程序出错控制台打印PATH的解决办法

    找到sublime的安装目录 搜索 exec.py 打开找到这几句话193行左右或者搜索关键词path if "PATH" in merged_env: self.debug_te ...

  7. Uva 1050 Ars Longa

    Description You have been struck with inspiration, and are designing a beautiful new art sculpture f ...

  8. java虚拟机运行机制

    转自java虚拟机运行机制 首先简单阐述下解释型语言和编译型语言的联系与区别. 编译型语言是通过编译器将程序编译成目标机器所能识别的机器码,而解释型语言不需要编译过程.由该语言的解释器读取脚本,按照语 ...

  9. CISCO的HTTP/HTTPS/SSH配置测试完成

    按实验一步一步,倒是很容易的,也理解罗~~ START-CONFIG粗配置文件如下: r1#show run Building configuration... Current configurati ...

  10. 【网络流24题】No.11(航空路线问题 最长不相交路径 最大费用流)

    [题意] 给定一张航空图, 图中顶点代表城市, 边代表 2 城市间的直通航线. 现要求找出一条满足下述限制条件的且途经城市最多的旅行路线.(1) 从最西端城市出发,单向从西向东途经若干城市到达最东端城 ...