Google

星期一, 四月 07, 2008

使用wxWidgets的总体框架

下午又尝试了使用wxWidgets做一个稍微完整一点的界面,虽然简单,但都包含了wxWidgets的基本编程"框架"了.说框架夸张了点,吓人用的,^_^
程序里面已经包含了非常详细的注释了,哈哈,突然想起了文学编程!

/////////////////////////

//TextEditorApp.h头文件//

*///////////////////////

#ifndef TEXTEDITORAPP_H
#define TEXTEDITORAPP_H

//每个wxWidgets程序需要定义一个wxApp类的子类
//需要创建并且只能创建一个这个类的实例
//这个实例控制着整个程序的执行!
class TextEditorApp : public wxApp
{
public:
//继承自wxApp的子类至少需要定义OnInit()函数
//这个函数类似于WinMain,wxWidgets准备运行代码时会调用这个函数
virtual bool OnInit();
//这个函数创建至少一个窗口实例,对传入的命令行参数进行解析等
//如果这个函数返回真,wxWidgets将开始时间循环接受/处理用户输入
//如果返回为假,那么wxWidgets将会释放内部分配的资源,然后结束整个的程序的运行
};
//当wxWidgets创建这个TextEditorApp类实例的时候
//会将创建的结果赋值给一个全局变量wxTheApp
//可以直接在程序中使用这个变量,但是需要进行从wxApp到TextEditorApp类型强制转换
//增加了下面一行后,可以调用wxGetApp()函数
//这个函数返回一个到TextEditorApp的实例引用
DECLARE_APP(TextEditorApp)
#endif // TEXTEDITORAPP_H

///////////////////////////

//TextEditorApp.cpp 源文件//

///////////////////////////

// 对支持预编译编译器要包含"wx/wx.h"
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#include "TextEditorApp.h"
#include "TextFrame.h"
//这里没有创建TextEditorApp的代码!这是在wxWidgets内部实现的!
//你需要告诉wxWidgets创建那个App类实例,就是通过这个宏实现的
IMPLEMENT_APP(TextEditorApp)
//这个宏会检查编译应用程序使用的库文件是否和当前的库文件相匹配

bool TextEditorApp::OnInit()
{
TextFrame *frame = new TextFrame("Simple Text Editor", 100, 100, 400, 300);
frame->Show(TRUE);
SetTopWindow(frame);
return true;
}

上面就是程序的总体框架了,程序就是从这里开始执行的,下面时程序的窗体部分:

///////////////////////////

//TextFrame.h 头文件 //

//////////////////////////

#ifndef _TEXTFRAME_H
#define _TEXTFRAME_H

