C# WinForm开发——窗体问题

article/2025/8/21 19:44:55

  本文讨论了C# WinForm开发中关于 窗体 的一些问题,如:单文档与多文档程序避免同一窗体多次打开多文档程序子窗体显示跨窗体传值高分屏(125%)下控件字体变模糊等,下面一一阐述。

目录

  • 1 单文档与多文档程序
    • 1.1 单文档程序
    • 1.2 多文档程序
  • 2 避免同一窗体多次打开
    • 2.1 单文档窗体情况
    • 2.2 多文档窗体情况
  • 3 多文档程序子窗体显示
    • 3.1 父窗体不含容器控件
    • 3.2 父窗体含有容器控件
  • 4 跨窗体传值
  • 5 高分屏下控件字体变模糊
    • 5.1 解决方案
    • 5.2 应用实例

1 单文档与多文档程序

1.1 单文档程序

  什么是 单文档程序(SDI) ——单个文档、窗体或多个独立窗体组成,且每次只能处理一个当前激活的文档,如画图工具、文本文档等。以下便是一个单文档程序:
单文档程序

当然,拥有若干(≥2)独立窗体的程序也是单文档程序(即SDI)!

1.2 多文档程序

  什么是 多文档程序(MDI) ——多个文档或窗体组成(同一公共界面之下),常分为父窗体、子窗体。多文档应用程序可同时打开多个子窗体,但只能有一个处于激活状态,如Excel。其实,MDI并未引进其他高级技术——它仅是把具有多窗体的SDI改造成MDI了。下面展示一个多文档程序:
多文档程序

其代码如下:

