C#实例:多功能Windows窗体应用程序Helloworld_WinForm

这篇具有很好参考价值的文章主要介绍了C#实例:多功能Windows窗体应用程序Helloworld_WinForm。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

有了创建一个Windows窗体应用程序的经验,就可以开始尝试运用更多的控件实现更多丰富的功能界面。以下分享我基于项目Helloworld_WinForm使用常用C#Windows窗体控件实现一些小功能。

每一节标题为所用到的控件,全文以实际制作过程为序编制。



WinForm窗体应用程序开发步骤

1、创建窗体Form

项目创建时会默认创建一个窗体,默认为父窗体。
新建的其他窗体为子窗体,子窗体调用时会在父窗体中显示。
项目创建方法见:Helloworld_WinForm,本文直接基于之前创建的项目搭建功能。

2、创建控件Control

控件显示在工具箱中,通过双击或拖拽的方式显示在当前打开的设计窗口中,可在属性栏修改其属性。

3、指定布局Layout

根据应用拖动控件位置,或在属性中调整坐标等。

4、响应事件Event

事件包括双击控件、按下鼠标、向文本框输入内容等等,可以在控件属性中点击事件图标查看所有事件。
响应是指发生事件后,触发的操作,通常以代码的形式实现功能。

描述还是比较抽象,建议动手实践。

常用控件实例

MenuStrip 菜单栏

新建MenuStrip控件,修改属性如下

  • Name:tools
  • Text:工具
    在工具下,继续新建TextBox,修改它们属性的Text。

如果在子窗体中也加入Menustrip,则需在父窗体的Menustrip属性中按下图所示修改,否则子窗体菜单栏不会显示出来,默认二者菜单栏合并。
c# winform界面案例,上位机,C#,c#,windows
父窗体:
c# winform界面案例,上位机,C#,c#,windows
子窗体:
c# winform界面案例,上位机,C#,c#,windows

richTextBox富文本框

参考链接
在项目中右键添加子窗体,命名Text。
Anchor属性选择“Top,Bottom,Left,Right”,这样当窗体大小改变时,RichTextBox控件的大小也会跟着改变
c# winform界面案例,上位机,C#,c#,windows

新建 richTextBox控件。属性BackColor改为ControlLightLiight,ReadOnly改为True。修改Dock属性为Fill,使控件铺满窗口。
c# winform界面案例,上位机,C#,c#,windows

将父窗体属性中的IsMdiContainer改为true。
并双击父窗体菜单栏的“新建”,编辑程序,使点击新建时打开子窗体。

private void toolStripTextBox3_Click(object sender, EventArgs e)
        {
            Text newMDIChild = new Helloworld_WinForm.Text();
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            // Display the new form.
            newMDIChild.Show();
        }

SaveFileDialog保存对话框

参考链接:c#保存textbox中的字符串到txt文件中
点击记事本的【文件】→【保存】菜单项时,使用SaveFileDialog保存文件。

用程序创建SaveFileDialog及修改属性。

		// 菜单栏中的保存按钮。也可用Button
		private void 保存ToolStripMenuItem_Click(object sender, EventArgs e)
        {
        	// 新建SaveFileDialog,Name为saveFileDialog
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            // 修改属性,定义保存文件类型
            saveFileDialog.Filter = "(*.txt)|*.txt|(*.*)|*.*|97-2003Word文档|*.doc";
            // 文件名是日期时间
            saveFileDialog.FileName = "D:\\text\\" + DateTime.Now.ToString("yyyyMMddHHmm") + ".txt";
            // 对话框打开
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
            	// 新建数据流
                StreamWriter streamWriter = new StreamWriter(saveFileDialog.FileName, true);
                // 写入数据
                streamWriter.Write(this.richTextBox1.Text);
                // 关闭当前streamWriter对象和基础流
                streamWriter.Close();
            }
        }

		// 富文本,Name为richTextBox1
        private void richTextBox1_TextChanged_1(object sender, EventArgs e)
        {

        }

上述程序启动后,点击保存,会弹出保存窗口,如下:
c# winform界面案例,上位机,C#,c#,windows
可以选择保存为txt或doc格式。

