还不快抢沙发

添加新评论

对话框窗口或者对话框是现代GUI应用程序重要的组成部分。一次对话被定义为两个或两个以上的人之间的谈话,在计算机中对话框是一个被用来和程序交流的窗口。对话框被用来输入数据、修改数据或者改变应用程序的设置。对话框是人和计算机之间交流的重要手段。 基本上有两种类型的对话框,预定义的对话框和自定义的对话框。 预定义的对话框是wxWidgets工具集中可用的一个对话框组件,这些对话框被用来完成一些基本任务,例如显示一段文本、接收输入、加载或者保存文件。它们大大节省了程序员的时间并且带有一些基本行为。 ### wxMessageDialog 消息对话框用来把信息显示给用户,它们是可以定制的,我们能够修改对话框上面的图标和按钮。 message.h ```cpp #include 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 ```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(); } ``` 在我们的例子中,我们创建了四个按钮,并把它们当在一个网格布局控件中,这四个按钮会显示四个不同的对话框窗口,我们通过指定不同的类型标识符来创建它们。 > wxMessageDialog * dial = new wxMessageDialog(NULL, _T("Error loading file"), _T("Error"), wxOK | wxICON_ERROR); dial->ShowModal(); 创建消息对话框是很简单的,我们通过把parent参数设为NULL把对话框放在桌面顶层,接下来两个参数指定了对话框显示的消息和它的标题。我们通过指定wxOK和wxICON_ERROR标识来显示一个OK按钮和一个错误图标,调用ShowModal()方法显示对话框。 ![](http://images.cnitblog.com/blog/535266/201312/09221509-e2f4ce192d3940cdbb8c2009a398dabc.jpg) ![](http://images.cnitblog.com/blog/535266/201312/09221512-48d5a93fbefa4bd9865e89d48768515e.jpg) ![](http://images.cnitblog.com/blog/535266/201312/09221514-b21c1fb7b078452184223ef079712a4f.jpg) ![](http://images.cnitblog.com/blog/535266/201312/09221516-a144238bc4ac47858b71ba5265b9183a.jpg) ### wxFileDialog 这是一个用来打开或者保存文件的常用对话框 openfile.h ```cpp #include class Openfile : public wxFrame { public: Openfile(const wxString & title); void OnOpen(wxCommandEvent & event); wxTextCtrl * tc; }; ``` openfile.cpp ```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); } } ``` 在我们的例子中,我们显示了一个打开文件的菜单选项和一个简单的多行文本控件。如果我们单击了打开文件的菜单选项,会显示一个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); > } 这里我们显示这个对话框,我们获得了一个选中的文件的路径名,并且把这个文件加载到文本控件中。 ![](http://images.cnitblog.com/blog/535266/201312/09221522-efb1203ee12543ecad817f05e0b2544f.jpg) ### wxFontDialog 这是一个普通的字体选择对话框。 fontdialog.h ```cpp #include class ChangeFont : public wxFrame { public: ChangeFont(const wxString & title); void OnOpen(wxCommandEvent & event); wxStaticText * st; enum{ID_FONTDIALOG}; }; ``` fontdialog.cpp ```cpp #include #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()); } } ``` 在这个例子中,我们通过一个设置字体对话框来改变一个静态文本控件的文字。 > 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()); } 在这几行代码中,我们显示了这个字体设置对话框,然后我们获得了选中的字体信息,最后我们用这个字体去改变我们早先创建的静态文本。 ![](http://images.cnitblog.com/blog/535266/201312/09221525-eb9b995831354b4cb6dedac69ccb28f0.jpg) ### 自定义的对话框 在接下来的这个例子中,我们创建了一个自定义的对话框,一款图像编辑器可以改变一张图片的色深,为了提供这个功能,我们应该定义一个适当的对话框。 customdialog.h ```cpp #include class CustomDialog : public wxDialog { public: CustomDialog(const wxString & title); }; ``` customdialog.cpp ```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(); } ``` 这个例子是一个基于对话框的程序,我们简单展示了如何制定一个自定义的对话框。 > 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()方法关闭并且清理这个对话框。 ![](http://images.cnitblog.com/blog/535266/201312/09221526-7ba1cb4811e5498aa1a12451dcfe876b.jpg) 这一部分的wxWidgets教程我们简单介绍了一下对话框的基本知识。