分享
 
 
 

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

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

上一次简单介绍了一下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作结束标记。这样我们就可以处理菜单事件了。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有