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

翻译:瓶哥

日期:2013年11月27日星期三

邮箱:414236069@qq.com

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

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

在这一章,我们将会概括介绍如何创建wxWidgets程序。我们将会创建第一个简单的例子,展示如何显示一个图标。接下来我们将会用一个简单的例子说明如何响应事件。最后,我们将会看到这些小部件是如何与wxWidgets程序进行交互的。

一个简单的程序

首先我们创建一个非常简单的wxWidgets程序。

simple.h

  1. #include <wx/wx.h>
  2.  
  3. class Simple : public wxFrame
  4. {
  5. public:
  6. Simple(const wxString & title);
  7. };

simple.cpp

  1. #include "simple.h"
  2.  
  3. Simple::Simple(const wxString & title)
  4. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
  5. {
  6. Centre();
  7. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "simple.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. Simple * simple = new Simple(_T("Simple"));
  9. simple->Show(true);
  10.  
  11. return true;
  12. }

这个小例子在屏幕上显示了一个小窗口,并且这个窗口是居中显示的。

Centre();

这个方法使这个窗口居中显示在屏幕上(水平和垂直)。

IMPLEMENT_APP(MyApp)

The code thar implements the application is hidden behind the macro.这是一段代码的复制粘贴,我们通常不用去关心。

应用程序图标

在这个例子中,我们给我们的程序提供一个图标,这是一个在窗口的左上角显示一个小图标的标准方法。这个图标是作为一个xpm格式文件被包含进这个程序。

icon.h

  1. #include <wx/wx.h>
  2.  
  3. class Icon : public wxFrame
  4. {
  5. public:
  6. Icon(const wxString & title);
  7. };

icon.cpp

  1. #include "icon.h"
  2. #include "icon.xpm"
  3.  
  4. Icon::Icon(const wxString & title)
  5. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
  6. {
  7. SetIcon(wxIcon(icon_xpm));
  8. Centre();
  9. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "icon.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. Icon * icon = new Icon(_T("Icon"));
  9. icon->Show(true);
  10.  
  11. return true;
  12. }

icon.xpm

  1. /* XPM */
  2. static const char * icon_xpm[] = {
  3. /* columns rows colors chars-per-pixel */
  4. "32 32 6 1",
  5. " c black",
  6. ". c navy",
  7. "X c red",
  8. "o c yellow",
  9. "O c gray100",
  10. "+ c None",
  11. /* pixels */
  12. "++++++++++++++++++++++++++++++++",
  13. "++++++++++++++++++++++++++++++++",
  14. "++++++++++++++++++++++++++++++++",
  15. "++++++++++++++++++++++++++++++++",
  16. "++++++++++++++++++++++++++++++++",
  17. "++++++++ ++++++++++",
  18. "++++++++ ............ ++++++++++",
  19. "++++++++ ............ ++++++++++",
  20. "++++++++ .OO......... ++++++++++",
  21. "++++++++ .OO......... ++++++++++",
  22. "++++++++ .OO......... ++++++++++",
  23. "++++++++ .OO...... ",
  24. "++++++++ .OO...... oooooooooooo ",
  25. " .OO...... oooooooooooo ",
  26. " XXXXXXX .OO...... oOOooooooooo ",
  27. " XXXXXXX .OO...... oOOooooooooo ",
  28. " XOOXXXX ......... oOOooooooooo ",
  29. " XOOXXXX ......... oOOooooooooo ",
  30. " XOOXXXX oOOooooooooo ",
  31. " XOOXXXXXXXXX ++++ oOOooooooooo ",
  32. " XOOXXXXXXXXX ++++ oOOooooooooo ",
  33. " XOOXXXXXXXXX ++++ oOOooooooooo ",
  34. " XOOXXXXXXXXX ++++ oooooooooooo ",
  35. " XOOXXXXXXXXX ++++ oooooooooooo ",
  36. " XXXXXXXXXXXX ++++ ",
  37. " XXXXXXXXXXXX ++++++++++++++++++",
  38. " ++++++++++++++++++",
  39. "++++++++++++++++++++++++++++++++",
  40. "++++++++++++++++++++++++++++++++",
  41. "++++++++++++++++++++++++++++++++",
  42. "++++++++++++++++++++++++++++++++",
  43. "++++++++++++++++++++++++++++++++"
  44. };

在我们的程序中我们显示了一个小的wxWidgetsLogo图标。

SetIcon(wxIcon(icon_xpm));

显示图标是上面这行代码的做的工作。XPM(X PixMap)是一种以ASCII码表现的图像格式。

一个简单的按钮

在接下来的这个例子中,我们在框架上创建了一个按钮。我们将会看到,如何建立一个简单的事件处理程序。

button.h

  1. #include <wx/wx.h>
  2.  
  3. class Button : public wxFrame
  4. {
  5. public:
  6. Button(const wxString & title);
  7.  
  8. void OnQuit(wxCommandEvent & event);
  9. };

