ninesunsz的笔记 https://bbs.21ic.com/?59053 [收藏] [复制] [RSS]

日志

wxwidgets的布局控件

已有 4209 次阅读2010-4-17 23:33 |系统分类:资源宝藏| windows编程

< http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">< name="GENERATOR" content="OpenOffice.org 3.2  (Win32)">

Wxwidgets上摆放各种控件的时候,可以自己计算各个控件的位置和大小并根据窗口的调整重新计算所有控件的有关参数,然后重绘各个控件,这样会带来很大的麻烦,如果采用wxwidgets的窗口布局控件可以大大简化设计,每次窗口调整的时候sizer控件可以自动调整相关控件的尺寸,尤其在控件较多时候采用sizer的优势更明显。


Wxsizer不是从窗口推导出来的,他相当于一个容器。在这个容器内部还可以放置其他的容器,这个容器内部的各个控件不是把sizer当成他们的父窗口,而是把顶层的dialog作为父窗口。


Wxwidgets共有5sizer。所有sizer的基类都是wxsizer,其作用和java中的awt功能类似,他们是wxboxsizer,wxstaticboxsizer,wxgridsizer,wxflexgridsizer,wxgridbagsizer。所有的zier都有如下共同点:1.最小的尺、2.边界、3对齐方式、4.伸缩因子。最小尺寸是由窗口计算的,如果不想采用窗口默认的尺寸,可以用wx_FixedMinsize这个参数。边界是指各个控件之间的空白区域。对齐的方式包括水平,垂直等各个方向。伸缩因子是指在sizer调整尺寸的时候各个控件是否改变初始尺寸的大小,如果设为0,则控件变化的时候不改变控件尺寸,否则根据尺寸的伸展,控件会自动调整初始的尺寸。伸缩因子参数的名字是proportion.


在窗口创建的时候可以同时创建一个sizer.
sizer
的尺寸可以用fit来调整。如果想在重新缩放的时候不小于初始尺寸,可以用setsizehints这个函数。wxsizer的一个添加控件的函数为wxSizerItem*
Add
(wxWindow*
window,
int
proportion
= 0
,int
flag
= 0
,
int
border
= 0
,wxObject*
userData
= NULL
)
wxSizerItem*
Add
(wxSizer*
sizer,
const
wxSizerFlags&
flags)
,前置可以用于添加一个控件,后者可以添加一个sizer.
各个控件之间的空白可以用函数addspacer(int
size)
addstrecthspacer(int
proportion)
来实现。WxSizerFlags这个类把border,alignproprtion几个属性都封装在一起了。


wxBoxsizer布局比较简单。内部的控件只能单行排列,排列方向为水平或者垂直。Wxstaticsizer类继承自wxboxsizer,他只是在控件外面加了一个staticbox.


wxgridesizer可以看成是wxboxsizer的扩展,wxboxsize是一维的,而wxgridsizer顾名思义grid是两维的,wxgridsizer在创建的时候需要指明行数和列数以及行间距和列间距,在摆放控件的时候放到对应的位置就可以了,wxflexgridsizegridsizer的不同在于flex的所有行和列的高度和宽度不一定都要一样,可以发生变化。Wxgridsizer另一个变化是wxgridbagsizer,它的控件摆放可以跨行或者列。下面的图是wxwidgets自带关于layout的例子


对应的源程序和解释如下为


wxBoxSizer
*topsizer = new wxBoxSizer( wxVERTICAL );


首先创建了一个boxsizer,排列方向为垂直方向


  topsizer->Add(


    new
wxStaticText( p, wxID_ANY, _T("An explanation (wxALIGN_RIGHT).")
),


   
wxSizerFlags().Align(wxALIGN_RIGHT).Border(wxALL
& ~wxBOTTOM, 5));


这是第一行的statictext,它是右对齐的


  topsizer->Add(


    new
wxTextCtrl( p, wxID_ANY, _T("My text (wxEXPAND)."),
wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE),


   
wxSizerFlags(1).Expand().Border(wxALL,
5));


  
接着加入的是第二行的textctrl控件,它的伸缩因子不向第一行是0.而是1.


  wxBoxSizer
*statsizer = new wxStaticBoxSizer(


    new
wxStaticBox(p, wxID_ANY, _T("A wxStaticBoxSizer")),
wxVERTICAL );


  statsizer->Add(


    new
wxStaticText(p, wxID_ANY, _T("And some TEXT inside it")),


   
wxSizerFlags().Center().Border(wxALL,
30));


  topsizer->Add(


    statsizer,


   
wxSizerFlags(1).Expand().Border(wxALL,
10));



接着加入了一个staticsizerstaticsize内部有一个statictext.


   


    wxGridSizer
*gridsizer = new wxGridSizer(2, 5, 5);


   
gridsizer->Add(new
wxStaticText(p, wxID_ANY, _T("Label")),


                  
wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL));


   
gridsizer->Add(new
wxTextCtrl(p, wxID_ANY, _T("Grid sizer demo")),


                  
wxSizerFlags(1).Align(wxGROW
| wxALIGN_CENTER_VERTICAL));


   
gridsizer->Add(new
wxStaticText(p, wxID_ANY, _T("Another label")),


                  
wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL));


   
gridsizer->Add(new
wxTextCtrl(p, wxID_ANY, _T("More text")),


                  
wxSizerFlags(1).Align(wxGROW
| wxALIGN_CENTER_VERTICAL));


   
gridsizer->Add(new
wxStaticText(p, wxID_ANY, _T("Final label")),


                  
wxSizerFlags().Align(wxALIGN_RIGHT
| wxALIGN_CENTER_VERTICAL));


   
gridsizer->Add(new
wxTextCtrl(p, wxID_ANY, _T("And yet more text")),


                  
wxSizerFlags().Align(wxGROW
| wxALIGN_CENTER_VERTICAL));


    topsizer->Add(


        gridsizer,


      
wxSizerFlags().Proportion(1).Expand().Border(wxALL,
10));


随后加入的是一个22列的gridsizer,这个gridsizer的行和列间距都是5


#if
wxUSE_STATLINE


  //
3) middle: create wxStaticLine with minimum size (3x3)


  topsizer->Add(


     new
wxStaticLine( p, wxID_ANY, wxDefaultPosition, wxSize(3,3),
wxHORIZONTAL),


   
wxSizerFlags().Expand());


#endif
// wxUSE_STATLINE


这一部分加入的是一行static
line


  //
4) bottom: create two centred wxButtons


  wxBoxSizer
*button_box = new wxBoxSizer( wxHORIZONTAL );


  button_box->Add(


     new
wxButton( p, wxID_ANY, _T("Two buttons in a box") ),


   
wxSizerFlags().Border(wxALL,
7));


  button_box->Add(


     new
wxButton( p, wxID_ANY, _T("(wxCENTER)") ),


   
wxSizerFlags().Border(wxALL,
7));






topsizer->Add(button_box,
wxSizerFlags().Center());





最后加入的是两个button.


p->SetSizer(
topsizer );





  //
don't allow  to get smaller than what the sizers tell it and
also set


  //
the initial size as calculated by the sizers



topsizer->SetSizeHints(
this );



有了sizer这个组件,放置控件的工作简化了不少,尤其在要求控件对齐的情况下,用sizer会很方便,另外sizer也可以像搭积木一样做出各种想要的界面。


  如果想学习wxwidgets当然少不了网站
www.wxwidgets.org,
而Cross-Platform
GUI Programming with wxWidgets
也是一本非常好的书。在很多网站都有它的pdf版本下载









路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)