您的位置:首页 > 其它

如何使用wxWidgets跨平台界面库来编写一个对话框窗口?

2014-01-10 11:17 489 查看
如题:

这是一个窗口类,调用方法是:

++++++

wxString fontname = new_tab_->GetFontName();
//wxT("System");
DlgFontName *dlg_fontname = new DlgFontName(this,fontname);
if (dlg_fontname->ShowModal() == wxID_OK)
{
fontname = dlg_fontname->GetFontName();
}
dlg_fontname->Destroy();--------

++++

/*
file : dlg_fontname.h/cpp
function : a select fontname of dialog.
return : fontname
init : fontname
created : 2014-01-09 by Lily
*/

#pragma once

#include <wx/wx.h>
#include <wx/listctrl.h>

class DlgFontName : public wxDialog
{
DECLARE_DYNAMIC_CLASS(DlgFontName)

//在CPP里面,需要将控件ID和事件绑定
DECLARE_EVENT_TABLE()

public:
/********************************************
初始化窗体函数
传递参数:font_name (default is nothing)
sample:
DlgFontName *dlg_fontname = new DlgFontName(this);
********************************************/
DlgFontName(wxWindow* parent,
const wxString& fontname = wxT("System"),
wxWindowID id = wxID_ANY,
const wxString& caption = wxT("Font"),
const wxPoint& pos = wxDefaultPosition,
const wxSize& size = wxDefaultSize,
long style =wxCAPTION | wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER
);

/***************************************************
关闭窗体时执行的函数
****************************************************/
~DlgFontName(void);

/***************************************************
使用鼠标选中 CListBox 的一行
****************************************************/
void OnSelectedListBox(wxCommandEvent& event);

//Get FontName
const wxString GetFontName();

//选择ListBox中的一行 by fontname
bool SetSelectedInListBox(const wxString& fontname,wxListBox *listbox);

private:
wxString m_fontname;
/***************************************************
初始化窗口
****************************************************/
bool Create(wxWindow* parent,
wxWindowID id,
const wxString& caption,
const wxPoint& pos,
const wxSize& size,
long style);

/***************************************************
在创体上生成控件
***************************************************/
void CreateControls();

/***************************************************
给控件ListBox填充FontNames
***************************************************/
wxArrayString GetAllFontNames();

/**********************************************
从主界面得到一个fontname,然后让text得到并且让listbox选中1行
**********************************************/
void Init();

//Set FontName
void SetFontName(const wxString& fontname);

//当用户点击窗口右上角的close小按钮时,发生的事件
void CloseFontNameDlg(wxCloseEvent &event);//void handlerFuncName(wxCloseEvent& event)

/***************************************************
变量申明
***************************************************/

// 声明控件的ID,主要是为了和控件的事件绑定
enum
{
ID_ListBox_FontName,
ID_TextCtrl_FontName
};

// 控件名称
wxListBox *m_listbox_fontname;
wxTextCtrl *m_text_fontname;
};

以上是窗口1类H文件

++++

#include <wx/fontenum.h> // 得到所有 FontNames
#include "Dialog/dlg_fontname.h"

IMPLEMENT_CLASS(DlgFontName, wxDialog)

// 将控件ID和事件绑定
BEGIN_EVENT_TABLE(DlgFontName, wxDialog)

EVT_LISTBOX(ID_ListBox_FontName, OnSelectedListBox)

EVT_CLOSE(CloseFontNameDlg)

END_EVENT_TABLE()

// 调用本类,生成窗体时,需要执行这个函数
DlgFontName::DlgFontName(wxWindow *parent,
const wxString& fontname,
wxWindowID id,
const wxString& caption,
const wxPoint& pos,
const wxSize& size,
long style)
{
this->m_fontname = "";
SetFontName(fontname);
Create(parent, id, caption, pos, size, style);
}

//释放窗体时,执行这个函数
DlgFontName::~DlgFontName(void)
{
}

