窗体应用程序中的Panel和Style——WindowsForm系列教程

你好,这里是BIM的乐趣,我是九哥~

通过前面两篇文章,我们知道了如何创建UI和使用按钮小部件,希望到目前为止的示例,能让你从Python的角度来阅读MSDN文档。

在本文中,我们来看看最基本的小部件之一——Panel。它同时也是最无聊的,因为它实际上什么都没做,然而,它对于几乎任何GUI都是最基本的。为了让本篇文章更有意思一些,我会对UI的样式做一些调整,主要是改变外观颜色的一些方法。

The Panel

该面板通常称为容器小部件。它本身不做任何事情,而且你甚至很少希望直接在面板上捕获事件。它能做的就是包含其他小部件(因此叫容器)。因此,你可以使用"面板"将小部件分组到 GUI 中。通过并排布置面板并调整它们对调整大小的响应方式,你可以轻松地控制程序的布局。

同样,从示例中,我们可以看到 Panel构造函数不采用任何参数:

Panel panel1 = new Panel();

我们向面板添加小部件的方式与对窗体相同。若要创建包含按钮的面板,并把它放在窗体上,请执行以下操作:

from System.Windows.Forms import Application, Button, Form

class FunnyBIM(Form):
    def __init__(self):
        panel = Panel()
        button = Button()

        panel.Controls.Add(button)
        self.Controls.Add(panel)

这个没啥意思,就不截图了。

当你一起使用其中的几个面板时,它们真的会变成自己的面板。为了能够看到我们创建的不同面板之间的不同,我们将研究如何改变它们的颜色(及其外观的其他元素)。

Style

面板,像所有小部件一样,从Control 基类继承。控件定义与小部件样式相关的某些属性。

如果你浏览面板成员名单,你可以看到所有小组成员。对于此条目,我们将使用 :

      • BackColor
      • BorderStyle
      • ForeColor

请注意,对于Panel小部件的 Text 属性,文档显示:

Overridden. This member is not meaningful for this control.

并非所有从 Control 继承的成员对于每个小部件都有意义。获取或设置面板的"Text"属性没有意义。


颜色

对于Panel,ForeColor将是该面板上任何文本(标签)的颜色,它也将是你放置在那里的任何小部件的 ForeColor。

前景色和背景色都是 System.Drawing.Color 结构.通过从"Color Members"的列表中选择名称来选择哪种颜色。

要将面板前景颜色设置为蓝色,我们需要确保代码中包含以下内容:

      • 添加对System.Drawing 的引用。
      • 导入Color名称
      • 在小部件上设置ForeColor 或 BackColor 属性

所以,类似这样:

import clr
clr.AddReference('System.Windows.Forms')
clr.AddReference('System.Drawing')

from System.Drawing import Color
from System.Windows.Forms import Application, Form, Panel

class FunnyBIM(Form):
    def __init__(self):
        panel = Panel()
        panel.ForeColor = Color.Blue

        self.Controls.Add(panel)

到目前为止,我们主要处理对象属性。.NET 中的属性意味着在 Python 中相同的方法。除了设置组件的颜色或高度,我们还可以检查(获取)属性。

from System.Drawing import Color
from System.Windows.Forms import Application, Panel

class FunnyBIM(Form):
    def __init__(self):
        formHeight = self.Height
        formWidth = self.Width
        print 'Height = ', formHeight
        print 'Width = ', formWidth


 

与 ForeColor 更正常地更改面板的BackColor ,你可以通过更改小部件的颜色属性来直接更改其颜色。

边框样式

我们影响容器小部件绘制方式的另一种方式是使用BorderStyle属性。这需要边框样式枚举。枚举的成员实际上是常量,它告诉 .NET 框架要使用哪种边框样式。

从文档中,你可以看到三种不同类型的边框可用:

      • Fixed3D三维边框—— BorderStyle.Fixed3D
      • FixedSingle 单行边框——BorderStyle.FixedSingle
      • None无边框——BorderStyle.None

因此,要给面板一个三维边框,你需要以下代码:

from System.Windows.Forms import Application, Form, BorderStyle, Panel

class FunnyBIM(Form):
    def __init__(self):
        self.panel = Panel()
        panel.BorderStyle = BorderStyle.Fixed3D

        self.Controls.Add(self.panel)

在窗体上设置边框样式是不同的。在窗体上使用 FormBorderStyle属性,该属性采用FormBorderStyle 枚举值。

选项包括 :

      • Fixed3D——固定的三维边框。
      • FixedDialog——粗的、固定的对话框样式边框。
      • FixedSingle——固定的单行边框。
      • FixedToolWindow——无法调整大小的工具窗口边框。
      • None——无边框。
      • Sizable ——(默认值) 可调整大小的边框。
      • SizableToolWindow——工具窗口不会显示在任务栏中,也不显示在用户按 ALT+TAB 时显示的窗口中。

稍后,我们将把所有这些知识与位置结合使用。Location允许你指定小部件的位置。此位置相对于其父小部件,0,0是左上角。这意味着10、10的位置是父级左上角的 10 像素向下和 10 像素。小部件位于你指定的位置,其左上角。

过去,我们使用"Height高度"和"Width宽度"来设置控件的尺寸。也可以使用 Size 属性完成。它以大小结构作为值。

