拌合楼管理系统(十六)c#如何实现点击同时启动两个窗体,并且窗体全部关闭后才退出程序

前言:

        好长时间没有再写博文了,最近项目有个需求,无人值守程序需要一个client端,主要实现两个功能,一个是显示安装的四个监控的画面,一个是显示地磅称重数量和车牌列表等一些信息。今天主要解决如何显示两个窗体,并且让窗体显示在屏幕右侧。


一、最终达到的效果:

        两个窗体,运行程序后显示在屏幕靠右侧位置,且过磅信息的窗口在监控画面窗口的下面。并且两个窗口全部关闭后,整个程序才退出来。

二、代码实现

        1. 创建两个窗体

        这个操作so easy,就不在这里演示了,我创建的就一个Form1,一个Form2

       2.  设置窗体的启动位置

        这一步很关键,我发现很多代码都没有提到,最后接过就是你后面怎么跑,窗体显示的位置都没有按照你的逻辑的来。

        这里StartPosition一定要改成  Manual, 默认是WindowsDefaultLocation

        3.  创建一个类继承ApplicationContext

        在类的构造函数中定义窗体启动所在的位置,Form1作为监控视频窗体,右端靠近屏幕右边,那么Form1的location 的x坐标就是  屏幕的宽度 -  Form1的窗体宽度。 Y我给他赋值为10,不用顶着上边就好。 对Form2 它的x坐标和Form1一样,他Y坐标就应该是  Form1的Y坐标 +  From1的高度,同样为了不让Form2和Form1 太贴近,我也给了10的宽度,Form2的Y坐标就是  Form1的高度+ 20  具体代码如下:        

            Screen[] sc = Screen.AllScreens;Form2  f2 = new Form2();    Form1 f1 = new Form1();f1.Location = new Point(sc[1].WorkingArea.Width - f1.Width,10);f2.Location = new Point(f1.Location.X,  f1.Height + 20);f1.Show();f2.Show();

        第一行代码获取电脑所有的屏幕,第一屏就是 sc[1] , 目前暂时没有多屏幕显示的需求,如果有后面再完善代码。

        4.  定义处理窗体关闭的事件处理过程                

   private void onFormClose(object sender, EventArgs e) {if (Application.OpenForms.Count == 0) { ExitThread();}}

        逻辑很简单,检测到当前没有打开的窗体,那么才关闭进程。 注意这里我走了些弯路,以为回自动触发,实际上还需要在构造函数进行事件和过程的关联才可以生效。

    f1.FormClosed += onFormClose;f2.FormClosed += onFormClose;

        5. 修改Program中的启动类

   Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new MyWindow());

三、完整的代码        

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace TwoWindowsTest
{internal   class MyWindow:ApplicationContext{public MyWindow() {Screen[] sc = Screen.AllScreens;Form2  f2 = new Form2();    Form1 f1 = new Form1();f1.Location = new Point(sc[1].WorkingArea.Width - f1.Width,10);f2.Location = new Point(f1.Location.X,  f1.Height + 20);f1.Show();f2.Show();f1.FormClosed += onFormClose;f2.FormClosed += onFormClose;}private void onFormClose(object sender, EventArgs e) {if (Application.OpenForms.Count == 0) { ExitThread();}}}
}
namespace TwoWindowsTest
{internal static class Program{/// <summary>///  The main entry point for the application./// </summary>[STAThread]static void Main(){// To customize application configuration such as set high DPI settings or default font,// see https://aka.ms/applicationconfiguration.//  ApplicationConfiguration.Initialize();Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Application.Run(new MyWindow());}}
}

总结:

