本教程原文链接:http://zetcode.com/gui/wxwidgets/layoutmanagement/

翻译:瓶哥

日期:2013年12月4日星期三

邮箱:414236069@qq.com

主页:http://www.cnblogs.com/pingge/

若有翻译错误或者歧义请联系我!

一个典型的应用程序由各种各样的组件组成,这些组件被放置在容器组件内。一个程序员必须要管理应用程序的界面布局,这不是一个简单的工作,在wxWidgets里面我们有两个选择:

1.使用绝对位置放置组件

2.使用布局控件

绝对位置

程序员以像素单位去指定一个组件的位置和大小,当你使用绝对位置时,你会明白以下几点:

1.当你缩放主窗口时,组件的位置和大小不会改变。

2.程序在不同的平台上看起来不同(蹩脚的)。

3.在你的程序中更改字体也许会破坏布局。

4.如果你决定改变你的布局,你必须要完全重做你的布局,这将是单调乏味且浪费时间的工作。

然而有些地方也许能够使用绝对位置去布局。例如,例如我的教程,我不想使我的例子变得太难理解,所以我经常使用绝对位置布局来解释一些主题。但是,在真正的应用程序中,程序员通常使用布局控件。

在我们的例子中,我们有一个简单的文本编辑器的骨架,如果我们缩放主窗口,wxTextCtrl这个组件的大小不会像我们预期的那样去改变。

调整大小之前

调整大小之后

absolute.h

  1. #include <wx/wx.h>
  2.  
  3. class Absolute : public wxFrame
  4. {
  5. public:
  6. Absolute(const wxString & title);
  7.  
  8. wxMenuBar * menubar;
  9. wxMenu * file;
  10. wxMenu * edit;
  11. wxMenu * help;
  12. wxTextCtrl * textctrl;
  13. };

absolute.cpp

  1. #include "absolute.h"
  2.  
  3. Absolute::Absolute(const wxString & title)
  4. : wxFrame(NULL, -, title, wxPoint(-, -), wxSize(, ))
  5. {
  6. wxPanel * panel = new wxPanel(this, wxID_ANY);
  7.  
  8. menubar = new wxMenuBar;
  9. file = new wxMenu;
  10. edit = new wxMenu;
  11. help = new wxMenu;
  12.  
  13. menubar->Append(file, _T("&File"));
  14. menubar->Append(edit, _T("&Edit"));
  15. menubar->Append(help, _T("&Help"));
  16.  
  17. SetMenuBar(menubar);
  18.  
  19. textctrl = new wxTextCtrl(panel, -, _T(""), wxPoint(-, -), wxSize(, ));
  20.  
  21. Centre();
  22. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "absolute.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. Absolute * absolute = new Absolute(_T("Absolute"));
  9. absolute->Show(true);
  10.  
  11. return true;
  12. }

这是一个使用绝对位置布局的例子,我们把一个wxTextCtrl组件放置在一个面板组件中。

Textctrl = new wxTextCtrl(panel, -1, _T(""), wxPoint(-1, -1), wxSize(250, 150));

我们在wxTextCtrl组件的构造函数中完成了绝对位置布局,在我们的例子中,我们把它放置在默认的位置,指定宽度250px和高度150px。

使用布局控件

wxWidgets里面的布局控件处理关于组件的位置的所有问题。

我们能够在以下这些布局控件中选择:

1.wxBoxSizer

2.wxStaticBoxSizer

3.wxGridSizer

4.wxFlexGridSizer

5.wxGridBagSizer

调整大小之前

调整大小之后

sizer.h

  1. #include <wx/wx.h>
  2.  
  3. class Sizer : public wxFrame
  4. {
  5. public:
  6. Sizer(const wxString & title);
  7.  
  8. wxMenuBar * menubar;
  9. wxMenu * file;
  10. wxMenu * edit;
  11. wxMenu * help;
  12. wxTextCtrl * textctrl;
  13. };

sizer.cpp

  1. #include "sizer.h"
  2.  
  3. Sizer::Sizer(const wxString & title)
  4. : wxFrame(NULL, -, title, wxPoint(-, -), wxSize(, ))
  5. {
  6. menubar = new wxMenuBar;
  7. file = new wxMenu;
  8. edit = new wxMenu;
  9. help = new wxMenu;
  10.  
  11. menubar->Append(file, _T("&File"));
  12. menubar->Append(edit, _T("&Edit"));
  13. menubar->Append(help, _T("&Help"));
  14. SetMenuBar(menubar);
  15.  
  16. textctrl = new wxTextCtrl(this, -, _T(""), wxPoint(-, -), wxSize(, ));
  17.  
  18. Centre();
  19. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "sizer.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. Sizer * sizer = new Sizer(_T("Sizer"));
  9. sizer->Show(true);
  10.  
  11. return true;
  12. }

wxBoxSizer

这个布局控件允许我们把多个组件放在一行或者一列上,我们能在一个布局控件中放入另一个布局控件。这种设计使得我们能够设计非常复杂的布局。

wxBoxSizer(int orient)

wxSIzerItem * Add(wxWindow * window, int proportion = 0, int flag = 0, int border = 0)

参数orient可以是wxVERTICAL或者wxHORIZONTAL。通过Add()方法添加组件到wxBoxSizer内,为了能够更好的理解它,我们需要看它的参数。

参数proportion定义了组件在指定的排列方向内自由缩放的比例,让我们假定有三个按钮,它们的proportion分别是0、1、2

它们被添加进一个水平布局控件

proportion = 0的按钮始终都不会改变,proportion = 2的按钮会比proportion = 1的按钮在水平尺寸上多缩放一倍的尺寸。

有了flag参数你能够进一步设置wxBoxSizer内的组件的行为,我们能够控制两个组件之间的边界距离,我们可以在两个组件之间填充一些空白像素。为了显示边框,我们需要定义哪个方向上的边框需要使用。我们能够使用|运算符把它们组合起来,例如wxLEFT | wxBOTTOM,我们能够下面这些标志中选择:

1.wxLEFT

2.wxRIGHT

3.wxBOTTOM

4.wxTOP

5.wxALL

一个wxPanel组件周围的边框

border.h

  1. #include <wx/wx.h>
  2.  
  3. class Border : public wxFrame
  4. {
  5. public:
  6. Border(const wxString & title);
  7. };

border.cpp

  1. #include "border.h"
  2.  
  3. Border::Border(const wxString & title)
  4. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
  5. {
  6. wxColor col1, col2;
  7. col1.Set(_T("#4F5049"));
  8. col2.Set(_T("#EDEDED"));
  9.  
  10. wxPanel * panel = new wxPanel(this, -);
  11. panel->SetBackgroundColour(col1);
  12.  
  13. wxPanel * midPan = new wxPanel(panel, wxID_ANY);
  14. midPan->SetBackgroundColour(col2);
  15.  
  16. wxBoxSizer * vbox = new wxBoxSizer(wxVERTICAL);
  17. vbox->Add(midPan, , wxEXPAND | wxALL, );
  18. panel->SetSizer(vbox);
  19.  
  20. Centre();
  21. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "border.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. Border * border = new Border(_T("Border"));
  9. border->Show(true);
  10.  
  11. return true;
  12. }

在这个例子中,我们创建了两个panels,第二个panel在其自身周围有一圈空白。

Box->Add(midPan, 1, wxEXPAND | wxALL, 20);

我们在midPan这个panel周围放置了宽度为20px的边框,wxALL表示边框适用于全部四个方向。如果我们使用wxEXPAND标识,这个组件会在允许的边框内扩展到最大。

最后,我们也可以定义组件的对齐标识,我们使用以下标识去定义:

1.wxALIGN_LEFT

2.wxALIGN_RIGHT

3.wxALIGN_TOP

4.wxALIGN_BOTTOM

5.wxALIGN_CENTER_VERTICAL

6.wxALIGN_CENTER_HORIZONTAL

7.wxALIGN_CENTER

接下来我们把两个按钮放置到窗口的右下角:

align.h

  1. #include <wx/wx.h>
  2.  
  3. class Align : public wxFrame
  4. {
  5. public:
  6. Align(const wxString & title);
  7. };