试一试效果:
c# winform界面案例,上位机,C#,c#,windows

FontDialog字体对话框

继续增加菜单栏选项:字体。其属性Name为字体ToolStripMenuItem。
c# winform界面案例,上位机,C#,c#,windows
双击字体,编写代码,新建字体对话框,并将设置的字体赋给富文本中的Text。

		private void 字体ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            FontDialog fontDialog = new FontDialog();
            if(fontDialog.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.SelectionFont = fontDialog.Font;
            }
        }

试一下效果:
先设置字体,再输入文本。也可在输入文本后,选中需要修改字体的文本,再点击字体修改。
c# winform界面案例,上位机,C#,c#,windows
c# winform界面案例,上位机,C#,c#,windows

richTextBox的属性WordWrap

增加菜单栏选项:自动换行。其Name属性为自动换行ToolStripMenuItem。

自动换行的Checked属性默认为“False”,文本内容按照文本框的宽度自动换行,否则只按段落标记换行。

可以修改富文本属性WordWrap,以决定是否默认自动换行,此处为默认自动换行:
c# winform界面案例,上位机,C#,c#,windows
将自动换行选项的默认状态Checked改为被点击的True状态:
c# winform界面案例,上位机,C#,c#,windows
双击自动换行,编辑代码如下:

        private void 自动换行ToolStripMenuItem_Click(object sender, EventArgs e)
        {
        	// 判断自动换行状态标记
            if(自动换行ToolStripMenuItem.Checked == false)
            {
            	// 被按下后更新状态
                自动换行ToolStripMenuItem.Checked = true;
                // 自动换行
                richTextBox1.WordWrap = true;
            }
            else
            {
            	// 被按下后更新状态
                自动换行ToolStripMenuItem.Checked = false;
                // 不自动换行
                richTextBox1.WordWrap = false;
            }
        }

实现的效果就是默认自动换行,点击自动换行后取消自动换行,再次点击则变为自动换行。

ColorDialog颜色对话框

利用ColorDialog修改字体颜色。
增加菜单栏字体颜色,其Name属性为字体颜色ToolStripMenuItem。

双击它编辑代码如下:

// 第一种
		private void 字体颜色ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ColorDialog colorDialog = new ColorDialog();
            if (colorDialog.ShowDialog() == DialogResult.OK)
            {
                richTextBox1.SelectionColor = colorDialog.Color;
            }
        }

试一下效果:
若先设置字体颜色,再输入文本,则此前输入的文本不会变化,变更只适用于此后输入的文本。
也可在输入文本后,选中需要修改字体颜色的文本,再点击字体颜色修改,变更适用于选中的文本。
c# winform界面案例,上位机,C#,c#,windows
修改为橙色:
c# winform界面案例,上位机,C#,c#,windows

如果在未选中文本时修改字体颜色,要将所有文本字体颜色同时修改,则可以这样写:
选中文本再修改颜色,只会修改选中文本的颜色。

// 第二种
		private void 字体颜色ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            ColorDialog colorDialog = new ColorDialog();
            if (this.colorDialog1.ShowDialog() == DialogResult.OK)
            {
                if (this.richTextBox1.SelectedText == "") // 若未选中文本,则将设置颜色适用于所有文本
                {
                    this.richTextBox1.ForeColor = this.colorDialog1.Color;
                }
                else
                {
                    this.richTextBox1.SelectionColor = this.colorDialog1.Color;
                }
            }
        }

Timer计时器

参考链接
在项目中新建Windows窗体,命名为Clock.cs。
在父窗体中,双击菜单栏Clock,编写代码,添加子窗体Clock。属性BackColor改为ControlLightLiight,ReadOnly改为True。
代码如下:

		private void toolStripTextBox2_Click(object sender, EventArgs e)
        {
            Clock newMDIChild = new Helloworld_WinForm.Clock();
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            // Display the new form.
            newMDIChild.Show();
        }

在Clock窗体中,拖拽Label控件,Name为label1,修改属性字体颜色为喜欢的字体。修改属性Text为yyyy-MM-dd HH:mm:ss。
c# winform界面案例,上位机,C#,c#,windows
拖拽Timer计时器控件,Name为timer1,修改属性Enable为True,Interval为1000。使能定时,每1000ms执行一次函数timer1_Tick中的内容。
c# winform界面案例,上位机,C#,c#,windows
双击timer1,编写代码,使其显示实时时间。

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");  //年-月-日 小时:分钟:秒
        }

其中,HH为24小时进制,hh为12小时进制。

让Label文字居中的方法:设置Autosize的值为false,拉大这个label框的宽度,设置label属性里的TextAlign为MiddleCenter,意思是让框里的文字内容居中。
c# winform界面案例,上位机,C#,c#,windows
启动后效果如下:每过一秒,时间更新一次。
c# winform界面案例,上位机,C#,c#,windows

PictureBox-如何加文字

参考链接
在父窗口的菜单栏工具中添加一项:Panel。并添加子菜单 加水印 和 清屏。本节实现加水印的功能,后一节实现清屏。
c# winform界面案例,上位机,C#,c#,windows

从工具箱拖拽一个PictureBox控件到窗口,属性Dock改为Fill。
属性BackgroundImage可以上传一个图片,使PictureBox控件区域默认显示该图片。
还有SizeMode属性选Zoom,SizeMode属性包含:

  • Normal:图片大小不变;
  • strechImage:拉伸图片适应PictureBox(图片会变形)
  • AutoSize:PictureBox适应图片;
  • CenterImage:图片居中显示;
  • Zoom:图片填充PictureBox(不变形)

双击“加水印”,编辑程序如下:实现将文字显示在对应坐标。

		private void 加水印ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 在pictureBox上创建画图板
            Graphics g = pictureBox1.CreateGraphics();
            // 设置字体的样式
            Font f = new Font("黑体", 24);
            // 实例化一个实心画刷,颜色是白色
            SolidBrush brush = new SolidBrush(Color.White);
            // 与左上角坐标的距离
            PointF point = new PointF(400, 300);
            // 开始绘制
            g.DrawString("From: Electrical_IT", f, brush, point);
        }

启动运行,点击加水印,效果如下:
c# winform界面案例,上位机,C#,c#,windows

PictureBox-画图

参考链接:C#控件picturebox实现画图功能
C#控件画图方法
打开指定路径图片的方法
本部分实现鼠标在PictureBox区域中使用鼠标绘制的功能。
PictureBox控件属性设置参考上一节。菜单栏也如上一节添加。

要实现绘图功能,需要用到PictureBox的事件响应,位置在PictureBox的属性框中,点击PictureBox,点击事件图标即可看到:
c# winform界面案例,上位机,C#,c#,windows
重命名事件MouseDown为drawstart,事件MouseMove为drawmove,事件MouseUp为drawstop。
每次命名后会自动切换到代码编辑界面。

修改代码如下:

        private void 清屏ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();
            // 用原背景图清屏
            g.DrawImage(pictureBox1.BackgroundImage, 0, 0);
        }

        // 定义鼠标绘制的终点(起点永远是鼠标当前坐标)
        private Point endpoint;
        // 绘制标志
        private static bool drawing = false;
        private void drawstart(object sender, MouseEventArgs e)
        {
            // 创建终点
            endpoint = new Point(e.X, e.Y);
            // 鼠标按下开始绘制
            drawing = true;
        }

        private void drawstop(object sender, MouseEventArgs e)
        {
            // 鼠标松开结束绘制
            drawing = false; 
        }

        private void drawmove(object sender, MouseEventArgs e)
        {
            // 鼠标移动进行绘制,创建画布
            Graphics g = pictureBox1.CreateGraphics();
            // 显示时消除锯齿
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
            // 如果鼠标按下的按钮是左键
            if(e.Button == MouseButtons.Left)
            {
                if(drawing)
                {
                    // 当前坐标
                    Point currentpoint = new Point(e.X, e.Y);
                    // 用白蓝色笔绘制连接p2和当前坐标的线
                    g.DrawLine(new Pen(Color.AliceBlue, 2), endpoint, currentpoint);
                    // 更新终点坐标
                    endpoint.X = currentpoint.X;
                    endpoint.Y = currentpoint.Y;
                }
            }
        }

用鼠标画一画,绘制效果如下:
c# winform界面案例,上位机,C#,c#,windows
点击清屏后效果如下:(清屏也会把水印清掉)
c# winform界面案例,上位机,C#,c#,windows
如果清屏想用白色清屏,参考以下代码:

		private void 清屏ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Graphics g = pictureBox1.CreateGraphics();
            g.Clear(Color.White);
        }

问题与解决

解决子窗体被父窗体控件挡住问题

上述实例先创建了子窗体Hello、Clock和Text,再在父窗体中添加了控件PictureBox。
启动后,点击菜单栏Hello、Clock和文件新建时,子窗体无法显示在PictureBox控件前,原因是被父窗口的控件挡住了。

我的解决方法是在打开子窗体前,将父窗体中的控件PictureBox隐藏,点击Panel后再显示PictureBox控件。

隐藏:pictureBox1.Hide();
显示:pictureBox1.Show();

首先将HelloWorld.cs中,菜单点击事件的响应程序里添加隐藏控件的函数:

		 private void toolStripTextBox1_Click(object sender, EventArgs e)
        {
            Hello newMDIChild = new Helloworld_WinForm.Hello();
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            // Hide the pictureBox1
            pictureBox1.Hide();
            // Display the new form.
            newMDIChild.Show();
        }

        private void toolStripTextBox3_Click(object sender, EventArgs e)
        {
            Text newMDIChild = new Helloworld_WinForm.Text();
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            //Hide the pictureBox1
            pictureBox1.Hide();
            // Display the new form.
            newMDIChild.Show();
        }

        private void toolStripTextBox2_Click(object sender, EventArgs e)
        {
            Clock newMDIChild = new Helloworld_WinForm.Clock();
            // Set the Parent Form of the Child window.
            newMDIChild.MdiParent = this;
            //Hide the pictureBox1
            pictureBox1.Hide();
            // Display the new form.
            newMDIChild.Show();
        }

其次,在点击菜单中需要响应主窗口控件pictureBox1的程序中,增加显示控件函数:

		private void 加水印ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 设置字体的样式
            Font f = new Font("黑体", 24);
            // 实例化一个实心画刷,颜色是白色
            SolidBrush brush = new SolidBrush(Color.White);
            // 与左上角坐标的距离
            PointF point = new PointF(400, 300);
            // 显示pictureBox1控件
            pictureBox1.Show();
            // 在pictureBox上创建画图板
            Graphics g = pictureBox1.CreateGraphics();
            // 开始绘制
            g.DrawString("From: Electrical_IT", f, brush, point);
        }

        private void 清屏ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // 显示pictureBox1控件
            pictureBox1.Show();
            Graphics g = pictureBox1.CreateGraphics();
            // 用原背景图清屏
            g.DrawImage(pictureBox1.BackgroundImage, 0, 0);
        }

测试后发现还一个问题:pictureBox1被隐藏后,点击菜单中的加水印,会显示pictureBox1控件背景,但不会显示水印,还需要第二次点击,才会显示水印。不清楚为什么,还希望有大神评论指点。

另外,如果主窗口中控件非常多,不建议使用这种方式,建议将主窗口的控件放在Panel控件中,使子窗口的父类设置为Panel。参考链接

发布做好的程序

如果想将程序发给朋友玩一下,就需要发布。

首先,配置设置为Release、Any CPU。
c# winform界面案例,上位机,C#,c#,windows
找到生成,点击发布。
c# winform界面案例,上位机,C#,c#,windows
根据发布向导,指定发布的位置。
c# winform界面案例,上位机,C#,c#,windows
选择用户下载的方式,这里选从ROM。
c# winform界面案例,上位机,C#,c#,windows
选择不检查更新,并点击完成。
c# winform界面案例,上位机,C#,c#,windows
等待片刻,就可以在路径里找到setup.exe安装包。双击运行,就可以得到应用配置文件夹和应用程序。双击Helloworld_WinForm.application就可以运行了。
c# winform界面案例,上位机,C#,c#,windows
如果想卸载,可以在控制面板的应用中找到并卸载它。
c# winform界面案例,上位机,C#,c#,windows文章来源地址https://www.toymoban.com/news/detail-767665.html