        功能实现的代码并不复杂,主要是窗体定位的逻辑和一些细节问题的注意了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/652023.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构师系统-Docker(五)-镜像仓库

镜像仓库管理 docker仓库&#xff0c;用来管理镜像 主要分为公共仓库和私人仓库&#xff0c;下面介绍了公共仓库Docker Hub、私人仓库Registry和harbor DockerHUb仓库管理 什么是DockerHUb 保存和分发镜像的最直接方法就是使用 Docker Hub Docker Hub 是 Docker 公司维护的公…

Unreal Engine创建Plugin

打开UE工程&#xff0c;点击编辑&#xff0c;选择插件 点击“新插件”按钮&#xff0c;选择“空白选项”填入插件名字"MultiPlayerPlugin"&#xff0c;填入插件作者、描述&#xff0c;点击“创建插件”按钮打开C工程&#xff0c;即可看到插件目录&#xff0c;编译C工…

ShardingSphere 5.x 系列【25】 数据分片原理之 SQL 解析

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 分片执行流程1.1 Simple Push Down1.2 SQL Federation2. SQL 解析2.1 解析…

【003_音频开发_基础篇_Linux进程通信(20种你了解几种?)】

003_音频开发_基础篇_Linux进程通信&#xff08;20种你了解几种&#xff1f;) 文章目录 003_音频开发_基础篇_Linux进程通信&#xff08;20种你了解几种&#xff1f;)创作背景Linux 进程通信类型fork() 函数fork() 输出 2 次fork() 输出 8 次fork() 返回值fork() 创建子进程 方…

RDD编程初级实践

参考链接 spark入门实战系列--8MLlib spark 实战_mob6454cc68310b的技术博客_51CTO博客https://blog.51cto.com/u_16099212/7454034 Spark和Hadoop的安装-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/138021948?spm1001.2014.3001.5501 1. spark-shell…

【python】语言学习笔记--用来记录总结

请问以下变量哪些是tuple类型&#xff1a; a ()b (1)c [2]d (3,)e (4,5,6)answer在Python中&#xff0c;元组&#xff08;tuple&#xff09;是由逗号分隔的一组值组成的有序序列&#xff0c;通常用圆括号括起来。让我们逐个检查变量&#xff0c;看哪些是元组类型&#xff…

C#基础之冒泡排序

排序初探 文章目录 冒泡排序1、概念2、冒泡排序的基本原理3、代码实现思考1 随机数冒泡排序思考2 函数实现排序 冒泡排序 1、概念 将一组无序的记录序列调整为有序的记录序列&#xff08;升、降序&#xff09; 2、冒泡排序的基本原理 两两相邻&#xff0c;不停比较&#x…

海外仓精细化管理方法:ABC库存分析,大幅提升仓库有效利用率

ABC分析是海外仓管理的一种比较有效的方法&#xff0c;主要是帮助评估库存产品对仓库的价值量大小。这是一种根据需求、成本和风险数据等因素综合进行的评估&#xff0c;通过评估&#xff0c;仓管员可以更有效的组织和安排仓库产品&#xff0c;提升仓库的有效利用率&#xff0c…

微信小程序:11.本地生活小程序制作

开发工具&#xff1a; 微信开发者工具apifox进行创先Mock 项目初始化 新建小程序项目输入ID选择不使用云开发&#xff0c;js传统模版在project.private.config中setting配置项中配置checkinalidKey&#xff1a;false 梳理项目结构 因为该项目有三个tabbar所以我们要创建三…

交换排序-冒泡排序 快速排序

目录 3.1 冒泡排序 3.2 快速排序 Hoare版本快速排序 挖坑法快速排序 前后指针法快速排序 快速排序优化-三数取中法 快速排序非递归 3.1 冒泡排序 思想&#xff1a;升序情况下&#xff1a;左边大于右边就进行交换&#xff0c;每一次把最大的放在最后一位。 void Swap(int…

微信小程序:6.事件

什么事事件 事件就是渲染层到逻辑层的通讯方式&#xff0c;比如提交表单&#xff0c;按钮点击都可以看作一个事件。 小程序中常用的事件 事件对象属性列表 当事件回调时&#xff0c;会收到一个事件对象event&#xff0c;他详细属性如夏表所示&#xff1a; target和curren…

web(微博发布案例)

示例&#xff1a; 1、检测空白内容 2、发布内容 html: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta …