前言:
好长时间没有再写博文了,最近项目有个需求,无人值守程序需要一个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());
}
}
}
总结:
功能实现的代码并不复杂,主要是窗体定位的逻辑和一些细节问题的注意了。