图形界面编程(六) 分组容器和卡片容器(1)

痛定思痛。 2022-07-14 23:54 204阅读 0赞

点击打开链接

——本节介绍了如何使用分组容器(GroupBox)以及一个分组RadioButton的实例

1 分组容器

GroupBox容器使用起来就和一个基本的Panel容器一样,它不具备布局管理功能,仅仅是一个可以容纳其它控件的容器。

GroupBox的主要特点就是:该容器具有一个外观优雅的边框,并且可以具备标题文本。所以该容器的主要作用就是:将符合某一类功能特点的控件分组,使整个窗体看上去整齐一些。

不要小看了分组,让整个界面看上去井井有条是一个图形化界面产品成败的关键!

下图展示了一个用户注册界面,通过GroupBox将为数众多的控件根据功能分组。

GroupBox应用示意图图1 GroupBox应用示意图

GroupBox还有一个重要的功能:设定RadioButton控件的组别。

RadioButton控件称为单选按钮控件。这个控件具有一个bool类型的Checked属性,表示被选中和未被选中(通过一个小圆框是否有颜色来区分)。一组RadioButton控件同时只有一个可以处于被选中状态,所以称为单选按钮控件。.net Framework是这样来界定RadioButton控件的分组的:处于同一个容器内的RadioButton控件属于一组,只有一个控件可以处于被选中状态。所以我们有几组RadioButton控件,就得将它们放入多少个不同的容器中。

任何容器都可以作为分组RadioButton的依据,但界面设计者们更青睐于GroupBox容器,因为它不仅可以起到分组RadioButton的作用,还能进一步说明这一组RadioButton的含义是什么。

注意:GroupBox容器本身不具备布局管理功能,所以要想进行相对布局管理,请将GroupBox放入具备布局功能的容器中,并且在GroupBox容器内放入某种可以进行布局管理的容器。

下面我们通过一个简单的例子来说明GroupBox的使用方法,在设计例子时,我们选择了RadioButton控件作为容器内容:

界面设计示意图图2 界面设计示意图

可以看到,为了布局的合理性,我们使用一个3行1列的表格布局面板(TableLayoutPanel)来布局整个窗体。在第2、3行放入分组容器(GroupBox),为了让分组容器内的一系列单选按钮控件合理布局,在分组容器内又放置了一个流式布局面板容器(FlowLayoutPanel)。下面我们看实现代码:

Program.cs