//private:生成窗体(最基本的框架,上面有关闭按钮,其他没有)
bool DlgFontName::Create(wxWindow* parent,
wxWindowID id,
const wxString& caption,
const wxPoint& pos,
const wxSize& size,
long style)
{
//设置窗体风格
SetExtraStyle(wxWS_EX_BLOCK_EVENTS);// | wxDIALOG_EX_CONTEXTHELP
wxString str_caption = "Font";
//设置不重复打开窗体
if (!wxDialog::Create(parent, id, str_caption, pos, size, style))
{
return false;
}

//生成窗体里的控件
CreateControls();

//自动改变大小
GetSizer()->Fit(this);
GetSizer()->SetSizeHints(this);
//窗体居中
Centre();
return true;
}

// 设置生成控件后,初始化fontname的值,有时候为""
void DlgFontName::Init()
{
if(NULL != this->m_listbox_fontname)
{
this->m_fontname = GetFontName();
bool if_existed = SetSelectedInListBox(m_fontname,this->m_listbox_fontname);
if(if_existed && (NULL !=m_text_fontname))
{
this->m_text_fontname->SetLabel(m_fontname);
}
}
}

//private:声称控件,在窗体:全部控件,都是可以随着窗口的大小缩放而变化,所以每个控件没有具体坐标
void DlgFontName::CreateControls()
{
//窗体的自我缩放控件
wxFlexGridSizer *gSizer_all = new wxFlexGridSizer(3, 1, 0, 0);//控件有3行 1列

//这里只让 0行1列的ListBox缩放
gSizer_all->AddGrowableCol(0);
gSizer_all->AddGrowableRow(1);
gSizer_all->SetFlexibleDirection(wxBOTH);

//第一行:增加一个自我缩放控件 ++++++++++++++++++++++++++++++++++++++++++++++++++++
wxFlexGridSizer* gSizer_row1 = new wxFlexGridSizer(1, 2, 0, 0);

//控制缩放的控件,按照控件的作为位置来控制,例如,第1行第2列的控件,需要跟着一起缩放,那么一下就需要写这个坐标
gSizer_row1->AddGrowableCol(1); // 增加 2 列 (同时,让控件一起缩放)
gSizer_row1->AddGrowableRow(0); // 增加 1 行
gSizer_row1->SetFlexibleDirection(wxBOTH); //这里控制的是 filter_text 控件

//生成标签 "Font : "
wxStaticText* filter_label = new wxStaticText(this, wxID_ANY,
wxT("Font:"), wxDefaultPosition, wxDefaultSize, 0);
//生成编辑框 FontName
m_text_fontname = new wxTextCtrl(this, ID_TextCtrl_FontName);

gSizer_row1->Add(filter_label, 1, wxALL | wxEXPAND, 5); //最有相距5 (与控件)
gSizer_row1->Add(m_text_fontname, 1, wxALL | wxEXPAND, 5); //最有相距5
//------------------------------------------------------------------------------
//将这个自动缩放控件,放入到第一个自我缩放控件里面,这样才能随着一起变动
gSizer_all->Add(gSizer_row1, 1, wxUP | wxRIGHT | wxLEFT | wxEXPAND,10);
//上面的 10 表示 上面2个控件间距之和 = 5+5 = 10

//增加一个ListBox控件
m_listbox_fontname = new wxListBox(this, ID_ListBox_FontName,
wxDefaultPosition, wxDefaultSize,
GetAllFontNames(), wxLB_SINGLE);

//这里设置大小,但是其他的控件,会跟着这个控件大小自我调节,不用担心
this->m_listbox_fontname->SetInitialSize(wxSize(300, 300));

//直接将ListBox控件放在总缩放控件里面
gSizer_all->Add(this->m_listbox_fontname, 1, wxRIGHT | wxLEFT | wxEXPAND, 15); //最后一个数字 :表示左右边距
//这里的 15 表示 上面控件 10 缩放 + 左边第一个控件的缩放 5 = 10 + 5 = 15

//以下增加 1个标签 1个Text +++[保存这里,以备后用]++++++++++++++++++++++++++++++++++++++
//wxFlexGridSizer* gSizer3= new wxFlexGridSizer(1, 2, 0, 0);//1行2列
//gSizer3->AddGrowableCol(1);
//gSizer3->AddGrowableRow(0);
//gSizer3->SetFlexibleDirection(wxBOTH);

//wxStaticText* target_label = new wxStaticText(this, wxID_ANY,
// wxT("Target:"), wxDefaultPosition, wxDefaultSize, 0);
//target_text_ = new wxTextCtrl(this, wxID_ANY);
//gSizer3->Add(target_label, 1, wxALL | wxEXPAND, 4);
//gSizer3->Add(target_text_, 1, wxALL | wxEXPAND, 4);
//gSizer1->Add(gSizer3, 1, wxUP | wxRIGHT | wxLEFT | wxEXPAND, 8);
//---------------------------------------------------------------

//生成按钮组:准备在里面增加2个按钮
wxBoxSizer* button_box = new wxBoxSizer(wxHORIZONTAL);

//Add Button : OK
wxButton* ok = new wxButton(this, wxID_OK, wxT("&OK"), wxDefaultPosition, wxDefaultSize, 0);
button_box->Add(ok, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5); // 5 表示与上面控件的距离

//Add Button : Cancel
wxButton* cancel = new wxButton(this, wxID_CANCEL, wxT("&Cancel"),wxDefaultPosition, wxDefaultSize, 0);
button_box->Add(cancel, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 5);// 5 表示与上面控件的距离

//将按钮组增加到总缩放控件里面
gSizer_all->Add(button_box, 1, wxRIGHT | wxLEFT | wxALIGN_RIGHT, 10);//最后一个数字:表示与右边边界的距离
// 以上最后数字是上面 5 + 5 = 10 这样保证与右边的边对齐

// 自动缩放
SetSizer(gSizer_all);
Layout();

Init();
}

