最近换了个公司一样弄CEGUI相关的东西,编辑器需求的控件库是wxWidgets。我只在初学cegui的时候才接触到这个库。
换了这里才开始看,学习的过程让我发现wxWidgets刚好能补充我界面库方面的缺陷。精通wx至少不用学习mfc了,它比mfc更明了一些。编辑器开发,wxWidgets几乎可以凌驾于Qt之上。
我阅读了一部分源码,发觉这东西实在太好用了,第一次学就被这界面库吸引了,像是一个艺术品。所以想在近期发一些最近学习wx的心得,并且发布一些阅码注释。菜鸟一个,请勿见笑。
wx作为一个跨平台库,历史就不用说太多了。说它能做的事,除了一些基本界面控件外。wx还可以装载网页,播放声音,连接数据库,播放gif,连接打印机进行图像输出等等等等。事件操作极其灵活。
作为一个半路出家的程序员,基础方面一般都比较薄弱,我也如此。没有接触过mfc,工作几年下来仍然缺少一个迅速产生界面的工具,wx刚好弥补我的不足,这也成了我痴迷于这个工具的主要原因。
下面,我们开始吧!!!
这是wx的第一个窗体,几乎涵盖了所有操作,初咋到学习wx应能得到很大帮助
// wx跨平台处理,根据不同的操作系统,决定使用不同的文件包含形式
#include "wx/wxprec.h"
//------------------------------------------------------------------------------------------------
// __BORLANDC__ 表示如果在BorLand C++ 编译器采用该操作
// #pragma hdrstop 结束预编译头文件列表
// 在头文件中使用该编译指示无效。
#ifdef __BORLANDC__
#pragma hdrstop
#endif
//------------------------------------------------------------------------------------------------
// 必要头文件
#ifndef WX_PRECOMP
#include "wx/wx.h" // 这个头文件中包含所有空间需求的wx标准控件
#endif
#include "wx/image.h" // 静态图片控件
#include "wx/imagpng.h" // png图片空间(因为这里会加载一个html文件,文件中包含png)
#include "wx/wxhtml.h" // 加载html语言资源
#include "wx/statline.h"// 静态行
//------------------------------------------------------------------------------------------------
#ifndef __WXMSW__
#include "../../sample.xpm"
#endif
///* sample.xpm 是神马?
// *.xpm (XPixMap)
// *.xpm 文件在程序中代表一种图形格式文件
// 在X11中是一个标准格式,保存为 "ASCII" 和 "C源码" 的形式,可以直接将它编辑到自己的应用程序中去。
// *.xbm
// 1 .作为XPM的一个特例,也可以保存为 "ASCII" 和 "C源码" 的形式,通常用作鼠标键盘指针
// 2 .可以做为 GRUB系统 下可支持的背景图片格式!( GRUB 是一个多重操作系统启动管理器 。)
//*/
//------------------------------------------------------------------------------------------------
// 事件
enum
{
mytest_About = wxID_HIGHEST +1,// 这里添加的必须都再wxID_HIGHEST 之上否则会导致wx内部调用事件时候间接调用到
mytest_Exit ,
mytest_Message ,
};
// 头文件定义
class MyFrame : public wxFrame
{
public:
MyFrame(const wxString& title);
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
void mytest_Message_fun(wxCommandEvent& event);
private:
// 处理wx事件的固定格式:原注释内容"想要处理wx事件必须包含这个宏(教程注释好2阿)"
DECLARE_EVENT_TABLE()
};
//------------------------------------------------------------------------------------------------
// 事件绑定
BEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU(mytest_About , MyFrame::OnAbout)
EVT_MENU(mytest_Exit , MyFrame::OnQuit)
EVT_MENU(mytest_Message , MyFrame::mytest_Message_fun)
END_EVENT_TABLE()
// cpp 文件内容
//------------------------------------------------------------------------------------------------
MyFrame:: MyFrame ( const wxString& title )
: wxFrame ( (wxFrame *)NULL , wxID_ANY , title )
// 1.(wxFrame *)NULL 由于是根窗体,这里不必设置父窗口
// 2.wxID_ANY 由于是根窗体,这里不必特别控制,交给wx自己生成事件
{
// 小图标:sample 是在资源里定义
SetIcon(wxICON(sample));
// 菜单栏:添加各种菜单命令
wxMenu *menuFile = new wxMenu;
menuFile->Append(mytest_About,_("关于 1\tCtrl+A"));//'\t'字符后面教程上面给的理解叫“加速键”其实就是底层已经定义好的快捷键
menuFile->Append(mytest_Exit, _("退出 2\tShift-Alt-Q"));// 格式: 双键位的‘+'连接 三键位的'-'连接
menuFile->Append(mytest_Message,_("对话框 3\tM"));// 这里需注意下,如果是正规的wx宏,wx有主动设置名称的能力,但是如果是自己定义的这里就得自己手动给名字
// 菜单条:将各个菜单统一整理到一起
wxMenuBar *menuBar = new wxMenuBar;
menuBar->Append(menuFile, _("&File"));
// 添加菜单条到窗口
SetMenuBar(menuBar);
}
void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
{
Close(true);
}
void MyFrame::mytest_Message_fun(wxCommandEvent& WXUNUSED(event))
{
// 对话框
wxMessageBox("哦厚,哦厚,哦厚厚厚厚");
}
void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
{
wxDialog dlg(this, wxID_ANY, wxString(_("About")));
// 按钮
wxButton *bu1 = NULL;
bu1 = new wxButton(&dlg, wxID_OK, _("OK"));
bu1 -> SetDefault();
// 网页框
wxHtmlWindow *html = NULL;
html = new wxHtmlWindow(&dlg, wxID_ANY, wxDefaultPosition, wxSize(380, 160), wxHW_SCROLLBAR_NEVER);
html -> SetBorders(0);
html -> LoadPage(wxT("data/about.htm"));
html -> SetSize(html -> GetInternalRepresentation() -> GetWidth(), html -> GetInternalRepresentation() -> GetHeight());
// 静态线
wxStaticLine* line = NULL;
line = new wxStaticLine(&dlg,wxID_ANY);
// wxWidgets 布局类
wxBoxSizer *topsizer = NULL;
topsizer = new wxBoxSizer(wxVERTICAL);
topsizer -> Add(html, 1, wxALL , 10);
topsizer -> Add(line, 0, wxEXPAND | wxLEFT | wxRIGHT , 10);
topsizer -> Add(bu1 , 0, wxALL | wxALIGN_RIGHT , 15);
dlg.SetSizer(topsizer);
topsizer -> Fit(&dlg);//Fit后马上更新窗口UpdateSize让其立刻更新
dlg.ShowModal();// 显示对话框
}
//------------------------------------------------------------------------------------------------
class MyApp : public wxApp
{
public:
virtual bool OnInit();// 相当于c语言中的main()。wx的运行架构暂时不考虑
};
// 创建一个实例
IMPLEMENT_APP(MyApp)
bool MyApp::OnInit()
{
if ( !wxApp::OnInit() )
{
return false;
}
// 在html文件中使用了一个png 添加个png句柄
wxImage::AddHandler( new wxPNGHandler );
// 创建并显示主实例窗口
MyFrame *frame = new MyFrame( _("cegui测试标题") );
frame->Show();
return true;
}
//------------------------------------------------------------------------------------------------