[c-sharp] view plain copy

  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. namespace Edu.Study.Graphics.GroupBoxContainer {
  5. ///
  6. /// 主窗体类
  7. ///
  8. class MyForm : Form {
  9. // 默认字体大小
  10. private const float DEFAULT_FONT_SIZE = 40.0F;
  11. // 表格布局面板容器
  12. private TableLayoutPanel tablePane;
  13. // 表格布局面板容器第一行内的文本标签
  14. private Label textLable;
  15. // 表格布局面板容器第二行内的分组容器
  16. private GroupBox groupBox1;
  17. // 表格布局面板容器第三行内的分组容器
  18. private GroupBox groupBox2;
  19. // 分组容器1中的流式布局面板
  20. private FlowLayoutPanel flowPane1;
  21. // 分组容器2中的流式布局面板
  22. private FlowLayoutPanel flowPane2;
  23. ///
  24. /// 构造器, 初始化控件
  25. ///
  26. public MyForm() {
  27. // 设定窗体标题
  28. this.Text = “分组容器”;
  29. // 设定窗体尺寸
  30. this.Size = new Size(800, 600);
  31. /***** 设定表格布局管理器布局 *****/
  32. this.tablePane = new TableLayoutPanel();
  33. this.tablePane.Dock = DockStyle.Fill;
  34. // 表格布局面板分为3行1列
  35. this.tablePane.RowCount = 3;
  36. this.tablePane.ColumnCount = 1;
  37. // 设置第1行的样式: 固定高度, 90单位
  38. this.tablePane.RowStyles.Add(new RowStyle(SizeType.Absolute, 90.0F));
  39. // 设定2, 3行的样式,
  40. for (int i = 1; i < this.tablePane.RowCount; i++) {
  41. this.tablePane.RowStyles.Add(new RowStyle(SizeType.Percent, 50.0F));
  42. }
  43. // 设定第1列的样式
  44. this.tablePane.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
  45. this.Controls.Add(this.tablePane);
  46. /***** 初始化标签控件 *****/
  47. this.textLable = new Label();
  48. this.textLable.Text = “测试文本”;
  49. // 设置文本字体
  50. this.textLable.Font = new Font(this.Font.FontFamily, DEFAULT_FONT_SIZE);
  51. // 设定文本居中对齐
  52. this.textLable.TextAlign = ContentAlignment.MiddleCenter;
  53. this.textLable.Dock = DockStyle.Fill;
  54. // 设定标签具有3D效果边框
  55. this.textLable.BorderStyle = BorderStyle.Fixed3D;
  56. // 控件加入表格容器第1行第1列
  57. this.tablePane.Controls.Add(this.textLable, 0, 0);
  58. /***** 设定分组容器1 *****/
  59. this.groupBox1 = new GroupBox();
  60. this.groupBox1.Dock = DockStyle.Fill;
  61. // 设定分组容器左上角文字
  62. this.groupBox1.Text = “选项1”;
  63. // 容器加入表格容器第2行第1列
  64. this.tablePane.Controls.Add(this.groupBox1, 0, 1);
  65. /***** 设定流式布局面板容器1 *****/
  66. this.flowPane1 = new FlowLayoutPanel();
  67. this.flowPane1.WrapContents = true;
  68. this.flowPane1.FlowDirection = FlowDirection.LeftToRight;
  69. this.flowPane1.Dock = DockStyle.Fill;
  70. // 容器加入分主容器1内
  71. this.groupBox1.Controls.Add(this.flowPane1);
  72. /***** 设定分组容器2 *****/
  73. this.groupBox2 = new GroupBox();
  74. this.groupBox2.Dock = DockStyle.Fill;
  75. this.groupBox2.Text = “选项2”;
  76. // 容器加入表格容器第3行第1列
  77. this.tablePane.Controls.Add(this.groupBox2, 0, 2);
  78. /***** 设定流式布局面板容器1 *****/
  79. this.flowPane2 = new FlowLayoutPanel();
  80. this.flowPane2.WrapContents = true;
  81. this.flowPane2.FlowDirection = FlowDirection.LeftToRight;
  82. this.flowPane2.Dock = DockStyle.Fill;
  83. // 容器加入分主容器2内
  84. this.groupBox2.Controls.Add(this.flowPane2);
  85. /***** 流式面板容器1中的单选按钮控件展示的Color颜色对象数组 *****/
  86. Color[] colors = {
  87. Color.Black,
  88. Color.Blue,
  89. Color.Orange,
  90. Color.Red,
  91. Color.Green,
  92. Color.Gray,
  93. Color.Pink,
  94. Color.Black,
  95. Color.Plum
  96. };
  97. // 保存默认被选中单选按钮控件引用
  98. RadioButton radioButtonDefault = null;
  99. // 根据Color数组生成单选按钮对象
  100. foreach (Color c in colors) {
  101. RadioButton rb = new RadioButton();
  102. // 设定单选按钮中显示的文字
  103. rb.Text = c.ToString();
  104. // 设定单选按钮的前景色
  105. rb.ForeColor = c;
  106. // 设定控件根据内容自动调整尺寸
  107. rb.AutoSize = true;
  108. // 将Color对象保存在控件的Tag属性中
  109. rb.Tag = c;
  110. // 设定单选按钮选择状态变化时的事件委托
  111. rb.CheckedChanged += new EventHandler(RadioButtonColorCheckedChanged);
  112. // 令第1个RadioButton对象成为默认被选中对象
  113. if (radioButtonDefault == null) {
  114. radioButtonDefault = rb;
  115. }
  116. // 控件加入流式面板容器1内
  117. this.flowPane1.Controls.Add(rb);
  118. }
  119. // 选中默认的单选按钮控件
  120. radioButtonDefault.Checked = true;
  121. radioButtonDefault = null;
  122. /***** 流式面板容器2中的单选按钮控件展示的Font字体对象数组 *****/
  123. Font[] fonts = {
  124. new Font(new FontFamily(“宋体”), DEFAULT_FONT_SIZE),
  125. new Font(new FontFamily(“楷体”), DEFAULT_FONT_SIZE),
  126. new Font(new FontFamily(“幼圆”), DEFAULT_FONT_SIZE),
  127. new Font(new FontFamily(“黑体”), DEFAULT_FONT_SIZE),
  128. new Font(new FontFamily(“华文彩云”), DEFAULT_FONT_SIZE)
  129. };
  130. // 根据Font数组生成单选按钮对象
  131. foreach (Font font in fonts) {
  132. RadioButton rb = new RadioButton();
  133. // 设定单选按钮中显示的文字
  134. rb.Text = font.FontFamily.Name;
  135. // 设定单选按钮文本字体
  136. rb.Font = font;
  137. // 将Font对象保存在控件的Tag属性中
  138. rb.Tag = font;
  139. // 设定控件根据内容自动调整尺寸
  140. rb.AutoSize = true;
  141. // 设定单选按钮选择状态变化时的事件委托
  142. rb.CheckedChanged += new EventHandler(RadioButtonFontCheckedChanged);
  143. // 令第1个RadioButton对象成为默认被选中对象
  144. if (radioButtonDefault == null) {
  145. radioButtonDefault = rb;
  146. }
  147. // 控件加入流式面板容器2内
  148. this.flowPane2.Controls.Add(rb);
  149. }
  150. // 选中默认的单选按钮控件
  151. radioButtonDefault.Checked = true;
  152. }
  153. ///
  154. /// 上边一组单选按钮选中状态变化事件委托方法
  155. ///
  156. private void RadioButtonColorCheckedChanged(object sender, EventArgs e) {
  157. // 根据sender参数获取触发事件的单选按钮对象
  158. RadioButton rb = (RadioButton)sender;
  159. // 判断触发事件的对象选中状态是否为被选中
  160. if (rb.Checked) {
  161. // 更改文本标签控件的前景色
  162. this.textLable.ForeColor = (Color)rb.Tag;
  163. }
  164. }
  165. ///
  166. /// 下边一组单选按钮选中状态变化事件委托方法
  167. ///
  168. private void RadioButtonFontCheckedChanged(object sender, EventArgs e) {
  169. // 根据sender参数获取触发事件的单选按钮对象
  170. RadioButton rb = (RadioButton)sender;
  171. // 判断触发事件的对象选中状态是否为被选中
  172. if (rb.Checked) {
  173. // 更改文本标签控件的字体
  174. this.textLable.Font = (Font)rb.Tag;
  175. }
  176. }
  177. }
  178. ///
  179. /// 包含主方法的类
  180. ///
  181. static class Program {
  182. ///
  183. /// 应用程序的主入口点。
  184. ///
  185. [STAThread]
  186. static void Main() {
  187. Application.EnableVisualStyles();
  188. Application.SetCompatibleTextRenderingDefault(false);
  189. Application.Run(new MyForm());
  190. }
  191. }
  192. }

本节代码下载

GroupBox的使用没有太多难度,大家通过代码学习即可。

发表评论

表情:
评论列表 (有 0 条评论,204人围观)

还没有评论,来说两句吧...

相关阅读