以文本方式查看主题

-  中文XML论坛 - 专业的XML技术讨论区  (http://bbs.xml.org.cn/index.asp)
--  『 Dot NET,C#,ASP,VB 』  (http://bbs.xml.org.cn/list.asp?boardid=43)
----  C#中的版面管理器  (http://bbs.xml.org.cn/dispbbs.asp?boardid=43&rootid=&id=11778)


--  作者:admin
--  发布时间:11/9/2004 2:25:00 AM

--  C#中的版面管理器


发信人: walts (小天堂), 信区: DotNET        
标  题: C#中的版面管理器  
发信站: BBS 水木清华站 (Sat May  5 16:48:37 2001)


当程序员准备设计一个GUI(图形用户界面)的时候,他将面对许多特殊的问题:
视觉效果、可伸缩性、可调整的性能、修改便利性等等。版面管理器通过设置版
面化对象的大小和位置帮助你解决了这些问题,同时其本身也是版面化的。Java
程序员对版面管理器的概念应该是比较熟悉的,但从其它编程背景中转到 C# 的
程序员可能需要对此逐渐熟悉

何为版面管理器


版面管理器能够决定版面化对象的尺寸和大小。版面管理器是可以用在任何场合的,
不过它最广泛的应用还是在GUI设计中。近些年出现的一些工具(其中大多数是基于
Borland的伟大的 C++ 系列)使得GUI的设计更加简单,但即使是这样,GUI设计还是
一个较复杂的问题。对于那些想使这个问题简单化或是想更直接控制版面的人,版面
管理器应该是一个较好的解决之道。版面管理器为程序员的设计带来了许多实在的帮
助,通过使用版面管理器的嵌套和区域管理,几乎所有的配置都成为可能。另外,版
面管理器还能帮助程序员解决 GUI开发中一些“令人讨厌的部分,比如调整尺寸、正
常版面、可伸缩性,让程序员能够将更多的时间集中于设计哪些更有意义的部分。  


Java和 C#中版面管理器的区别  


Java中的版面管理器与在C#中执行的版面管理器主要有两个区别。首先,在 Java中,
版面管理器只是纯粹被用在图形用户界面的区域,即只有组件可以用版面管理器来排
版。在C#的版面管理器中,所有执行ILayoutable界面的对象都可以进行排版,这样
就在图形及地图设计等领域中提供了更多设计上的可能性。第二个不同与第一个有关。
由于这里执行的版面管理器并不直接受GUI对象的约束,而只是编排版面化对象的抽象
概念,因此就有可能将版面管理器用于母控制的独特区域。你可以在母控制中指定一个
矩形区域,给它一个版面管理器,向它增加子控制。如此,我们不但拥有了哪些Java中
的标准版面管理器操作外,还为GUI设计带来了难以置信的威力。  



如何使用版面库  
它基于两个界面:Ilayoutable和 IlayoutManager,后者是对
Ilayoutable的扩展。库的其余部分包括这两个界面对 GUI 设计的
特殊问题的执行。  

ControlBox:这是控件版面结构的基础,是Controls的基础包装类。  
ContainerBox:从ControlBox中继承而来,能够增加其它 ControlBoxes 并布置它们。  
AreaPane:从ContainerBox中继承而来,其作用相当于最高级别面板。它在一个矩形区
域中布置了被添加到其中的各种控件。  
ResizeablePane:从 AreaPane中继承而来,唯一的不同是它总是调整到其母控件的客
户端尺寸。

eg.

public class CalculatorForm : Form
{
public CalculatorForm()
{
Size = new Size(200, 250);
Text = "Calculator";
myCalculator = new Calculator();

//This will be the top-level pane to which all other controls will be added
//and which also resizes as the Form is resized.

AreaPane controlPane = new ResizeablePane(this, ClientRectangle, new BorderLayout());
myTextBox = new TextBox();
myTextBox.Text = "0";

//Notice that the control is added to the pane. ContainerBoxes will
//add all controls which are added to them to their boxed control automatically.
controlPane.Add(myTextBox, BorderLayout.Direction.North);

Panel p = new Panel();

//Since buttonPane will have other controls added to it, it is wrapped in
//a ContainerBox.

ContainerBox buttonPane = new ContainerBox(p);
addButtons(buttonPane);
Button clearB = new Button();
clearB.Text = "Clear";
clearB.Click += new EventHandler(clear);
controlPane.Add(clearB, BorderLayout.Direction.South);
controlPane.Add(buttonPane, BorderLayout.Direction.Center);
}

private void addButtons(ContainerBox pane)
{
pane.layoutManager = new GridLayout(4, 3);
for(int i=1; i<10; i++){
Button b = getDigitButton(i);
pane.Add(b);
}
Button zero = getDigitButton(0);
Button plus = getButton("+");
Button minus = getButton("-");
plus.Click += new EventHandler(action);
minus.Click += new EventHandler(action);
pane.Add(plus);
pane.Add(zero);
pane.Add(minus);
}
//private methods called by the constructor
//...
}  

库中提供的还有一些样本版面:  

BorderLayout:允许5个不同的版面化对象,在北、南、东、西和中央各一个。所有组件
的大小都被压缩了,北和南在垂直方向上尽可能小,在水平方向上尽可能大。而西和东
在水平方向上尽可能小,在垂直方向上尽可能大。中心的版面化对象则填充了剩余的空间。  
GridLayout:用了一些行和列,创建一个栅格,用户可以向其中增加控件。栅格中的每个
成员大小都相同,按照它们增加的顺序,从左到右沿着行分布。  
FlowLayout:试图向一个水平行中增加控件,一旦这行对于容器的宽度来说太大了,就开
始新的一行。可以向左、中央和右看齐。  
在 GUI 创建中使用这些类是很简单的。当创建一个其中包含其它控件的控件时,将其包装
在一个 ContainerBox中,设置盒子的版面,然后向盒子中增加所有的子控件。唯一没有增
加到ContainerBox中的控件是最顶部级别的控件,它通常是一个表单,被包装在一个
AreaPane或一个 ResizeablePane中。一个ResizeablePane将采用其母控件的形状,但是一
个AreaPane 则是所指定区域的形状。  


--

※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.142.76]
上一篇
返回上一页
回到目录
回到页首
下一篇



--  作者:xmzhy
--  发布时间:12/27/2004 5:15:00 PM

--  

W 3 C h i n a ( since 2003 ) 旗 下 站 点
苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
39.063ms