align.cpp

  1. #include "align.h"
  2.  
  3. Align::Align(const wxString & title)
  4. : wxFrame(NULL, -, title, wxPoint(-, -), wxSize(, ))
  5. {
  6. wxPanel * panel = new wxPanel(this, -);
  7.  
  8. wxBoxSizer * vbox = new wxBoxSizer(wxVERTICAL);
  9. wxBoxSizer * hbox1 = new wxBoxSizer(wxHORIZONTAL);
  10. wxBoxSizer * hbox2 = new wxBoxSizer(wxHORIZONTAL);
  11.  
  12. wxButton * ok = new wxButton(panel, wxID_ANY, _T("OK"));
  13. wxButton * cancel = new wxButton(panel, wxID_ANY, _T("Cancel"));
  14.  
  15. hbox1->Add(new wxPanel(panel, wxID_ANY));
  16. hbox2->Add(ok);
  17. hbox2->Add(cancel);
  18.  
  19. vbox->Add(hbox1, , wxEXPAND);
  20. vbox->Add(hbox2, , wxALIGN_RIGHT | wxRIGHT | wxBOTTOM, );
  21. panel->SetSizer(vbox);
  22.  
  23. Centre();
  24. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "align.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. Align * align = new Align(_T("Align"));
  9. align->Show(true);
  10.  
  11. return true;
  12. }

我们创建了三个布局控件,一个垂直控件和两个水平控件。我们把这两个水平布局控件放置到垂直布局控件中。

Hbox->Add(new wxPanel(panel, wxID_ANY));

Vbox->Add(hbox, 1, wxEXPAND);

我们把一个wxPanel放置在第一个水平控件中,我们把缩放因子设置为1并且设置了wxEXPAND标识,这样做这个布局控件就会占据除了hbox2之外的所有空间。

Vbox->Add(hbox2, 0, wxALIGN_RIGHT | wxRIGHT | wxBOTTOM, 10);

我们把两个按钮放置在hbox2这个控件中,在hbox2中的控件是右对齐排列的,而且我们在这两个按钮的底部和右边放置了宽度为10px的空白元素。

Go To Class

在接下来的例子中,我们将介绍几个重要的观念。

gotoclass.h

  1. #include <wx/wx.h>
  2.  
  3. class GotoClass : public wxFrame
  4. {
  5. public:
  6. GotoClass(const wxString & title);
  7. };

