如何使用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文件
--------------
完。
以上测试成功!
这是一个窗口类,调用方法是:
++++++
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文件
--------------
完。
以上测试成功!
相关文章推荐
- 《使用wxWidgets进行跨平台程序开发》chap09——布局一个对话框
- 如何弹出一个窗口气泡(使用定时器向上移动)
- Linux操作系统的简单指令及如何使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。
- 如何编写一个使用Store更新复选框的CheckboxGroup的插件
- wxwidgets 界面编程如何使用 png 图片
- 教你如何使用java语言编写一个简单的SqlHelper类
- 如何使用Python为Hadoop编写一个简单的MapReduce程序(这个人T字还有好几篇精华的可以看)
- 定制 SWT/RCP 界面:如何编写一个漂亮的 SWT/RCP 界面
- 如何编写一个使用Store更新复选框的CheckboxGroup的插件
- C#编写的一个简单的登陆界面对话框的原代码
- 如何使用jQuery UI的sortable组件做一个更为友好的界面(中)
- 如何使用windows bat编写一个快速启动工具
- 如何使用Createjs来编写HTML5游戏(六)完成一个简单的打飞机游戏(上)
- 【C#】如何让多个或全部窗口使用同一个图标(icon),减小程序体积
- 在使用JS调用Window.close()方法关闭一个窗口是,如何禁止弹出对话窗口?
- 在C#中使用Ribbon界面(一)——创建一个Ribbon窗口
- VC 常见问题百问~确定应用程序的路径~~如何在对话框中显示一个位图?~~窗口重绘
- 如何使用一个不错的图表组件WebChart(免费) 用c#编写
- 一个界面中如何使用两个tableView
- 如何使用Python为Hadoop编写一个简单的MapReduce程序