在这一章中,我们将展示几个关于控件的小例子,控件组成了我们的应用程序,wxWidgets中包含了大量有用的控件。控件被定义为一个GUI的基本对象,widget这个词通常在UNIX系统上使用,在windows系统上一个控件通常被叫做control。
wxCheckBox
wxCheckBox是一个有两个状态的控件,选中/未选中。它看起来是一个选框和一个标签,这个标签可以被设置在选框的左边或者右边,如果这个选框被选中,在这选框中会有一个√标记,一个wxCheckBox可以用来控制在启动时显示或隐藏LOGO,显示或隐藏一个工具栏,等等。
checkbox.h
1 |
|
checkbox.cpp
1 |
|
在我们的例子中,我们显示了一个checkbox,我们通过这个选框来显示或隐藏主窗口的标题。
m_cb = new wxCheckBox(panel, ID_CHECKBOX, _T(“Show title”), wxPoint(200 / 2, 80 / 2));
m_cb->SetValue(true);
我们创建了一个checkbox,并调用SetValue()方法,设置默认为选中状态。
Connect(ID_CHECKBOX, wxEVT_COMMAND_CHECKBOX_CLICKED,
wxCommandEventHandler(CheckBox::OnToggle));
如果我们点击了这个选框,一个wxEVT_COMMAND_CHECKBOX_CLICKED事件产生,我们把这个事件同OnToggle()方法关联起来。
if(m_cb->GetValue())
{
this->SetTitle(_T(“CheckBox”));
}
else
{
this->SetTitle(_T(“”));
}
在OnToggle()方法内,我们检查了checkbox的状态,如果是选中状态,我们把标题设置为”CheckBox”,如果是未选中,我们隐藏标题字符串。
wxBitmapButton
一个位图按钮是一个特殊的按钮,它的主体是一张图片。一个位图按钮上的图片可以随意设置。下面我们可以为三种音量状态指定不同的图片。
bitmapbutton.h
1 |
|
bitmapbutton.cpp
1 |
|
在我们的例子中,我们创建了一个滑块和一个位图按钮,我们通过拖动滑块改变按钮的图标来模仿了一个音量控制器。
wxImage::AddHandler(new wxPNGHandler);
我们将要用到PNG图片,所以我们初始化了PNG图像处理模块。
button = new wxBitmapButton(panel, wxID_ANY, wxBitmap(_T(“muted.png”), wxBITMAP_TYPE_PNG), wxPoint(180, 20));
我们创建了一个位图按钮,我们指定了位图的类型wxBITMAP_TYPE_PNG
pos = slider->GetValue();
我们获取了滑块的数据,使用这个数据来设置按钮上的不同图标,我们有四种音量:静音、最低、中等、最大。我们使用SetBitmapLabel()方法来改变按钮上的图片。
)
wxToggleButton
wxToggleButton是一个有两种状态的按钮:按下或未按下,你可以通过点击这个按钮在这两种状态间切换。在有些情况下这种功能非常有用。
togglebutton.h
1 |
|
togglebutton.cpp
1 |
|
在我们的例子中,我们显示了三个开关按钮和一个panel,我们把panel的 背景色设置为黑色,通过开关按钮来显示红色绿色和蓝色,背景色会根据不同开关按钮的状态发生改变。
colour = new wxColour(0, 0, 0);
这是一个颜色值的初始化,RGB=#000000表示黑色,理论上来说黑色不是一种颜色orz
m_tgbutton1 = new wxToggleButton(panel, ID_TGBUTTON1, _T(“Red”), wxPoint(20, 20));
这里我们创建了一个开关按钮。
Connect(ID_TGBUTTON1, wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
wxCommandEventHandler(ToggleButton::OnToggleRed));
如果我们点击了一个开关按钮,一个wxEVT_COMMAND_TOGGLEBUTTON_CLICKED事件产生,我们把处理函数和这个事件连接起来。注意,我们也可以不把这个事件同开关按钮的处理函数连接,而是连接到wxFrame组件(这个开关按钮的父亲组件),因为事件指令会传递到父控件,在我们的例子中就是,toggle button→panel→frame。如果我们想把这个事件连接到按钮我们应该派生出自己的按钮类,这意味着更多的代码。
if(colour->Red())
{
colour->Set(0, green, blue);
}
else
{
colour->Set(255, green, blue);
}
在事件处理函数中我们指定了不同的wxColour参数。
m_panel->SetForegroundColour(colour->GetAsString());
我们设置了panel的背景色
最后不要忘了刷新背景,原教程中由于没有刷新背景,害我找了1小时的错。。。坑爹啊,不知道原作者是怎么运行出来的,难道Linux会自己刷新?。。
Refresh();
刷新背景
wxStaticLine
这个组件在窗口内显示一条简单的线段,它可是水平的也可以是垂直的。
staticline.h
1 |
|
staticline.cpp
1 |
|
在这个例子中,我们显示了欧洲的国家和它们有的人口,使用wxStaticLine使得界面看上去更友好。
wxStaticLine * sl1 = new wxStaticLine(this, wxID_ANY, wxPoint(25, 50), wxSize(300,1));
这里我们创建了一个水平的分隔线,宽度为300像素,高度为1像素。
wxStaticText
一个wxStaticText组件可以显示一行或多行只读的文本。
statictext.h
1 |
|
statictext.cpp
1 |
|
在我们的例子中,我们显示了巴拉巴拉。。。
wxStaticText * st = new wxStaticText(panel, wxID_ANY, text, wxPoint(10, 10), wxDefaultSize, wxALIGN_CENTRE);
这里我们创建了一个wxStaticText组件,静态文本内容被放置在中央。
wxSlider
wxSlider是一个有一个简单控件的组件,这个控件可以被来回拖动。有些时候使用一个滑块比提供一个数字旋钮(wxSpinCtrl)更加自然。
slider.h
1 |
|
slider.cpp
1 |
|
在我们的例子中,我们显示了一个滑块控件。我们通过拖动这个滑块来改变panel的背景色,在这种类型的程序中,使用一个滑块比一个数字旋钮方便的多。
slider = new wxSlider(this, ID_SLIDER, 0, 0, 140, wxPoint(50, 30), wxSize(-1, 140), wxSL_VERTICAL);
我们创建了一个垂直滑块,初值为0,最小值是0,最大值为140,我们没有显示标尺。
Connect(ID_SLIDER, wxEVT_COMMAND_SLIDER_UPDATED, wxScrollEventHandler(MyPanel::OnScroll));
这里我们把wxEVT_COMMAND_SLIDER_UPDATED事件同OnScroll()方法连接起来。
Connect(wxEVT_PAINT, wxPaintEventHandler(MyPanel::OnPaint));
我们也要画一些图案,所以我们把OnPaint()方法和wxEVT_PAINT事件连接起来。
fill = slider->GetValue();
Refresh();
在OnScroll()方法中,我们获得了滑块当前的值,我们调用Refresh()方法产生了一个wxEVT_PAINT方法。
dc.DrawRectangle(wxRect(140, 30, 80, 140));
wxBrush brush1(wxColour(197, 108, 0));
dc.SetBrush(brush1);
dc.DrawRectangle(wxRect(140, 30, 80, fill));
在OnPaint()方法里面,我们画了两个矩形,第一个是灰色边框的白色矩形,第二个是一个褐色的矩形。矩形的高度由滑块的当前值fill控制。
在这一章的wxWidgets教程中,我们简要的概括了几个组件。