gotoclass.cpp

  1. #include "gotoclass.h"
  2.  
  3. GotoClass::GotoClass(const wxString & title)
  4. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
  5. {
  6. wxPanel * panel = new wxPanel(this, wxID_ANY);
  7.  
  8. /**< Main sizer */
  9. wxBoxSizer * vbox = new wxBoxSizer(wxVERTICAL);
  10.  
  11. /**< hbox1 */
  12. wxBoxSizer * hbox1 = new wxBoxSizer(wxHORIZONTAL);
  13. //(*
  14. wxStaticText * st1 = new wxStaticText(panel, wxID_ANY, _T("CLass Name"));
  15. hbox1->Add(st1, , wxRIGHT, );
  16. wxTextCtrl * tc = new wxTextCtrl(panel, wxID_ANY);
  17. hbox1->Add(tc, );
  18. vbox->Add(hbox1, , wxEXPAND | wxLEFT | wxRIGHT | wxTOP, );
  19. vbox->Add(-, ); // 10 pix space
  20. //*)
  21.  
  22. /**< hbox2 */
  23. wxBoxSizer * hbox2 = new wxBoxSizer(wxHORIZONTAL);
  24. //(*
  25. wxStaticText * st2 = new wxStaticText(panel, wxID_ANY, _T("Matching classes"));
  26. hbox2->Add(st2, );
  27. vbox->Add(hbox2, , wxLEFT | wxTOP, );
  28. vbox->Add(-, );
  29. //*)
  30.  
  31. /**< hbox3 */
  32. wxBoxSizer * hbox3 = new wxBoxSizer(wxHORIZONTAL);
  33. //(*
  34. wxTextCtrl * tc2 = new wxTextCtrl(panel, wxID_ANY, _T(""),
  35. wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
  36. hbox3->Add(tc2, , wxEXPAND);
  37. vbox->Add(hbox3, , wxLEFT | wxRIGHT | wxEXPAND, );
  38. vbox->Add(-, );
  39. //*)
  40.  
  41. /**< hbox4 */
  42. wxBoxSizer * hbox4 = new wxBoxSizer(wxHORIZONTAL);
  43. //(*
  44. wxCheckBox * cb1 = new wxCheckBox(panel, wxID_ANY, _T("Case Sensitive"));
  45. hbox4->Add(cb1);
  46. wxCheckBox * cb2 = new wxCheckBox(panel, wxID_ANY, _T("Nexted Classes"));
  47. hbox4->Add(cb2, , wxLEFT, );
  48. wxCheckBox * cb3 = new wxCheckBox(panel, wxID_ANY, _T("Non-Project Classes"));
  49. hbox4->Add(cb3, , wxLEFT, );
  50. vbox->Add(hbox4, , wxLEFT, );
  51. vbox->Add(-, );
  52. //*)
  53.  
  54. /**< hbox5 */
  55. wxBoxSizer * hbox5 = new wxBoxSizer(wxHORIZONTAL);
  56. //(*
  57. wxButton * btn1 = new wxButton(panel, wxID_ANY, _T("OK"));
  58. hbox5->Add(btn1, );
  59. wxButton * btn2 = new wxButton(panel, wxID_ANY, _T("Close"));
  60. hbox5->Add(btn2, , wxLEFT | wxBOTTOM, );
  61. vbox->Add(hbox5, , wxALIGN_RIGHT | wxRIGHT, );
  62. //*)
  63.  
  64. panel->SetSizer(vbox);
  65. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "gotoclass.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. GotoClass * gotoclass = new GotoClass(_T("GotoClass"));
  9. gotoclass->Show(true);
  10.  
  11. return true;
  12. }

这是一个综合使用wxBoxSizer的例子,布局得比较紧凑,我们创建了一个垂直布局控件,然后我们把5个水平布局控件添加进去。

Vbox->Add(hbox3, 1, wxLEFT | wxRIGHT | wxEXPAND, 10);

Vbox->Add(-1, 25);

我们已经知道我们可以使用flag参数和border参数控制控件之间的间距。但是有一点很不自然,在Add()方法中我们只能给所有的方向指定同一个边界宽度。在我们的例子中,我们在右和左边缘给出10px空白,但是我们不能给底部指定25px的空白,我们所能做的只是给底部10px空白或者省略wxBOTTOM给底部0px空白。所以我们需要另一种重载的Add()方法添加一些额外的空白。

Vbox->Add(hbox5, 0, wxALIGN_RIGHT | wxRIGHT, 10);

我们把两个按钮放置到窗体的右下角,我们是如何做到的?要达到这种目的,需要注意三样东西,proportion、align flag、wxEXPAND flag,proportion参数一定要等于0,这样两个按钮就不会改变它们的大小,当我们缩放我们的主窗口的时候我们不能指定wxEXPAND标识。最后,我们必须指定wxALIGN_RIGHT标识,这个水平布局控件会从主窗体的左边扩展到右边,所以如果我们指定wxALIGN_RIGHT标识,两个按钮会被放置在右边,这恰好是我们期望的。

wxGridSizer

wxGridSizer把控件布局在一个格子中,每一个格子都有相同的大小。

wxGridSizer(int rows, int cols, int vgap, int hgap);

在构造函数中我们指定网格的行数和列数和每个格子的垂直、水平间距。

在我们的例子中我们建立了一个计算器的框架,这是一个介绍wxGridSizer的完美的例子。

gridsizer.h

  1. #include <wx/wx.h>
  2.  
  3. class GridSizer : public wxFrame
  4. {
  5. public:
  6. GridSizer(const wxString & title);
  7.  
  8. wxBoxSizer * sizer;
  9. wxGridSizer * gs;
  10. wxTextCtrl * display;
  11. };

gridsizer.cpp

  1. #include "gridsizer.h"
  2.  
  3. GridSizer::GridSizer(const wxString & title)
  4. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
  5. {
  6. sizer = new wxBoxSizer(wxVERTICAL);
  7.  
  8. display = new wxTextCtrl(this, wxID_ANY, _T(""), wxDefaultPosition, wxDefaultSize, wxTE_RIGHT);
  9.  
  10. sizer->Add(display, , wxEXPAND | wxTOP | wxBOTTOM, );
  11.  
  12. gs = new wxGridSizer(, , , );
  13.  
  14. gs->Add(new wxButton(this, -, _T("Cls")), , wxEXPAND);
  15. gs->Add(new wxButton(this, -, _T("Bck")), , wxEXPAND);
  16. gs->Add(new wxStaticText(this, -, _T("")), , wxEXPAND);
  17. gs->Add(new wxButton(this, -, _T("Close")), , wxEXPAND);
  18.  
  19. gs->Add(new wxButton(this, -, _T("")), , wxEXPAND);
  20. gs->Add(new wxButton(this, -, _T("")), , wxEXPAND);
  21. gs->Add(new wxButton(this, -, _T("")), , wxEXPAND);
  22. gs->Add(new wxButton(this, -, _T("/")), , wxEXPAND);
  23. gs->Add(new wxButton(this, -, _T("")), , wxEXPAND);
  24. gs->Add(new wxButton(this, -, _T("")), , wxEXPAND);
  25. gs->Add(new wxButton(this, -, _T("")), , wxEXPAND);
  26. gs->Add(new wxButton(this, -, _T("*")), , wxEXPAND);
  27. gs->Add(new wxButton(this, -, _T("")), , wxEXPAND);
  28. gs->Add(new wxButton(this, -, _T("")), , wxEXPAND);
  29. gs->Add(new wxButton(this, -, _T("")), , wxEXPAND);
  30. gs->Add(new wxButton(this, -, _T("-")), , wxEXPAND);
  31. gs->Add(new wxButton(this, -, _T("")), , wxEXPAND);
  32. gs->Add(new wxButton(this, -, _T(".")), , wxEXPAND);
  33. gs->Add(new wxButton(this, -, _T("=")), , wxEXPAND);
  34. gs->Add(new wxButton(this, -, _T("+")), , wxEXPAND);
  35.  
  36. sizer->Add(gs, , wxEXPAND);
  37. SetSizer(sizer);
  38.  
  39. SetMinSize(wxSize(, ));
  40.  
  41. Centre();
  42. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "gridsizer.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. GridSizer * gs = new GridSizer(_T("GridSizer"));
  9. gs->Show(true);
  10.  
  11. return true;
  12. }

在我们的例子中,我们为wxFrame建立一个垂直布局控件,我们把一个静态文本和一个网格布局控件放进垂直布局控件。

注意我们是如何在Bck和Close按钮之间添加空白的,我们只是简单的添加了一个空的wxStaticText,这是一个很常用的技巧。

gs->Add(new wxButton(this, -1, _T("Cls")), 0, wxEXPAND);

我们调用Add()方法许多次,组件被顺序放置进网格布局控件,第一行被放满,第二行,第三行同样。

wxFlexGridSizer

这个布局控件和wxGridSizer有点相似,它同样把组件布局到有两个尺寸的格子中,但是它添加了一些灵活性,wxGridSizer的格子都是相同大小的,在wxFlexSizer中所有的格子在一行上有相同的高度,一列上有相同的宽度,但是所有的行和列不一定有相同的高度和宽度。

wxFlexGridSize(int rows, int cols, int vgap, int hgap);

rows和cols指定了布局控件中的行数和列数。vgap和hgap在组件之间两个方向上添加了一些空白。

许多时候程序员需要开发一个对话框用来进行数据录入火修改,我发现wxFlexGridSIzer很适合这个任务,一个程序员可以使用这个布局控件轻松的创建一个对话框,使用wxGridSizer或许同样可以完成这个任务,但是这样会影响美观,因为每一个网格的大小都一样会显得很不自然。

flexgridsizer.h

  1. #include <wx/wx.h>
  2.  
  3. class FlexGridSizer : public wxFrame
  4. {
  5. public:
  6. FlexGridSizer(const wxString & title);
  7. };

flexgridsizer.cpp

  1. #include "flexgridsizer.h"
  2.  
  3. FlexGridSizer::FlexGridSizer(const wxString & title)
  4. : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(, ))
  5. {
  6. wxPanel * panel = new wxPanel(this, wxID_ANY);
  7.  
  8. wxBoxSizer * hbox = new wxBoxSizer(wxHORIZONTAL);
  9.  
  10. wxFlexGridSizer * fgs = new wxFlexGridSizer(, , , );
  11.  
  12. wxStaticText * thetitle = new wxStaticText(panel, wxID_ANY, _T("Title"));
  13. wxStaticText * author = new wxStaticText(panel, wxID_ANY, _T("Author"));
  14. wxStaticText * review = new wxStaticText(panel, wxID_ANY, _T("Review"));
  15.  
  16. wxTextCtrl * tc1 = new wxTextCtrl(panel, wxID_ANY);
  17. wxTextCtrl * tc2 = new wxTextCtrl(panel, wxID_ANY);
  18. wxTextCtrl * tc3 = new wxTextCtrl(panel, wxID_ANY, _T(""),
  19. wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE);
  20.  
  21. fgs->Add(thetitle);
  22. fgs->Add(tc1, , wxEXPAND);
  23. fgs->Add(author);
  24. fgs->Add(tc2, , wxEXPAND);
  25. fgs->Add(review, , wxEXPAND);
  26. fgs->Add(tc3, , wxEXPAND);
  27.  
  28. fgs->AddGrowableRow(, );
  29. fgs->AddGrowableCol(, );
  30.  
  31. hbox->Add(fgs, , wxALL | wxEXPAND, );
  32. panel->SetSizer(hbox);
  33. Centre();
  34. }

main.h

  1. #include <wx/wx.h>
  2.  
  3. class MyApp : public wxApp
  4. {
  5. public:
  6. virtual bool OnInit();
  7. };

main.cpp

  1. #include "main.h"
  2. #include "flexgridsizer.h"
  3.  
  4. IMPLEMENT_APP(MyApp)
  5.  
  6. bool MyApp::OnInit()
  7. {
  8. FlexGridSizer * fgs = new FlexGridSizer(_T("FlexGridSizer"));
  9. fgs->Show(true);
  10.  
  11. return true;
  12. }

在我们的例子中我们创建了一个简单的对话框,它可以用来把数据插入到数据库。

wxBoxSizer * hbox = new wxBoxSizer(wxHORIZONTAL);

Hbox->Add(fgs, 1, wxALL | wxEXPAND, 15);

我们创建了一个水平布局控件,用来在组件的边界制造出15px的空白。

fgs->Add(thetitle);

我们像使用wxGridSizer一样把组件添加进布局控件。

fgs->AddGrowableRow(2, 1);

fgs->AddGrowableCol(1, 1);

我们让第三行和第二列成为可扩展的,这样当主窗口缩放时,第三个多行文本控件就可以自动扩展。前两个文本控件会在水平方向自动扩展,第三个会在两个方向自动扩展,我们必须使用wxEXPAND确保它们正常工作。

