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

如题:

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

++++++

	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文件

--------------

完。


以上测试成功!


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值