拌合楼管理系统(十六)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());
        }
    }
}

总结:

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

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-26 15:04:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-26 15:04:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-26 15:04:02       87 阅读
  4. Python语言-面向对象

    2024-04-26 15:04:02       96 阅读

热门阅读

  1. 修改k8s kube-proxy转发为ipvs

    2024-04-26 15:04:02       126 阅读
  2. CLion的详细介绍

    2024-04-26 15:04:02       129 阅读
  3. 20240425-线程基础-线程的使用(一)

    2024-04-26 15:04:02       42 阅读
  4. 使用脚本定时备份MySql数据库文件

    2024-04-26 15:04:02       175 阅读
  5. 深入理解汇编中的ZF、OF、SF标志位和条件跳转

    2024-04-26 15:04:02       35 阅读
  6. 若依ruoyi-vue前端组件的使用指南

    2024-04-26 15:04:02       37 阅读
  7. c++17--iota

    2024-04-26 15:04:02       36 阅读
  8. scipy.sparse.lil_matrix

    2024-04-26 15:04:02       31 阅读
  9. 创始人内容:个人及家族的各个事业。

    2024-04-26 15:04:02       39 阅读