这一章的wxWidgets教程介绍了如何管理布局。

[ZETCODE]wxWidgets教程五:布局管理的更多相关文章

  1. [ZETCODE]wxWidgets教程七:对话框

    本教程原文链接:http://zetcode.com/gui/wxwidgets/dialogs/ 翻译:瓶哥 日期:2013年12月9日星期一 邮箱:414236069@qq.com 主页:http ...

  2. [ZETCODE]wxWidgets教程四:菜单栏和工具栏

    本教程原文链接:http://zetcode.com/gui/wxwidgets/menustoolbars/ 翻译:瓶哥 日期:2013年11月28日星期四 邮箱:414236069@qq.com ...

  3. [ZETCODE]wxWidgets教程八:组件专题1

    本教程原文链接:http://zetcode.com/gui/wxwidgets/widgets/ 翻译:瓶哥 日期:2013年12月12日星期四 邮箱:414236069@qq.com 主页:htt ...

  4. [ZETCODE]wxWidgets教程六:事件处理

    本教程原文链接:http://zetcode.com/gui/wxwidgets/events/ 翻译:瓶哥 日期:2013年12月7号星期六 邮箱:414236069@qq.com 主页:http: ...

  5. [ZETCODE]wxWidgets教程三:第一个窗体程序

    本教程原文链接:http://zetcode.com/gui/wxwidgets/firstprograms/ 翻译:瓶哥 日期:2013年11月27日星期三 邮箱:414236069@qq.com ...

  6. PyQT5速成教程-3 布局管理

    本文由 沈庆阳 所有,转载请与作者取得联系! 布局(Layout)管理 Qt Designer中,在工具箱中最上方可以看到有4种布局.分别是垂直布局.水平布局.栅格布局和表单布局.   四种布局 布局 ...

  7. [Tkinter 教程12] 布局管理 (Pack Place Grid)

    简介: 本文讲述如何使用 tkinter 的布局管理 (被称作 layout managers 或 geometry managers). tkinter 有三种布局管理方式: pack grid p ...

  8. [ZETCODE]wxWidgets教程九:组件专题2

    本教程原文链接:http://zetcode.com/gui/wxwidgets/widgetsII/ 翻译:瓶哥 日期:2013年12月15日星期日 邮箱:414236069@qq.com 主页:h ...

  9. [ZETCODE]wxWidgets教程二:辅助类

    本教程原文链接:http://zetcode.com/gui/wxwidgets/helperclasses/ 翻译:瓶哥 日期:2013年11月27日星期三 邮箱:414236069@qq.com ...

