程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> wxWidgets:使用xrc文件分離界面與代碼

wxWidgets:使用xrc文件分離界面與代碼

編輯:關於C

wxwidgets支持一種叫xrc的文件,我們可以將字符串,控件,界面布局,圖形,放到xrc文件中,程序運行以後再調用這些文件。這就可以在不修改程序的情況下,修改界面,字符串,以及程序中用到的圖形,甚至實現i18n(國際化)。
對於標准控件,wxWidgets本身提供了良好的支持,而且可以使用wxformbuilder這個工具來生成xrc文件。

TextFrame.xrc
<?xml version="1.0" encoding="UTF-8"?>
<resource version="2.3.0.1"xmlns="http://www.wxwidgets.org/wxxrc">
<object class="wxFrame" name="main_frame">
<title>TextDemo</title>
<object class="wxMenuBar" name="main_menu">
<object class="wxMenu" name="file_menu">
<label>_File</label>
<object class="wxMenuItem" name="save_menuitem">
<label>_Save</label>
</object>
</object>
</object>
<object class="wxTextCtrl" name="tc">
<style>wxTE_MULTILINE</style>
</object>
</object>
</resource>


wxTextApp.h
#ifndef TEXTFRAME_H_
#define TEXTFRAME_H_

class TextFrame : public wxFrame
{
public:
TextFrame(wxWindow* parent);
virtual ~TextFrame();

void OnSave(wxCommandEvent& event);
public:

 

private:
DECLARE_EVENT_TABLE()
};

#endif /*TEXTFRAME_H_*/

 


TextApp.cpp

 

#include "wx/wx_gch.h"

#include "TextApp.h"
#include "TextFrame.h"

IMPLEMENT_APP(TextApp)


bool TextApp::OnInit()
{
//初始化xrc處理器
wxXmlResource::Get()->InitAllHandlers();
//載入xrc文件
if (!wxXmlResource::Get()->Load(_T("rc/TextFrame.xrc")))
return false;

TextFrame* frame = new TextFrame((wxWindow*)NULL);
frame->Show(true);
return true;
}

 

 

TextFrame.h


#ifndef TEXTFRAME_H_
#define TEXTFRAME_H_

class TextFrame : public wxFrame
{
public:
TextFrame(wxWindow* parent);
virtual ~TextFrame();

void OnSave(wxCommandEvent& event);
public:

 

private:
DECLARE_EVENT_TABLE()
};

#endif /*TEXTFRAME_H_*/

 

TextFrame.cpp


#include "wx/wx_gch.h"

#include "TextFrame.h"
#include "wx/filedlg.h"

 

BEGIN_EVENT_TABLE(TextFrame,wxFrame)
EVT_MENU(XRCID("save_menuitem"),TextFrame::OnSave)
END_EVENT_TABLE()

//wxMemoryDC dc; //必須構造wxMemoryDC對象以保證能夠調試

TextFrame::TextFrame(wxWindow* parent)
{
//從xrc資源當中初始化本窗口
wxXmlResource::Get()->LoadFrame(this,parent,_T("main_frame"));
}

TextFrame::~TextFrame()
{
}

void TextFrame::OnSave(wxCommandEvent& event)
{
wxFileDialog fd( this,
_T("保存文件"),
_T("."),
_T(""),
_T("txt file(*.txt)|*.txt|all file(*.*)|*.*"),
wxSAVE,
wxDefaultPosition);
if (fd.ShowModal() == wxID_OK)
{
//從xrc資源中找到控件
wxTextCtrl* tc = XRCCTRL(*this,"tc",wxTextCtrl);
tc->SaveFile(fd.GetFilename());
wxMessageBox("保存成功");
}
}
 
如果對界面美化要求比較高的時候,就不得不自己寫控件,自己編寫的控件一樣可以支持xrc。
自定義控件的十個步驟:
(1)、編寫類聲明,它應該擁有一個默認構造函數,一個完整構造函數,一個Create函數用於兩步創建,最好還有一個Init函數用於初始化內部數據。
(2)、增加一個函數DoGetBestSize,這個函數應該根據內部控件的情況(比如標簽尺寸)返回該控件最合適的大小。
(3)、如果已有的事件類不能滿足需要,為你的控件增加新的事件類。比如對於內部復雜的一個按鈕被按下的事件,可能使用已有的wxCommandEvent就可以了,但是更復雜的控件需要更復雜的事件類。並且如果你增加了新的事件類,也應該增加相應的事件映射宏。
(4)、編寫代碼在你的新控件上顯示信息。
(5)、編寫底層鼠標和鍵盤控制代碼,並在其處理函數中產生你自定義的新的事件,以便應用程序可以作出相應處理。
(6)、編寫默認事件處理函數,以便控件可以處理那些標准事件(比如處理wxID_COPY或wxID_UNDO等標准命令的事件)或者默認用戶界面更新事件。
(7)、可選的增加一個驗證器類,以便應用程序可以用它使得數據和控件之間的傳輸變得容易,並且增加數據校驗功能。
(8)、可選的增加一個資源處理類,以便可以再XRC文件中使用你自定義的控件。
(9)、在你准備使用的所有平台上測試你的自定義控件。
(10)、編寫文檔。


摘自 camel的blog
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved