C#窗体学习笔记(4)——button组件和窗体的应用

button组件和窗体的应用

有了窗体的相关概念,我们在学习button组件就显得轻松许多,我们可以尝试一些稍微复杂得应用了。这节课我们简单介绍如何使用button组件之后就开始试着跟之前得窗体进行一个组合使用。

废话不多说,直接上图。
在这里插入图片描述
打开工具箱选中button按钮,将其拖放到窗体上。在这里插入图片描述
然后你就会发现窗体上多了一个矩形块,上面写着button1.
这个组件就是我们今天要学习的button按钮。
我们之前尝试过的点击窗体可以让窗体改变透明度,但是我们不能确定点击的具体位置,如果我们想规定只在某个区域内点击有效,那么我们可以使用button按钮。
顾名思义,button最常用的功能还是用来触发点击事件。
在这里插入图片描述
所以,拖放这个button后双击他就默认自动生成了一个点击触发的事件。
当我们建立好这个组件后,我们来了解一下他常用的属性。
在这里插入图片描述
以上是窗体最常用的属性。Name、font、text、imgae可以说是很多组件的共有属性了,使用方法也几乎一样。值得指出的是,对于按钮除了点击可以触发click事件以外,我们也可以绑定快捷键。除了在text属性后跟(& 按键名)我们也可以在如下图的位置快速绑定快捷键。

在这里插入图片描述
这里就是依靠按键来触发事件了,原理和text属性后加按键名不同但效果一样。
button按钮的使用起始有很多的道道,但目前我们从最简单的应用来示范。

首先抛出一个问题,我们能不能把这个按钮组件和窗体结合起来,安下一个按钮打开一个窗体,或者关闭一个窗体呢?
要实现这个功能其实很简单,只需要在按钮的click事件里面添加关闭或者打开的方法就行了吧。
是这么简单的吗?
我们来试试。
首先在刚才的基础上再次加入一个button。并且分别更改text属性为“打开新窗体”和“关闭本窗体”。
在这里插入图片描述
我们先双击“打开本窗体”按钮。然后再双击“关闭本窗体”。当然你也可以手动输入以下内容。
在这里插入图片描述
打开以后可以看到两个窗体的click事件了。
如果我们要打开新的窗体那我们得先创建他,这个时候点击项目按钮并添加windows窗体。
在这里插入图片描述
在这里插入图片描述
然后你就会得到一个新得空白窗体,叫做Form2.
完事具备,只欠代码了。
在两个click事件中分别输入如下代码。
在这里插入图片描述
先来说一说打开新窗体得按钮触发得事件。
Form2 f2=new Form2();
指的是我们把Form2这个窗体实例化,并且给他起个名字叫f2。
对象得实例化是使用它方法得前提。
就像我们知道程序员这个“对象”他有个“方法”是写代码,但如果我不指定一个具体的程序员“张三”或者“李四”,就不会有人来回应我了。
程序也是一样,我们在使用某个对象得功能时一定要实例化他,系统才好给这个方法分配好“座位”(内存空间),让他开始“干活”(使用方法)。
这里我们让f2他show了一下自己,然后就可以把他显示在屏幕上了。
其实,要显示窗体根据不同的需求有不同的方法。
form.Show()显示一次窗体后立即关闭,是一个非模式化窗体。
form.ShowDialog()显示窗体,不关闭这个窗体就无法使用其他窗体,是一个模式化窗体。
Application.Run(form)把窗体显示放入消息队列中,不停循环。
看到这里你可能要打住我了。
什么是模式化窗体,什么是非模式化窗体,什么又是消息队列啊?为什么我运行一次之后并没有关闭啊?
形象的说模式化窗体是个“渣男”,只要你点击一次按钮,就能new一个新的对象。而且这个对象与原窗体之间没有任何联系,可以随时对原窗体和新窗体做任何操作。。。
而模式化窗体就是典型的“老实人了”,只要打开了模式窗体,就不能对原窗体做任何改动和操作,且与原窗体有严格的逻辑从属关系,这一点我们将在后续父子窗体中讲解。
对于Application.Run(form)方法就是把这个窗体的一切放入消息队列中,不断循环执行。而我们之所以对form2用show方法不会只显示一次,是因为调用form2的click事件在form1的组件button里触发,form1在消息队列里,当然能够不断刷新show方法让屏幕一直显示了。

接着我们要按下关闭按钮来关闭当前的form1窗体,这里我们用了close方法。
其实对应于显示窗体的方法,我们也有关闭窗体的几种方法。
form.close() 关闭这个窗口,但是后台进程有时候并未真正退出,还可以用open方法打开。这是因为系统的“垃圾回收”机制导致的延迟,需要较长事件回收垃圾资源,并没有真正的立刻把分配给这个对象的内存回收走。
form.dispose()从内存释放这个窗口,使用于内存资源占用率高的应用,可以立即释放掉资源。
Application.Exit()可以关闭掉所有的窗口和消息,但是有时候无法关闭所有资源。
System.Environment.Exit(0);彻底关闭应用占用的一切资源。