//一个Frame窗口是一个可以容纳别的窗口的顶层窗口
class TextFrame : public wxFrame
{
public:
//构造函数. 用来创建新的TextFrame
TextFrame(const wxChar *title, int xpos, int ypos, int width, int height);
//析构函数
~TextFrame();

//菜单处理事件
//每个方法都有一个参数用来包含事件的信息
//从菜单获得的事件是一个wxCommandEvent类型的数据
void OnMenuFileOpen(wxCommandEvent &event);
void OnMenuFileSave(wxCommandEvent &event);
void OnMenuFileQuit(wxCommandEvent &event);
void OnMenuInfoAbout(wxCommandEvent &event);
protected:
//要处理事件的每个类都需要声明一个事件表
//宏DECLARE_EVENT_TABLE用来完成这项工作
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 //_TEXTFRAME_H

///////////////////////

// TextFrame.cpp源文件//

///////////////////////

// 对支持预编译编译器要包含"wx/wx.h"
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "TextFrame.h"
TextFrame::TextFrame(const wxChar *title, int xpos, int ypos, int width, int height)
: wxFrame((wxFrame *) NULL, -1, title, wxPoint(xpos, ypos), wxSize(width, height))
{
//假如想给程序加上图标,应该使用下面的语句
//SetIcon(wxIcon(mondrian_xpm));
//此前应该加入一个xpm格式的图片
//#include "modrian.xpm"
//xpm其实是一个ASCII编码的完全符合c++语法的文本文件,所以可以直接用c++的方式包含到代码中
//SetIcon使用mondrian_xpm变量在堆栈上创建了一个图标
//这个mondrian变量是在mondrian.xpm文件中定义的


//编辑框
m_pTextCtrl = new wxTextCtrl(this, -1, wxT(wxString("测试")), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);

// 菜单条
m_pMenuBar = new wxMenuBar();

// 文件菜单
m_pFileMenu = new wxMenu();

//wxT宏可以让代码兼容Unicode模式,和宏_T的作用一样
//_()将字符串翻译为指定语言的版本
//&符号的前导的字符将成为彩旦的快捷操作符,实际中为一下划线
//t符号则表示一个全局的快捷键
m_pFileMenu->Append(MENU_FILE_OPEN, wxT("O&打开\tF2"), wxT("打开文件"));
m_pFileMenu->Append(MENU_FILE_SAVE, wxT("S&保存\tF3"), wxT("保存文件"));
m_pFileMenu->AppendSeparator();
m_pFileMenu->Append(MENU_FILE_QUIT, wxT("Q&退出\tF4"), wxT("退出系统"));
m_pMenuBar->Append(m_pFileMenu, wxT("F&文件"));

// 关于菜单
m_pInfoMenu = new wxMenu();
m_pInfoMenu->Append(MENU_INFO_ABOUT, wxT("A&关于\tF5"), wxT("关于软件"));
m_pMenuBar->Append(m_pInfoMenu, wxT("I&信息"));

//设置程序菜单条
SetMenuBar(m_pMenuBar);

//创建一个有三个域的状态栏。第一个域包含文本"Ready"
//状态栏用来显示对一个菜单项的描述。
CreateStatusBar(3);
SetStatusText("Ready",0);
}
TextFrame::~TextFrame()
{
}

//事件表是放在实现文件中的
//宏BEGIN_EVENT在事件表声明的开始处使用
BEGIN_EVENT_TABLE(TextFrame, wxFrame)
//将一个方法与事件关联要使用EVT_MENU宏
//这个宏需要菜单ID与事件名
EVT_MENU(MENU_FILE_OPEN, TextFrame::OnMenuFileOpen)
EVT_MENU(MENU_FILE_SAVE, TextFrame::OnMenuFileSave)
EVT_MENU(MENU_FILE_QUIT, TextFrame::OnMenuFileQuit)
EVT_MENU(MENU_INFO_ABOUT, TextFrame::OnMenuInfoAbout)
END_EVENT_TABLE()
//事件表的最后用宏END_EVENT_TABLE作结束标记

void TextFrame::OnMenuFileOpen(wxCommandEvent &event)
{
wxLogMessage(wxT("File Open Menu Selected"));
}

void TextFrame::OnMenuFileSave(wxCommandEvent &event)
{
wxLogMessage(wxT("File Save Menu Selected"));
}

void TextFrame::OnMenuFileQuit(wxCommandEvent &event)
{
//Close函数并不直接关闭Frame窗口,而是产生了一个wxEVT_CLOSE_WINDOWS事件
//这个事件默认的处理函数调用wxWindow::Destory函数释放了frame窗口
Close(FALSE);
//当点击关闭按钮时,wxWidgets也会调用close()函数,给frame窗口发一个wxEVT_CLOSE_WINDOWS事件
//可以在程序中拦截这个事件,改变默认的处理行为!
}

void TextFrame::OnMenuInfoAbout(wxCommandEvent &event)
{
wxLogMessage(wxT("File About Menu Selected"));
}

上面部分就是主窗体,主要包含了菜单,状态栏,编辑框等控件,还包含了事件响应部分,感觉这部分有点像MFC的处理方式。

代码很少(代码是看例子写的),也很简洁,就不用说明了吧(上面还不够详细?)有问题请留言。

http://blog.chinaunix.net/u/25096/showart_375024.html

标签:

0 条评论:

发表评论

<< 主页

辽ICP备05003652号
流风洄雪听天籁,轻云蔽日看落花

Powered by Blogger