wxWidgets 我开始迷上她了~~~~~

 

最近换了个公司一样弄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;
}
//------------------------------------------------------------------------------------------------
 

你可能感兴趣的:(学习追宗)