OK了就说这么多,今天看似只引入了button,实则是对前期知识的回顾和深化,真正理解还需要不断练习呀。
下一节笔记讲解label组件和button的组合应用。

using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Drawing.Drawing2D; namespace KRT.Component.Common { /// /// 停靠面板控件 /// public class DockPanel : Panel { /// /// 关闭按钮 /// DockPanelCloseButton closeButton = new DockPanelCloseButton(); /// /// 浮动窗口 /// Form flowForm = new Form(); /// /// 分割栏 /// Splitter splitter = new Splitter(); /// /// 标题栏 /// Label titleBar = new Label(); /// /// 标题栏背景色 /// public Color TitleBackColor //using System.Drawing; { get { return titleBar.BackColor; } set { titleBar.BackColor = value; closeButton.BackColor = value; } } /// /// 标题栏前景色 /// public Color TitleForeColor { get { return titleBar.ForeColor; } set { titleBar.ForeColor = value; } } /// /// 标题栏文本 /// [Localizable(true)] public string TitleText { get { return titleBar.Text; } set { titleBar.Text = value; } } /// /// 标题栏可见 /// public bool TitleVisible { get { return titleBar.Visible; } set { titleBar.Visible = value; closeButton.Visible = value; } } /// /// 浮动窗口最大尺寸 /// Size flowFormMaxSize = new Size(640, 480); public Size FlowFormMaxSize { get { return flowFormMaxSize; } set { flowFormMaxSize = value; if (this.VisibleAll) { flowForm.Size = flowFormMaxSize; } } } /// /// 整个控件的隐藏、显示,包括浮动窗口状态下 /// bool visibleAll = true; public bool VisibleAll { get { return visibleAll; } set { visibleAll = value; if (flowForm.Controls.Count > 0) { flowForm.Visible = visibleAll; } else { this.Visible = visibleAll; } } } /// /// 控件初始化 /// public DockPanel() { //InitializeComponent(); flowForm.ShowInTaskbar = false; // 关闭按钮 closeButton.Location = new System.Drawing.Point(0, 0); closeButton.Name = "Close"; closeButton.Size = new System.Drawing.Size(16, 16); closeButton.TabIndex = 0; closeButton.BackColor = SystemColors.ControlDark; closeButton.Click += new EventHandler(closeButton_Click); // 浮动窗口 flowForm.FormBorderStyle = FormBorderStyle.SizableToolWindow; //VS2008自带的窗体设计器进行设置窗体的边框。 flowForm.ShowInTaskbar = false; //任务栏 flowForm.MaximizeBox = false; //最大化按钮 flowForm.Move += new EventHandler(flowForm_Move); //EventHandler是asp.net内置的委托,事件是特殊的委托。 flowForm.MouseCaptureChanged += new EventHandler(flowForm_MouseCaptureChanged); // flowForm.FormClosing += new FormClosingEventHandler(flowForm_FormClosing); // 标题栏 titleBar.AutoSize = false; //自动调整大小 titleBar.Dock = DockStyle.Top;//控件顶端;DockStyle是个枚举,有none, top, bottom... titleBar.Height = 18; titleBar.Padding = new Padding(3); titleBar.MouseDown += new MouseEventHandler(titleBar_MouseDown); titleBar.MouseMove += new MouseEventHandler(titleBar_MouseMove); titleBar.MouseUp += new MouseEventHandler(titleBar_MouseUp); //this.Padding = new Padding(1); this.Controls.Add(closeButton); this.Controls.Add(titleBar); this.ParentChanged += new EventHandler(DockPanel_ParentChanged); this.VisibleChanged += new EventHandler(DockPanel_VisibleChanged); this.MouseDown += new MouseEventHandler(titleBar_MouseDown); this.MouseMove += new MouseEventHandler(titleBar_MouseMove); this.MouseUp += new MouseEventHandler(titleBar_MouseUp); this.ControlAdded += new ControlEventHandler(DockPanel_ControlAdded); } /// /// 如果是用户单击浮动窗口的关闭按钮,隐藏浮动窗口 /// /// /// void flowForm_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; flowForm.Visible = false; visibleAll = false; closeButton_Click(sender, e); } } /// /// 添加子控件时调整顺序 /// /// /// void DockPanel_ControlAdded(object sender, ControlEventArgs e) { if (e.Control != titleBar && e.Control != closeButton) { e.Control.BringToFront(); } } /// /// 同时修改Splitter的可视效果 /// /// /// void DockPanel_VisibleChanged(object sender, EventArgs e) { splitter.Visible = Visible; if (this.Parent != null && Visible) { if (!this.DesignMode) { if (this.Parent.Controls.IndexOf(splitter) < 0) { //splitter.Dock = this.Dock; //this.Parent.Controls.AddRange(new Control[] { splitter, this }); this.Parent.Controls.Add(splitter); int index = this.Parent.Controls.IndexOf(this); this.Parent.Controls.SetChildIndex(splitter, index); //this.Parent.Controls.SetChildIndex(this, index + 1); //foreach (Control item in this.Parent.Controls) //{ // Debug.WriteLine( // this.Parent.Controls.GetChildIndex(item).ToString() + " : " + // item.ToString()); //} } } } } /// /// 初始化Splitter /// /// /// void DockPanel_ParentChanged(object sender, EventArgs e) { //if (this.Parent != null) //{ // if (!this.DesignMode) // { // //Parent.Controls.Add(splitter); // splitter.Dock = this.Dock; // this.Parent.Controls.AddRange(new Control[] { splitter, this }); // } //} } /// /// 关闭事件 /// public event EventHandler CloseButtonClick; /// /// 单击关闭按钮,触发关闭事件 /// /// /// void closeButton_Click(object sender, EventArgs e) { VisibleAll = false; if (null != CloseButtonClick) { CloseButtonClick(sender, e); } } /// /// 浮动窗口开始拖动时触发 /// /// /// void flowForm_MouseCaptureChanged(object sender, EventArgs e) { if (!flowFormCapture) { flowFormCapture = true; } else { flowFormCapture = false; flowFormDock = true; } } bool flowFormDock = false; // 浮动窗口可以被停靠 bool flowFormCapture = false; // 浮动窗口开始拖动 /// /// 浮动窗口移动过程 /// /// /// void flowForm_Move(object sender, EventArgs e) { if (flowFormDock) { flowFormDock = false; switch (this.Dock) { case DockStyle.Left: if (flowForm.Location.X < Parent.Location.X) { ShowDockPanel(); } break; case DockStyle.Top: if (flowForm.Location.Y Parent.Location.X + Parent.Width) { ShowDockPanel(); } break; case DockStyle.Bottom: if (flowForm.Location.Y + flowForm.Height > Parent.Location.Y + Parent.Height) { ShowDockPanel(); } break; } } } /// /// 控件尺寸改变 /// /// protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); closeButton.Location = new Point( ClientRectangle.Right - closeButton.Width - 1, 1); closeButton.Refresh(); } Point oldMouseLocation; // 鼠标位置 Rectangle rect; // 面板区域 bool mouseDown = false; // 鼠标按下 /// /// 鼠标按下事件 /// /// /// void titleBar_MouseDown(object sender, MouseEventArgs e) { if (this.Dock != DockStyle.None && this.Dock != DockStyle.Fill) { oldMouseLocation = e.Location; mouseDown = true; rect = this.RectangleToScreen(ClientRectangle); ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Thick); } } /// /// 鼠标移动事件 /// /// /// void titleBar_MouseMove(object sender, MouseEventArgs e) { if (mouseDown) { ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Thick); rect.Offset(e.X - oldMouseLocation.X, e.Y - oldMouseLocation.Y); oldMouseLocation = e.Location; ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Thick); } } /// /// 鼠标弹起事件 /// /// /// void titleBar_MouseUp(object sender, MouseEventArgs e) { if (mouseDown) { mouseDown = false; ControlPaint.DrawReversibleFrame(rect, Color.Black, FrameStyle.Thick); Rectangle rc = this.RectangleToScreen(ClientRectangle); Point pt = this.PointToScreen(e.Location); if (!rc.Contains(pt)) { ShowFlowForm(); } } } //protected override void OnPaint(PaintEventArgs e) //{ // base.OnPaint(e); // Pen borderPen = new Pen(borderColor); // Rectangle rc = new Rectangle( // e.ClipRectangle.Left, e.ClipRectangle.Top, // e.ClipRectangle.Right - 1, e.ClipRectangle.Bottom - 1); // e.Graphics.DrawRectangle(borderPen, rc); //} /// /// 显示浮动窗口 /// void ShowFlowForm() { flowForm.Show(Parent); flowForm.Location = new Point(rect.Left, rect.Top); Size newSize = new Size(rect.Width, rect.Height); if (newSize.Width > FlowFormMaxSize.Width) { newSize.Width = FlowFormMaxSize.Width; } newSize.Height = newSize.Height + (this.TitleVisible ? SystemInformation.CaptionHeight - this.titleBar.Height : SystemInformation.CaptionHeight); if (newSize.Height > FlowFormMaxSize.Height) { newSize.Height = FlowFormMaxSize.Height; } flowForm.Size = newSize; flowForm.Text = TitleText; while (this.Controls.Count > 2) { for (int i = 0; i < this.Controls.Count; i++) { if (this.Controls[i] != closeButton && this.Controls[i] != titleBar) { flowForm.Controls.Add(this.Controls[i]); break; } } } this.Visible = false; } /// /// 显示停靠面板 /// void ShowDockPanel() { this.Visible = true; while (flowForm.Controls.Count > 0) { this.Controls.Add(flowForm.Controls[0]); } flowForm.Hide(); } } }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值