到了这里,关于C#实例:多功能Windows窗体应用程序Helloworld_WinForm的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实战项目——多功能电子时钟

    通过按键来控制状态机的状态,在将状态值传送到各个模块进行驱动,在空闲状态下,数码管显示基础时钟,基础时钟是由7个计数器组合而成,当在ADJUST状态下可以调整时间,并且基础时间会随基础时钟的改变而改变,同过位置使能来确定更改的值在按下确定来更改基础时钟

    2024年02月14日
    浏览(33)
  • 多功能隐写融合

            最近尝试了一个融合了多功能隐写的项目,参考了一些现有的资料和相关的开源库,并最终集成到了可视化UI当中。这篇文章讲述了实现的几项隐写技术的原理以及最终呈现的效果,后续会在“ 隐私保护 ”以及“ ui ”的专栏中继续更新详细的ui设计思路以及隐写代

    2024年01月19日
    浏览(51)
  • 【FPGA】多功能ALU

    目录 一、实验要求 二、源代码 1. 顶层模块 2. 数据输入模块 3. ALU运算模块 4. 结果处理模块 5. 扫描数码管模块 5.1 扫描数码管顶层 5.2 分频器 5.3 数码管显示 三、仿真代码 四、结构层图 五、管脚配置 实验板卡:xc7a100tlc sg324-2L,共20个开关 通过高低位控制,实现32位数据A、

    2024年02月02日
    浏览(48)
  • VHDL实现多功能时钟设计

    题目:多功能电子时钟 VHDL语言设计 主要功能要求: 1、电子时钟。要求用24 时制显示。分屏显示“时、分”和“分、秒”,即4 个数码管不能同时显示“时、分、秒”,但可以只显示“时、分”,或只显示“分、秒”,通过按键来切换这两种显示方式。用数码管的小数点“

    2024年02月11日
    浏览(38)
  • fpga课设-多功能信号发生器

    1绪论 1.1 背景 信号发生器作为一种历史悠久的测量仪器,早在20年代电子设备刚出现时就产生了。随着通信和雷达技术的发展,40年代出现了主要用于测试各种接收机的标准信号发生器,使得信号发生器从定性分析的测试仪器发展成定量分析的测量仪器。同时还出现了可用来

    2024年02月05日
    浏览(36)
  • JavaScript多功能甘特图组件 - jsGantt

    jsGantt 是一个可定制的、灵活的、多语言的甘特图组件,由原生 JavaScript 构建。它使用客户端渲染以获得快速的性能和动态的交互性。非常适用于任何需要交互式时间线或时间表显示的项目。 多语言支持: 通过对多语言的支持,使您的甘特图可以在全球范围内使用。 任务和

    2024年02月12日
    浏览(29)
  • Python实现多功能音乐播放器

    就是用Python做一个简易的音乐播放器,废话不多说,咱们直接开干 当然,今天做这个肯定不是最简单的,最简单的音乐播放器,9行代码足以 知识点和所需模块 1.python基础知识 2.requests库 3.time 4.pygame 5.tkinter 6.线程 环境 windows pycharm 2021.2 python 3.8 简易版的 还有个半成品的,目

    2024年02月11日
    浏览(32)
  • java案例5:多功能手机分析程序

    代码: 测试类: Phone类:

    2024年02月08日
    浏览(37)
  • 多功能电压输出家用应急电源设计

    摘要 本设计基于STC89C52单片机设计的多功能电压输出应急电源,以应急电源为研究对象,单片机设计为控制集成IC,ADC为模数转换控制模块,无源蜂鸣器作为报警电路。系统分为单片机设计最小系统,AD转换控制模块,电源电路,无源蜂鸣器报警电路,功能键输入电路。选择了

    2024年02月10日
    浏览(41)
  • 多功能视频处理器——MS1826

    MS1826 是一款多功能视频处理器,包含4路独立HDM1音视频输入通道、4路独立HDMI音视频输出通道以及4路独立可配置为输入或者输出的SPDIF、I2S音频信号。支持4个独立的字库定制型OSD;可处理隔行和逐行视频或者图形输入信号;有四路独立视频播放引擎可支持视频多路播放。   输

    2023年04月16日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包