简单的文本编辑器 - wxWindows编程事例

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

        上一次简单介绍了一下wxWindows,那么今天就写个简单的程序,来体验一下wxWindows强大的功能。下面我们来创建一个简单的文本编辑器。你看了后会发现用wxWindows编写程序原来是这么的简单。废话少说,开始创建简单文本编辑器。

        创建自己的MainFrame

// 文件: MainFrm.h

#ifndef _MainFrm_H

#define _MainFrm_H

 

//通过继承wxFrame来创建你自己的Frame,这样你就可以向你自己的frame类中添加各种各样的功能

class MainFrm : public wxFrame

{

public:

 

    //构造函数. 用来创建新的MainFrm

 

       MainFrm(const wxChar *title, int xpos, int ypos, int width, int height);

 

    // 析构函数

 

       ~MainFrm();

 

       //处理菜单事件

      

    // Processes menu File|Open

       void OnMenuFileOpen(wxCommandEvent &event);

 

    // Processes menu File|Save

       void OnMenuFileSave(wxCommandEvent &event);

 

    // Processes menu File|Quit

       void OnMenuFileQuit(wxCommandEvent &event);

 

    // Processes menu About|Info

       void OnMenuInfoAbout(wxCommandEvent &event);

 

protected:

       //申明菜单处理事件表

       DECLARE_EVENT_TABLE();      

      

private:

       wxTextCtrl *m_pTextCtrl;

       wxMenuBar *m_pMenuBar;

       wxMenu *m_pFileMenu;

       wxMenu *m_pInfoMenu;

       enum

       {

              MENU_FILE_OPEN,

              MENU_FILE_SAVE,

              MENU_FILE_QUIT,

              MENU_INFO_ABOUT

       };   

};

#endif //_MainFrm_H

// 文件: MainFrm.cpp

// 对支持预编译编译器要包含"wx/wx.h"

#include "wx/wxprec.h"

#ifndef WX_PRECOMP

#include "wx/wx.h"

#endif

 

#include "MainFrm.h"

 

#include "wx/filedlg.h"

 

MainFrm::MainFrm(const wxChar *title, int xpos, int ypos, int width, int height)

: wxFrame((wxFrame *) NULL, -1, title, wxPoint(xpos, ypos), wxSize(width, height))

/*

构造函数:

       wxFrame(wxWindow* parent,

       wxWindowId id,

       const wxString& title,

       const wxPoint& pos= wxDefaultPosition,

       const wxSize& size= wxDefaultSize,

       long style= wxDEFAULT_FRAME_STYLE,

       const wxString& name= "frame");

 

       parent: 是一个指向父窗口的指针,当框架没有父窗口时使用NULL

 

       id:     是唯一的窗口标识号,当你不需要它时使用-1.

      

       title:  是框架的标题,它将显示在框架的标题栏中。

        

       pos:    是框架的位置。WxDefaultPosition表示默认值。

             

       size:   是框架的大小。WxDefaultSize表示使用默认值。

               

       style:  是框架的风格。         

*/

{

       // 添加wxTexrCtrl控件来处理文本

       m_pTextCtrl = new wxTextCtrl(this, -1, wxString("Type your text..."),

              wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);

      

       //添加菜单栏

       m_pMenuBar = new wxMenuBar();

      // 添加 File Menu

      m_pFileMenu = new wxMenu();   

      m_pFileMenu->Append(MENU_FILE_OPEN, "打开(&O)","打开一个存在的文件");

      m_pFileMenu->Append(MENU_FILE_SAVE, "保存(&S)","保存一个文件");

      m_pFileMenu->AppendSeparator();

      m_pFileMenu->Append(MENU_FILE_QUIT, "退出(&Q)","退出程序");   

      m_pMenuBar->Append(m_pFileMenu, "文件(&F)");

      // 添加 About menu

      m_pInfoMenu = new wxMenu();

      m_pInfoMenu->Append(MENU_INFO_ABOUT, "关于 wxFrameTest","显示程序相关信息");

      m_pMenuBar->Append(m_pInfoMenu, "关于(&A)");

     SetMenuBar(m_pMenuBar);

      

       //添加状态栏

       CreateStatusBar(1);

       SetStatusText("Ready", 0);

}

 