void DlgFontName::OnSelectedListBox(wxCommandEvent& event)
{
int iSelected = event.GetSelection();
wxString value = wxT("");
value = this->m_listbox_fontname->GetString(iSelected);
this->m_text_fontname->SetLabel(value);
SetFontName(value);
}

wxArrayString DlgFontName::GetAllFontNames()
{
wxFontEnumerator myFonts;
wxArrayString strFontNames;
wxFontEncoding encoding = wxFONTENCODING_DEFAULT;//wxFONTENCODING_SYSTEM;
strFontNames = myFonts.GetFacenames(encoding,false);
int iFontCount = strFontNames.size();
wxArrayString strFontNames_H;
wxString strFontName;

//去掉"@"开头的字符串 (不要FontName竖向的,因为要使用到网页中)
for(int i=0;i<strFontNames.size();i++)
{
strFontName = strFontNames[i];
if(strFontName.Find("@")<0)
{
strFontNames_H.Add(strFontName);
}
}
strFontNames_H.Sort();
return strFontNames_H;
}

const wxString DlgFontName::GetFontName()
{
return m_fontname;
}

void DlgFontName::SetFontName(const wxString& fontname)
{
m_fontname = fontname;
}

bool DlgFontName::SetSelectedInListBox(const wxString& fontname,wxListBox *listbox)
{
bool if_existed=false;
wxString str_fontname="";
if(!fontname.IsEmpty())
{
for(int i=0;i<listbox->GetCount();i++)
{
str_fontname = listbox->GetString(i);
if(fontname == str_fontname)
{
listbox->SetSelection(i,i);
if_existed = true;
break;
}
}
}
return if_existed;
}

void DlgFontName::CloseFontNameDlg(wxCloseEvent &event)
{
EndModal(wxID_OK); // 执行wxID_OK事件,这是一个默认值
}


窗口1类CPP文件

--------------
完。

以上测试成功!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