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