随机推荐

  1. Android从服务端获取json解析显示在客户端上面

    Android从服务端获取json解析显示在客户端上面 百度经验:jingyan.baidu.com 首先说一下Json数据的最基本的特点,Json数据是一系列的键值对的集合,和XML数据来比,Jso ...

  2. hibernate中fetch lazy

    join 查询的时候,是用一条语句查处所有记录,包括关联表记录, select查出的是N+1条记录,两个都是差不多的,但是如果用了lazy=true,延迟加 载的话,select在查询时只会查出主表记 ...

  3. erlang 里的if 和 case

    case Expression of Pattern1 [when Guard1] -> Expr_seq1; Pattern2 [when Guard2] -> Expr_seq2; … ...

  4. 【收集整理】Linux下的目录讲解

    Linux下的目录介绍:在Linux系统中,一切东西都是存放在一个唯一的“虚拟文件系统”中的,这个“虚拟文件系统”是树状的结构以一个根目录开始.以文件来表示所有逻辑实体和非逻辑实体,逻辑实体指文件和目 ...

  5. Prism vs MvvmCross

    Prism vs MvvmCross 在上一篇Xamarin开发环境及开发框架初探中,曾简单提到MvvmCross这个Xamarin下的开发框架.最近又评估了一些别的,发现老牌Mvvm框架Prism现 ...

  6. Java Annotation手册

    Java Annotation手册 作者:cleverpig(作者的Blog:http://blog.matrix.org.cn/page/cleverpig) 原文:http://www.matri ...

  7. BZOJ 1629: [Usaco2007 Demo]Cow Acrobats

    Description Farmer John's N (1 <= N <= 50,000) cows (numbered 1..N) are planning to run away a ...

  8. Codeforces Round #198 (Div. 2) —— B

    B题是一个计算几何的题,虽然以前看过计算几何的ppt,但一直都没有写过: 昨晚比赛的时候本来想写的,但是怕不熟练浪费时间,太可惜了! 其实没必要选出一个最大的矩形: 以矩形的一条对角线为轴,向上或者向 ...

  9. 【Hihocoder 1167】 高等理论计算机科学 (树链的交,线段树或树状数组维护区间和)

    [题意] 时间限制:20000ms 单点时限:1000ms 内存限制:256MB 描述 少女幽香这几天正在学习高等理论计算机科学,然而她什么也没有学会,非常痛苦.所以她出去晃了一晃,做起了一些没什么意 ...

  10. 【BZOJ 1594】 [Usaco2008 Jan]猜数游戏 (二分+并查集)

    1594: [Usaco2008 Jan]猜数游戏 Description 为了提高自己低得可怜的智商,奶牛们设计了一个新的猜数游戏,来锻炼她们的逻辑推理能力. 游戏开始前,一头指定的奶牛会在牛棚后面 ...