private void frmMain_Load(object sender, EventArgs e){//this.IsMdiContainer = true;//【属性界面】也可设置//this.WindowState = FormWindowState.Maximized;frmChildOne childOne = new frmChildOne();childOne.MdiParent = this;//设置父窗体childOne.Show();frmChildTwo childTwo = new frmChildTwo();childTwo.MdiParent = this;childTwo.Show();this.LayoutMdi(MdiLayout.TileHorizontal);//子窗体排列方式}

2 避免同一窗体多次打开

2.1 单文档窗体情况

  打开窗体代码:

private void toolStripOpenWnd_Click(object sender, EventArgs e){if (Application.OpenForms["frmTwo"] == null){frmTwo frm2 = new frmTwo();frm2.StartPosition = FormStartPosition.CenterScreen;//居中frm2.Show();return;}Application.OpenForms["frmTwo"].WindowState = FormWindowState.Normal;//正常显示}

  运行效果(多次点击【打开窗体】):
避免同一窗体多次打开—SDI窗体

2.2 多文档窗体情况

  打开子窗体代码:

private bool IsChildfrmOpen(string childName){foreach(var frm in this.MdiChildren){if (frm.Name == childName){frm.WindowState = FormWindowState.Normal;//正常显示return true;}}return false;}private void toolStripOpenWnd_Click(object sender, EventArgs e){if (IsChildfrmOpen("frmTwo")){return;}frmTwo frm2 = new frmTwo();frm2.MdiParent = this;frm2.StartPosition = FormStartPosition.CenterScreen;//居中frm2.Show();}

  运行效果(多次点击【打开窗体】):
避免同一窗体多次打开—MDI窗体

3 多文档程序子窗体显示

3.1 父窗体不含容器控件

  界面设计:
MDI父窗体无容器控件

  显示子窗体代码:

//IsChildfrmOpen函数请参考本文2.2节
private void toolStripOpenWnd_Click(object sender, EventArgs e){if (IsChildfrmOpen("frmTwo")){return;}frmTwo frm2 = new frmTwo();frm2.MdiParent = this;frm2.StartPosition = FormStartPosition.CenterScreen;//居中frm2.Show();}

3.2 父窗体含有容器控件

  界面设计(父窗体含GroupBox控件):
MDI父窗体含容器控件

若使用3.1节代码,则 MDI子窗体被容器控件遮挡(子窗体已show,但被遮挡):
MDI子窗体被容器控件遮挡

  有效的子窗体显示代码:

using System.Runtime.InteropServices;
/*----------------------------------------*//*-------------------以下置于Form类里-------------------*/
[DllImport("user32")] //类里面public static extern int SetParent(int hWndChild, int hWndNewParent);private void toolStripOpenWnd_Click(object sender, EventArgs e){if (IsChildfrmOpen("frmTwo")){return;}frmTwo frm2 = new frmTwo();frm2.MdiParent = this;frm2.StartPosition = FormStartPosition.CenterScreen;//居中frm2.Show();SetParent((int)frm2.Handle, (int)this.Handle);}
/*---------------------------------------------------------*/

运行效果:
MDI父窗体含容器时正确显示子窗体

4 跨窗体传值

  WinForm中跨窗体传值一般使用:

  • 窗体级静态字段;
  • 窗体Tag属性;
  • App.config配置文件;
  • 委托事件方法、公有属性方法;
  • ……

  可参考:C#两种子父窗体传值方法。

5 高分屏下控件字体变模糊

5.1 解决方案

  如使用 VS2017+Windows10创建WinForm程序,系统会提示:
高分屏系统提示

运行时,控件上的字体变得模糊:
高分屏下控件字体模糊

解决方案(C# WinForm在高分屏(125%)下运行变模糊):【右键项目】(解决方案资源管理器之下)→【添加】→【类】→【应用程序清单文件】→【取消注释—dpiAware】。
高分屏解决方案

5.2 应用实例

  在VS2017中,若不解决【高分屏(125%)问题】,则状态栏控件StatusStrip极可能不正常显示,如下图(将状态栏StatusStrip 分成左中右三部分,右边显示当前时间):
statusstrip不正常显示

5.1节的解决方案处理后,运行效果如下:
statusstrip正常显示


http://chatgpt.dhexx.cn/article/Dqh2nQRy.shtml

相关文章

winform开发框架介绍

winform开发框架,尽量减少程序员在界面中的代码量和工作量,Model自动生成,界面以及控件自动生成,简单的逻辑自动生成。自动生成的界面已经实现简单逻辑增删改查功能。 其他开发框架都已经或多火烧实现了这些功能,如果…

C# Winform应用系统如何快速开发?看完这篇文章就懂了

在实际的业务中,往往还有很多需要使用Winform来开发应用系统的,如一些HIS、MIS、MES等系统,由于Winform开发出来的系统界面友好,响应快速,开发效率高等各方面原因,还有一些原因是独立的WInform应用系统方便…

C# winform 开发总结 -- 【持续更新】

此文章将记录我在C# Winform 开发过程中遇到的问题及相关知识技术点 ,方便自己以后查阅..... 博客列表: https://blog.csdn.net/column/details/winfrom-aps-net.html C# 在多线程中如何调用Winform 问题的产生:   我的WinForm程序中有一个用于更新主…

C#WinForm开发笔记——基本控件(一)

C#学习笔记——WinForm开发 一、WinForm应用程序1、VS创建WinForm桌面应用程序1>新建窗体2>添加新的窗体3>窗体 2、VS各图标表示的含义3、VS各种细节 二、控件1、Button1>属性2>事件 2、Label3、TextBox1>属性2>事件 4、Timer1>属性 5、RadioButton1&g…

C# WinForm开发框架

自己一直想有一个完全属于自己的编程小框架,之前使用的方式是将每一个窗体文件都编译为一个DLL文件,在新建窗体的时候首先新建一个类,然后在这个类 里面新建窗体,编译之后就是一个DLL文件,最后通过一个函数去读取这个D…

winform开发心得

最近一直在从事winform的开发,每次都是需要从网上查找资料才能对应具体风格要求,现在总结一下。 ui方面可以使用CSkin对应的一套ui,使用步骤 1.在窗口界面,工具箱空白处点击右键,弹出菜单有个”选择项“,点…

C# WinForm开发

文章目录 C# WinForm开发1.创建C# WinForm项目a.进入项目界面b.项目结构c.自定义一个Form 2.给控件添加事件3.显示时间小项目4.控件5.几种布局a.FlowLayoutPanel 流式布局b.TableLayoutPanel 表格布局c.可以自定义控件 6.文本框7.CheckBox 复选框8.其他的一些控件9.资源文件10.…

手把手教你新建一个winform项目(史上最全)

文章目录 前言:第1步、打开Microsoft Visual Studio(简称vs),本人这里使用的是Visual Studio 2017 专业版,如下图:1.2 Visual Studio Community 2019下载1.3 Visual Studio Community 2019 安装 第2步、点击…

C# Winform开发教程

目录 1.创建新的Winform工程 2.窗体编辑 2.1 主窗口 2.2 工具箱 3.工具开发 3.1 一些通用属性 3.2 Label 3.3 Button 3.4 CheckBox 3.5 ComboBox 3.6 TreeView 3.7 ContextMenuStrip 3.8 BackgroundWorker 3.9 ProgressBar 3.10 TextBox 3.11 Timer 3.12 Data…

Winform开发技术详解 - 应用环境 相关技术介绍

随着时间的推移,Winform也算是能够坚持下来最久的技术之一了,它的昔日辉煌和现今的依旧活跃,导致了它依旧拥有者很庞大的用户群体,虽然目前很多技术日新月异的,曾经的ASP、ASP.NET WebForm、Asp.NET MVC、WPF等技术基本…

winform开发

winform简介 winform是.Net开发平台中对Windows Form的简称,基于.Net Framework平台 的客户端开发技术,一般使用c#编程。 Windows风格的控件,以及时间,直接使用,开发快速 Windows form:Windows窗体 Window…

实时数据库数据采集接口API八爪鱼采集接口

实时数据库数据采集接口是针对国内外各种实时数据库系统(PI、IP21等)和DCS、PLC等数据源之间的进行实时数据通讯的工具。 主要包含IOServer服务器和IOClient客户端两个部分: IO Server运行在实时数据库服务器上,主要功能是把数据库的位号信息和数据请求…

07_Hudi案例实战、Flink CDC 实时数据采集、Presto、FineBI 报表可视化等

7.第七章 Hudi案例实战 7.1 案例架构 7.2 业务数据 7.2.1 客户信息表 7.2.2 客户意向表 7.2.3 客户线索表 7.2.4 线索申诉表 7.2.5 客户访问咨询记录表 7.3 Flink CDC 实时数据采集 7.3.1 开启MySQL binlog 7.3.2 环境准备 7.3.3 实时采集数据 7.3.3.1 客户信息表 7.3.3.2 客户…

实时数仓项目-实时数据采集

文章目录 第1章 实时需求概览1.1 实时需求与离线需求的比较1.2 数仓架构设计1.2.1 离线image-202101201154530071.2.2 实时 1.3 本项目主要需求1.3.1 当日用户首次登录(日活)分时趋势图,昨日对比1.3.2 当日新增付费用户(首单)分析(odsdwd)1.3…

源码分析 Sentinel 实时数据采集实现原理

本篇将重点关注 Sentienl 实时数据收集,即 Sentienl 具体是如何收集调用信息,以此来判断是否需要触发限流或熔断。 本节目录 1、源码分析 StatisticSlot1.1 StatisticSlot entry 详解1.2 StatisticSlot exit 详解 2、Sentienl Node 体系2、StatisticNod…

ISYSTEM调试实践10-实时数据采集工具daqIDEA

本文介绍一种实时数据采集的工具daqIDEA,该软件整合在了winIDEA内,可以直接通过winIDEA启动。 daqIDEA类似于jlink的jscop,stlink也有类似功能。原理就是利用仿真探头,将程序运行的变量实时采集出来,并通过曲线的方式显…

基于组态王6.55的实时数据采集助手V1.0

采集助手V1.0使用说明采集助手V1.0是基于北京亚控科技的组态王6.55开发的,用于对带485通讯功能的流量计、电能表等智能仪表的实时数据进行采集的程序,可将采集到的数据记录为xls电子表格形式,用于后期分析。 一、主要功能: 1、采…

如何使实时数据采集处理系统保持数据的高速传输

如何使实时数据采集处理系统保持数据的高速传输 1引言 当前,越来越多的设计应用领域要求具有高精度的A/D转换和实时处理功能。在实时数据采集处理系统设计中,一般需要考虑数据采集以及对采集数据的处理。而对于大数据量的实时数据采集处理系…

「山东城商行联盟数据库准实时数据采集系统」入选2021中国大数据应用样板案例

12月17日,由中国信息协会大数据分会主办的“2021中国大数据技术应用大会”在北京圆满落幕。来自中国信息协会、中国工程院、国家信息中心、中国软件评测中心、中国金融认证中心等的权威专家、知名企业代表出席本次大会,对大数据的需求、应用和产业发展进…

实时数据采集无压力,网络抓取基础架构全程保障

作为一位爬虫工程师,网络抓取是我在日常工作中的重要任务之一。在当今信息爆炸的时代,实时数据的价值愈发显著。对于企业和个人来说,准确及时地获取最新的数据信息,能够帮助做出更明智的决策,抓住商机,甚至…