MainFrm::~MainFrm()

{

}

 

//处理菜单事件

BEGIN_EVENT_TABLE(MainFrm, wxFrame)

EVT_MENU(MENU_FILE_OPEN, MainFrm::OnMenuFileOpen)

EVT_MENU(MENU_FILE_SAVE, MainFrm::OnMenuFileSave)

EVT_MENU(MENU_FILE_QUIT, MainFrm::OnMenuFileQuit)

EVT_MENU(MENU_INFO_ABOUT, MainFrm::OnMenuInfoAbout)

END_EVENT_TABLE()

 

void MainFrm::OnMenuFileOpen(wxCommandEvent &event)

{

       // 打开文件

       wxFileDialog *dlg = new wxFileDialog(this, "Open a text file", "", "",

              "All files(*.*)|*.*|Text Files(*.txt)|*.txt",

              wxOPEN, wxDefaultPosition);

       if(dlg->ShowModal()==wxID_OK)

       {

              m_pTextCtrl->LoadFile(dlg->GetPath());

              SetStatusText(dlg->GetFilename(),0);

       }

       dlg->Destroy();

      

}

void MainFrm::OnMenuFileSave(wxCommandEvent &event)

{

       // 保存文件

       wxFileDialog *dlg = new wxFileDialog(this, "Save a text file", "", "",

              "All files(*.*)|*.*|Text Files(*.txt)|*.txt",

              wxSAVE, wxDefaultPosition);

       if ( dlg->ShowModal() == wxID_OK )

       {

              m_pTextCtrl->SaveFile(dlg->GetPath());

              SetStatusText(dlg->GetFilename(), 0);

       }

       dlg->Destroy();

}

void MainFrm::OnMenuFileQuit(wxCommandEvent &event)

{

       //退出程序

       Close(FALSE);

}

void MainFrm::OnMenuInfoAbout(wxCommandEvent &event)

{

       wxLogMessage("CopyRight(c) 2004 . Donnie Zhang/n/n简单的文本编辑器 - wxFrame事例/n");

}



       显示自己创建的MainFrame

// 文件: wxFrameTest.h

#ifndef wxFrameTest_H

#define wxFrameTest_H

class wxFrameTestApp : public wxApp

{

public:

    // 程序初始化

    virtual bool OnInit();

};

DECLARE_APP(wxFrameTestApp)

#endif // wxFrameTest_H

// 文件: wxFrameTest.cpp

// 对支持预编译编译器要包含"wx/wx.h"

#include "wx/wxprec.h"

#ifndef WX_PRECOMP

#include "wx/wx.h"

#endif

#include "wxFrameTest.h"

#include "MainFrm.h"

 

IMPLEMENT_APP(wxFrameTestApp)

 

//每个wxWindow程序都要有一个继承自wxApp的对象,并都要用OnInit()方法来实例化,

//而你就是在这创建主窗口。

 

bool wxFrameTestApp::OnInit()

{

    MainFrm *frame = new MainFrm("简单的文本编辑器 - wxFrame事例", 100, 100, 800, 600);

       frame->SetIcon(wxICON(MainFrmICON));

    frame->Show(TRUE);

    SetTopWindow(frame);

    return true;

}


       这样一个简单的编辑器就写完了,用不着我多做解释,看代码注释应该就可以懂了。其中就是菜单响应事件这块有些需要注意。它用的是事件表(在wxWindows的早期版本中这是通过使用回调函数或者通过重载虚拟函数来实现的,wxWindows2.0后改为使用事件表来实现。)。要处理事件的每个类都需要声明一个事件表。MainFrm.h代码中宏DECLARE_EVENT_TABLE用来完成这项工作。每一个事件都必须有一个已经实现了的方法,每个方法都有一个参数用来包含事件的信息,从菜单获得的事件是一个wxCommandEvent类型的数据。而事件表我们放在实现文件中的,wxWindows通过一些宏来帮助的完成事件表的声明。宏BEGIN_EVENT在事件表声明的开始处使用,因为在一个程序中可能不止一个事件表,要将事件处理过程相关的类名传递给宏。将一个方法与事件关联要使用EVT_MENU宏。这个宏需要菜单ID与事件名。在事件表的最后用宏END_EVENT_TABLE作结束标记。这样我们就可以处理菜单事件了。
  
       