button.cpp

  1. #include "button.h"
  2.  
  3. Button::Button(const wxString & title)
  4. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
  5. {
  6. wxPanel * panel = new wxPanel(this, wxID_ANY);
  7.  
  8. wxButton * button = new wxButton(panel, wxID_EXIT, _T("Quit"), wxPoint(, ));
  9.  
  10. Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Button::OnQuit));
  11.  
  12. button->SetFocus(); // This sets the window to receive keyboard input
  13.  
  14. Centre();
  15. }
  16.  
  17. void Button::OnQuit(wxCommandEvent & WXUNUSED(event))
  18. {
  19. Close(true);
  20. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "button.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. Button * button = new Button(_T("Button"));
  9. button->Show(true);
  10.  
  11. return true;
  12. }

wxPanel * panel = new wxPanel(this, wxID_ANY);

首先我们创建一个wxPanel组件,这将被放置到一个wxFrame组件中。

wxButton * button = new wxButton(panel, wxID_EXIT, _T("Quit"), wxPoint(20, 20));

我们建立了一个wxButton组件,它被放置在panel上,我们使用wxWidgets预定义的id:wxID_EXIT绑定这个按钮,按钮上面的标签文字是"Quit",按钮被放置的坐标为(20, 20),坐标系的起点是左上角。

Connect(wxID_EXIT, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(Button::OnQuit));

如果我们点击这个按钮,一个wxEVT_COMMAND_BUTTON_CLICKED事件就会被触发,我们把这个事件和OnQuit()方法捆绑在一起,所以当我们点击按钮时,OnQuit()方法就会被调用。

Button->SetFocus();

我们把键盘的焦点设置到这个按钮上,所以如果我们按下回车键就相当于按钮被按下了。

Close(true);

在OnQuit()方法中,我们调用了Close()方法,这将会终结我们的应用程序。

组件之间的通信

知道各个组件之间如何互相通信很重要,请看下面这个例子。

panels.h

  1. #include <wx/wx.h>
  2. #include <wx/panel.h>
  3.  
  4. class LeftPanel : public wxPanel
  5. {
  6. public:
  7. LeftPanel(wxPanel * parent);
  8.  
  9. void OnPlus(wxCommandEvent & event);
  10. void OnMinus(wxCommandEvent & event);
  11.  
  12. wxButton * m_plus;
  13. wxButton * m_minus;
  14. wxPanel * m_parent;
  15. int count;
  16. };
  17.  
  18. class RightPanel : public wxPanel
  19. {
  20. public:
  21. RightPanel(wxPanel * parent);
  22.  
  23. void OnSetText(wxCommandEvent & event);
  24.  
  25. wxStaticText * m_text;
  26. };
  27.  
  28. const int ID_PLUS = ;
  29. const int ID_MINUS = ;

panels.cpp

  1. #include <wx/stattext.h>
  2. #include "communicate.h"
  3.  
  4. LeftPanel::LeftPanel(wxPanel * parent)
  5. : wxPanel(parent, wxID_ANY, wxPoint(-, -), wxSize(-, -), wxBORDER_SUNKEN)
  6. {
  7. count = ;
  8. m_parent = parent;
  9. m_plus = new wxButton(this, ID_PLUS, _T("+"), wxPoint(, ));
  10.  
  11. m_minus = new wxButton(this, ID_MINUS, _T("-"), wxPoint(, ));
  12.  
  13. Connect(ID_PLUS, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(LeftPanel::OnPlus));
  14.  
  15. Connect(ID_MINUS, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(LeftPanel::OnMinus));
  16. }
  17.  
  18. void LeftPanel::OnPlus(wxCommandEvent & WXUNUSED(event))
  19. {
  20. count++;
  21.  
  22. Communicate * comm = (Communicate *)(m_parent->GetParent());
  23.  
  24. comm->m_rp->m_text->SetLabel(wxString::Format(_T("%d"), count));
  25. }
  26.  
  27. void LeftPanel::OnMinus(wxCommandEvent & WXUNUSED(event))
  28. {
  29. count--;
  30.  
  31. Communicate * comm = (Communicate *)(m_parent->GetParent());
  32.  
  33. comm->m_rp->m_text->SetLabel(wxString::Format(_T("%d"), count));
  34. }
  35.  
  36. RightPanel::RightPanel(wxPanel * parent)
  37. : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(, ), wxBORDER_SUNKEN)
  38. {
  39. m_text = new wxStaticText(this, -, _T(""), wxPoint(, ));
  40. }

communicate.h

  1. #include "panels.h"
  2. #include <wx/wxprec.h>
  3.  
  4. class Communicate : public wxFrame
  5. {
  6. public:
  7. Communicate(const wxString & title);
  8.  
  9. LeftPanel * m_lp;
  10. RightPanel * m_rp;
  11. wxPanel * m_parent;
  12. };