由于"Size结构"具有公共属性、高度和宽度,因此使用Size 属性往往更为冗长。有时,你可能希望重新使用从其他地方获取的"Size结构"(例如图像大小),然后设置(或获取)Size 属性很方便。

FunnyBIM窗口
 

让我们用一些示例代码来结束这一点,这些代码使用了本篇文章中介绍的所有不同内容。

我们将创建一个UI窗口(像往常一样,一个子类的窗体)与几个子面板。

我们将更改这些面板的大小和样式,并使用"Location位置"将一些按钮放在其中。

为了做一些新的事情,我们将设置我们的主要应用程序窗口的尺寸,根据我们的用户有屏幕的大小。

这很容易从. System.Windows.Form.Screen 类的 GetWorkingSize静态方法完成。我相信你能从下面的代码中找出来。

本示例将主窗体拆分为两个水平面板。我们希望每个面板的高度是主窗体宽度的一半。在 Windows 上 , 如果我们只是使用self。总高度将包括标题栏高度。为了获得正确的高度,我们使用 Form 属性 ClientRectangle。这将返回一个System.Drawing.Rectangle Structure。在Rectangle Members 列表中,我们可以看到它有一个高度Members 。代码示例演示它是一个普通整数,因此我们可以使用它来获取Form的实际高度:

public int Height { get; set; }

import clr
clr.AddReference('System.Drawing')
clr.AddReference('System.Windows.Forms')

from System.Drawing import Color, Point
from System.Windows.Forms import (Application, BorderStyle, Button,
    Form, FormBorderStyle, Label, Panel, Screen)

class FunnyBIMForm(Form):
    def __init__(self):
        self.Text = "FunnyBIM"
        self.FormBorderStyle = FormBorderStyle.FixedDialog

        screenSize = Screen.GetWorkingArea(self)
        self.Height = screenSize.Height / 3
        #self.Width = screenSize.Width / 3
        self.Width = 440

        self.panelHeight = self.ClientRectangle.Height / 2

        self.setupPanel1()
        self.setupPanel2()
        self.setupCounters()

        self.Controls.Add(self.panel1)
        self.Controls.Add(self.panel2)

    def setupPanel1(self):
        self.panel1 = Panel()
        self.panel1.BackColor = Color.LightSlateGray
        self.panel1.ForeColor = Color.Blue
        self.panel1.Width = self.Width
        self.panel1.Height = self.panelHeight
        self.panel1.Location = Point(0, 0)
        self.panel1.BorderStyle = BorderStyle.FixedSingle

        self.label1 = Label()
        self.label1.Text = "继续-点这里"
        self.label1.Location = Point(20, 20)
        self.label1.Height = 25
        self.label1.Width = 175

        self.button1 = Button()
        self.button1.Name = '1'
        self.button1.Text = '点这里 1'
        self.button1.Location = Point(20, 50)
        self.button1.Click += self.update

        self.panel1.Controls.Add(self.label1)
        self.panel1.Controls.Add(self.button1)

    def setupPanel2(self):
        self.panel2 = Panel()
        self.panel2.BackColor = Color.LightSalmon
        self.panel2.Width = self.Width
        self.panel2.Height = self.panelHeight
        self.panel2.Location = Point(0, self.panelHeight)
        self.panel2.BorderStyle = BorderStyle.FixedSingle

        self.subpanel1 = Panel()
        self.subpanel1.BackColor = Color.Wheat
        self.subpanel1.Width = 175
        self.subpanel1.Height = 100
        self.subpanel1.Location = Point(25, 25)
        self.subpanel1.BorderStyle = BorderStyle.Fixed3D

        self.label2 = Label()
        self.label2.Text = "继续-点这里"
        self.label2.Location = Point(20, 20)
        self.label2.Height = 25
        self.label2.Width = 175

        self.button2 = Button()
        self.button2.Name = '2'
        self.button2.Text = '点这里 2'
        self.button2.Location = Point(20, 50)
        self.button2.Click += self.update

        self.subpanel1.Controls.Add(self.label2)
        self.subpanel1.Controls.Add(self.button2)

        self.subpanel2 = Panel()
        self.subpanel2.BackColor = Color.Transparent
        self.subpanel2.Width = 175
        self.subpanel2.Height = 100
        self.subpanel2.Location = Point(220, 25)
        self.subpanel2.BorderStyle = BorderStyle.Fixed3D

        self.label3 = Label()
        self.label3.Text = "继续-点这里"
        self.label3.Location = Point(20, 20)
        self.label3.Height = 25
        self.label3.Width = 175

        self.button3 = Button()
        self.button3.Name = '3'
        self.button3.Text = '点这里 3'
        self.button3.Location = Point(20, 50)
        self.button3.Click += self.update

        self.subpanel2.Controls.Add(self.label3)
        self.subpanel2.Controls.Add(self.button3)

        self.panel2.Controls.Add(self.subpanel1)
        self.panel2.Controls.Add(self.subpanel2)

    def setupCounters(self):
        self.counterDict = {
            '1': 0,
            '2': 0,
            '3': 0,
        }

    def update(self, sender, event):
        name = sender.Name
        self.counterDict[name] += 1
        label = getattr(self, 'label' + name)
        label.Text = "你点了这里 %s 次." % self.counterDict[name]

form = FunnyBIMForm()
Application.Run(form)

运行后效果如下:

好了,今天的分享就到这里,小伙伴们快去自己尝试吧~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九哥BIMer

予人玫瑰,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值