wxPython 入门教程. 这篇文章是关于 wxPython,但 wxPython 实际是两件事物的组合体:Python 脚本语言和 GUI 功能的 wxWindows 库(关于 wxWindows 的介绍,请参阅 developerWorks上的 [ “细述 wxWindows” ](http://www.ibm.com/developerworks/cn/linux/sdk/python/wxwin/index.html) )。wxWindows 库是为了最大可移植性的 C/C++ 库,而抽取 GUI 功能。所以 wxWindow 阅读详情

相关推荐

wxWindows入门

学习所需的背景知识 1. 已经会用 C++ 写些简单程序的人, 并对 OOP (Object-Oriented Programming) 有基本了解. 2. 知道如何设定编译器, 以及如何连结产生一个可执行档, 如果你写的程序在编译时一直出现 link error 或是 cannot find xxxx.h 这类的讯息, 而你自己无法解决这种问题, 代表你目前不适合学 wxWindo

一直在路上 3632

Windows使用WxWidgets开发界面(c++)环境搭建

一直想学习wxWidgets,之前使用的都是wxPython,现在终于鼓起勇气学习这个了,发现原来是基于vc6.0开发的。所以最好的学习办法就是安装vistual studio 2010,方便学习看代码。wxWidgets里面也有demo。 基本上wxWidgets是和MFC类似的。 参考:http://www.codeproject.com/Articles/11515/Introd

freewebsys的专栏 6628

编译wxWidgets及libwx-c.so (libwx-c-0-9-0-2.so) 的经历与体会

FreeBasic有wx-c完整的头文件,但没有相应的libwx-c文件,网上能找到的也只有ELF32格式的 libwx-c-0-9-0-2.so ,很长时间的停更原因不得而知。写改写wx-c到wxWidget3.2.4新版本wx-c的话,除了会修改函数,还会涉及到增加新函数,麻烦的是freebasic的头文件也要改,相应的示例程序也要改,开源的32位的设计器也要改(IDE不用改,它使用的设计器是个Visual_WX-C_Designer的plugin, 编译器是 fbc),暂时没有改动它们的想法。

weixin_45707491的博客 1261

使用C++开发wxWidgets程序

 不知道原文地址,给出获得这篇文章的地址:http://kylix.linuxaid.com.cn/book/wxWindowstut/wxTutorial.html 这篇文章对于初学者非常有帮助 if (window.showTocToggle) { var tocShowText = "显示"; var tocHideText = "隐藏"; showTocToggle

蜗牛档案室 7744

wxWindows简单的Hello World程序

我们知道,在使用Win32或者是MFC的时候,最简单的Hello World程序就是用消息框蹦出来Hello World了.下面我就用wxWindows同样来做一个,源代码如下:// ==============================// filename xi.cpp// ==============================#ifndef _XI_CPP#define _XI_

糯米糊糊的专栏 2369

将 MFC 应用程序移植到 Linux(循序渐进使用 wxWindows 的指南)

将 Windows 应用程序移植到 Linux 不必涉及再培训的痛苦经历。Markus Neifer 演示了如何使用 wxWindows 移植 MFC,指导读者使用 wxWindows 这一开放源码工具箱,并循序渐进地向读者介绍了一个完整的移植示例。您可能仍然在维护用微软基础类库(Microsoft Foundation Classes(MFC))构建的旧的 Windows 应用程序,而现在却

ku3gitxdx的专栏 1093

wxWindows

用C++编写跨平台程序中文版说明本教程由Gxl117翻译并将继续维护,这是本教程的第一稿,假设发现错误请与我(Email:gxl117@yahoo.com.cn)联系让我能及时修正它。之后还会对这个教程进行很多其它的扩充,欢迎广大网友提供意见。本教程遵循GPL协议公布。本许可授权你制作和公布本教程的拷贝,但在所有拷贝上要保留本版权声明和许可声明。假设你准备出版本号文档,请告之译者,以确保你获得...

weixin_33834628的博客 302

wxWidgets开发教程

不知道原文地址,给出获得这篇文章的地址:http://kylix.linuxaid.com.cn/book/wxWindowstut/wxTutorial.html 这篇文章对于初学者非常有帮助 [编辑] 中文版说明 本教程由Gxl117翻译并将继续维护,这是本教程的第一稿,如果发现错误请与我(Email:gxl117@yahoo.com.cn)联系让我能及时修正它。之后还会

SCOTT 技术博客 4729

(转)将 MFC 应用程序移植到 Linux

<br />http://www.ibm.com/developerworks/cn/linux/guitoolkit/l-mfc/index.html<br /> <br /><br />循序渐进使用 wxWindows 的指南Markus Neifer (howlingmad@users.sourceforge.net), 软件开发人员<br /> <br />简介: 将 Windows 应用程序移植到 Linux 不必涉及再培训的痛苦经历。Markus Neifer 演示了如何使用 wxWindows

lvliang2008的专栏 2560

wxpython开发教程_wxPython 入门教程

这篇文章是关于 wxPython,但 wxPython 实际是两件事物的组合体:Python 脚本语言和 GUI 功能的 wxWindows 库(关于 wxWindows 的介绍,请参阅 developerWorks上的 “细述 wxWindows” )。wxWindows 库是为了最大可移植性的 C/C++ 库,而抽取 GUI 功能。所以 wxWindows 应用程序与生俱来地可以运行在 Win...

weixin_39809793的博客 324

wxPython 入门

 您可以在几分钟内编写一段 Python脚本和让桌面拥有令人难以置信的相当漂亮的 GUI应用程序。这篇文章向您展示如何使用一 Python-著称的 GUI 库wxPython,来做到这一点的。向您的朋友和邻居介绍!这篇文章是关于 wxPython,但 wxPython 实际是两件事物的组合体:Python 脚本语言和 GUI 功能的 wxWindows 库(关于 wxWindows 的介绍,请参阅

三岔路口,每一条路都有自己的精彩...... 1546

将 MFC 应用程序移植到 Linux

您可能仍然在维护用微软基础类库(Microsoft Foundation Classes(MFC))构建的旧的 Windows 应用程序,而现在却有客户要求 Linux 版本,该怎么办呢?在您的团队中可能有技术熟练的 MFC 开发人员,但如何达到加速 Linux 开发呢?别急;本文就是针对您这种情况而写的。依靠 wxWindows(一种用于 C++ 和 Python 的可移植 GUI 工具箱)的帮

蜗牛档案室 6542

Python基础

这篇文章是关于 wxPython,但 wxPython 实际是两件事物的组合体:Python 脚本语言和 GUI 功能的 wxWindows 库(关于 wxWindows 的介绍,请参阅 developerWorks上的 “细述 wxWindows” )。wxWindows 库是为了最大可移植性的 C/C++ 库,而抽取 GUI 功能。所以 wxWindows

546

使用WxPython进行Win32下Python编程

1 另一种可供Python使用的GUI工具包叫做wxPython。目前这个工具对于Python环境来说还是陌生的,但正在Python开发者中间快速地流行起来。wxPython是Python扩展模块,它封装了wxWindows C++类库。wxPython是一个为Python提供

embededvc的专栏 2425

wxpythom入门

这篇文章是关于 wxPython,但 wxPython 实际是两件事物的组合体:Python 脚本语言和 GUI 功能的 wxWindows 库(关于 wxWindows 的介绍,请参阅 developerWorks上的 “细述 wxWindows” )。wxWindows 库是为了最大可移植性的 C/C++ 库,而抽取 GUI 功能。所以 wxWindows 应用程序与生俱来地可以运行在 W

vampirem的专栏 1190

将MFC应用程序移植到Linux

将MFC应用程序移植到Linux 2002年03月31日 16:00 来源:ChinaUnix文档频道 作者:HonestQiao 编辑:周荣茂 级别: 初级 Markus Neifer (howlingmad@users.sourceforge.net), 软件开发人员 2002 年 4 月 01 日 将 Windows 应用程序移植到 Linux 不必涉及再培

autumn20080101的专栏 1233
上一篇: 关于 wxWindows
下一篇: 用const时应注意的一些地方
dfz
dfz
博客等级 码龄24年 3粉丝 9原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值