communicate.cpp

  1. #include "communicate.h"
  2.  
  3. Communicate::Communicate(const wxString & title)
  4. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
  5. {
  6. m_parent = new wxPanel(this, wxID_ANY);
  7.  
  8. wxBoxSizer * hbox = new wxBoxSizer(wxHORIZONTAL);
  9.  
  10. m_lp = new LeftPanel(m_parent);
  11. m_rp = new RightPanel(m_parent);
  12.  
  13. hbox->Add(m_lp, , wxEXPAND | wxALL, );
  14. hbox->Add(m_rp, , wxEXPAND | wxALL, );
  15.  
  16. m_parent->SetSizer(hbox);
  17.  
  18. this->Centre();
  19. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "communicate.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. Communicate * communicate = new Communicate(_T("Communicate"));
  9. communicate->Show(true);
  10.  
  11. return true;
  12. }

在我们的例子中,我们有两个panel,一个左边一个右边,左边的有两个按钮,右边的有一个静态文本控件。按钮改变显示在右panel中的数字。问题是,我们是如何获得静态文本控件的指针的?

m_parent = parent;

在LeftPanel里我们存储了父组件的地址,这是一个wxPanel组件。

Communicate * comm = (Communicate *)m_parent->GetParent();

Comm->m_rp->m_text->SetLabel(wxString::Format(_T("%d"), count));

这两行是这个例子中最重要的两行,它展示了如何操纵那个放在右panel中的静态文本控件。首先我们取得了左panel和右panel的父窗口指针,这个父窗口组件有一个指向右panel的指针,并且右panel有一个指向静态文本控件的指针。

在这部分的wxWidgets教程中,我们创建了一些简单的程序。

[ZETCODE]wxWidgets教程三:第一个窗体程序的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. [ZETCODE]wxWidgets教程七:对话框

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

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

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

  8. 微信小程序开发系列教程三:微信小程序的调试方法

    微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 这个教程的前两篇文章,介绍了如何用下图所示的微信开发者工具自动生成一个Hel ...

  9. PyQt5系列教程(三)用py2exe进行程序打包

    软硬件环境 Windows 10 Python 3.4.2 PyQt5 Py2exe 前言 在我们开发了完整的PyQt5项目后,一般都会将其打包成exe文件,方便其他人使用.今天我们就用Py2exe这 ...

随机推荐

  1. SSH中调用另一action的方法(chain,redirect)

      从一个Action直接跳到另一个Action中,Struts提供了两种结果类型可以实现:chain.redirect.        从Servlet中学到重定向是不能保留参数的,也就是说重定向了 ...

  2. 【ADO.NET】6、SQLHelper简单封装

    using System.Data.SqlClient;using System.Configuration;引用:System.Configuration 连接字符串放到配置文件中 新建一个类,写如 ...

  3. C# DES

    using System; //这个是使用DES的基础 using System.Security.Cryptography; //这个是处理文字编码的前提 using System.Text; // ...

  4. svn-代码回滚

    第一种:# svn revert [-R] something 第二种: 1. svn update,svn log,找到最新版本(latest revision)    2. 找到自己想要回滚的版本 ...

  5. TDirectory.Move移动或更名目录

    使用函数: System.IOUtils.TDirectory.Move 定义: class procedure Move(const SourceDirName, DestDirName: stri ...

  6. SQL 多条件查询

    网上有不少人提出过类似的问题:“看到有人写了WHERE 1=1这样的SQL,到底是什么意思?”.其实使用这种用法的开发人员一般都是在使用动态组装的SQL.让我们想像如下的场景:用户要求提供一个灵活的查 ...

  7. IT全称

    1.jar,war,ear(摘自:http://blog.sina.com.cn/s/blog_54bb7b950100wnbb.html) Jar文件(扩展名为. Jar)包含Java类的普通库.资 ...

  8. ORA-01033 ORA-01109 ORA-01034 ORA-12514 ORA-24324 ORA-01041 ORA-01157 ORA-01110

    客户数据库挂掉了 在plsql客户端使用普通账号登录时提示如下错误 因为好久没弄数据库了,慌了一小下. 接下来搜索过往的知识,回忆.在cli下输入了以下命令 sqlplus system/system ...

  9. 3G? 2G? 2.5G? 4G? 与 WIFI, GPRS,CDMA 3G无线上网

    首先说说无线上网有哪几种形式? WIFI, GPRS, CDMA 3G无线上网 1>wifi全称wireless fidelity,是当今使用最广的一种无线网络传输技术.实际上就是把有线网络信号 ...

  10. 使用 Cloud Insight SDK 监控北京空气质量!

    现在越来越多的 App 都开始有广告了.特别是空气质量监测,和天气类的 App,广告还是蛮多的,眼花缭乱,真是够了. 最近刚好在用一款系统监控工具 Cloud Insight,它提供的 SDK 可以把 ...