{ wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, _("some text")); }
没错,只要“new”一下就搞定了,控件会自动出现在wxFrame中。这是运行结果:
](/uploadImages/2007-5-2/20075222264154001.gif)
如果界面再复杂一些,上面这种方法就行不通了,我们需要引入“Sizer”(详见http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html(Sizer一览),此处不作深入解释): MainFrame::MainFrame(wxWindow* parent, const wxString& title) : wxFrame(parent, wxID_ANY, title) { wxTextCtrl* textCtrl = new wxTextCtrl(this, ID_TEXTCTRL, _T("some text"), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE ); wxButton* button = new wxButton(this, ID_BUTTON, _("测试按钮"), wxDefaultPosition, wxDefaultSize, 0 );
wxBoxSizer* vBoxSizer = new wxBoxSizer(wxVERTICAL); this->SetSizer(vBoxSizer);
vBoxSizer->Add(textCtrl, 1, wxALLwxEXPAND, 5); vBoxSizer->Add(button, 0, wxALIGN_CENTER_HORIZONTALwxALLwxALIGN_BOTTOM, 5); }
上面是多行编辑框控件,下面是按钮控件,当窗口大小变化时,编辑框控件将在水平和垂直方向上自动扩展,而按钮始终位于窗口底部居中。这是运行结果:
](/uploadImages/2007-5-2/20075222264176109.gif)
上述代码中涉及的控件ID(ID_TEXTCTRL,ID_BUTTON)是我们在 mainframe.cpp 中自行定义的(定义控件ID的目的是为了下一步了事件处理): enum CtrlID { ID_TEXTCTRL, ID_BUTTON };
采用 Sizer 机制进行界面布局有相当大的优势。要想设计好自己的程序界面,必须对 Sizer 有比较深入的了解。
参考文档:http://www.wxwidgets.org/manuals/2.6.3/wx_sizeroverview.html(Sizer一览)
采用XML格式文件(XRC文件)定义程序界面也是不错的方式,详见:http://www.wxwidgets.org/manuals/2.6.3/wx_xrcoverview.html(基于XML的资源系统一览)。
无论如何,手工进行界面布局总是很繁杂,我们需要(可视化)工具的帮助:http://www.wxwidgets.org/apps2.htm
处理事件
在wxWidgets中处理事件,主要有两个步骤:编写“事件处理函数(方法)”,填写“事件表(EVENT_TABLE)”。
事件处理函数(方法)视事件的不同而有所不同,但也有规律:没有返回值,只有一个引用型参数(且一定是wxEvent的子类),不是虚方法(virtual method)。事件处理函数(方法)的名称没有特殊规定,可以自行命名。
作为示例,我们来处理上图中“测试按钮”被按下的事件。
根据wxWidgets文档,要处理按钮事件,需在自己的类中添加如下事件处理函数(方法):void MainFrame::OnButtonClick(wxCommandEvent &event)
具体说来就是,在 mainframe.h 文件中的 MainFrame 类中增加新的 OnButtonClick() 方法声明: private: void OnButtonClick(wxCommandEvent& event);
并在 mainframe.cpp 文件中增加 OnButtonClick() 方法的定义: void MainFrame::OnButtonClick(wxCommandEvent &event) { //取编辑框中的文本并用信息框显示出来 wxString text = ((wxTextCtrl*)this->FindWindow(ID_TEXTCTRL))->GetValue();
上一篇:外企面试官最爱提的问题TOP10
下一篇:windows与unix体系结构图
|