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

ops/2024/9/25 23:25:09/

前言:

        好长时间没有再写博文了,最近项目有个需求,无人值守程序需要一个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.ppmy.cn/ops/29149.html

相关文章

图搜索算法详解与示例代码

在计算机科学领域&#xff0c;图搜索算法是一类用于在图数据结构中查找特定节点或路径的算法。图搜索算法在许多领域都有着广泛的应用&#xff0c;包括网络路由、社交网络分析、游戏开发等。本文将详细介绍几种常见的图搜索算法&#xff0c;包括深度优先搜索&#xff08;DFS&am…

【机器学习】机器学习在教育领域的应用场景探索

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

【C++ 容器 set】set的相关用法

博主首页&#xff1a; 有趣的中国人 专栏首页&#xff1a; C进阶 其它专栏&#xff1a; C初阶 | 初阶数据结构 | Linux 博主会持续更新 本篇文章主要讲解 C容器set的相关用法 的相关内容 文章目录 1. 关联式容器2. 树形结构的关联式容器3. set的介绍以及相关使用操作3.1 se…

使用webpack给大屏自适应插件autofit.js增加umd打包方式

最近有个大屏自适应的需求&#xff0c;而且想直接通过script标签来引入自适应的插件js&#xff0c;搜索相中了autofit.js&#xff0c;可惜不支持umd格式的引入&#xff0c;虽然也能直接copy源码&#xff0c;但是还是折腾下给它打包成umd格式的代码。 fork源码&#xff0c;克隆…

rust语言tokio库spawn, blocking_spawn等的使用

目录 tokio的spawn以及spawn_blocking的使用tokio::task::spawn方法解析tokio::task::spawn_blocking()方法解析 时间会遗忘一切 最后更新时间2024.04.29 tokio版本&#xff1a; tokio的spawn以及spawn_blocking的使用 tokio::task::spawn方法解析 tokio的实现原理以及源码…

【Leetcode每日一题】 动态规划 - 简单多状态 dp 问题 - 删除并获得点数(难度⭐⭐)(70)

1. 题目解析 题目链接&#xff1a;740. 删除并获得点数 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 问题分析 本题是「打家劫舍」问题的变种&#xff0c;但核心逻辑依然保持一致。题目要求从给定的数组nums中选择…

python flask 假死情况处理+https证书添加

前言 当使用flask编写了后台程序跑在服务器端的时候&#xff0c;有时候虽然后台中显示在运行&#xff0c;但是页面无法访问&#xff0c;出现这个情况可以使用如下方法修改代码&#xff0c;进而防止假死&#xff0c;另外记录下flask下证书的添加。 假死处理 出现进程存在&…