C# winforms 窗口延迟初始化 splash 定时器

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


窗口启动的时候如果处理比较多,界面显示比较慢,这是比较抓狂的。

有几个解决之道,比如加个splash,但是对于winforms程序,加splash可能遇到麻烦。

winfroms程序要从Main函数的最后一句"Application.Run(new FormMain());"启动,在此此句之前可以用Thread显示别的窗口,但是会导致主窗口不能显示在前端,会被隐藏在VS后面(我是从VS运行程序的),试图用TopMost之类简单方法把窗口提到前端,发现不行(网上普遍反映这个方法不行,能用的方法需要直接调用WinAPI,麻烦)。

所以最后用了更简单的办法来解决:延迟初始化。

窗口的初始化主要在构造函数和Load事件里,把里面的复杂处理统统移出来,放在窗口显示之后处理,具体要增加一个定时器控制在窗口显示之后执行其余初始化。

一、给form添加定时器

从工具箱找到定时器:

添加到设计器上:

因为定时器是不可见组件,所以会出现在窗口下面。可以设置属性,修改名称,定时器默认是没有启用的,这符合要求,我们会在代码里设置并定时器。修改定时器名字,然后双击定时器就可以进入定时器的触发事件了。

二、定时器事件

定时器事件叫Tick,双击就可以自动生成,然后修改代码:

cs 复制代码
		private bool init_once = false;//控制初始化只执行一次
		private void timer_init_once_Tick(object sender, EventArgs e)
		{
			if (init_once) return;
			init_once = true;
			timer_init_once.Enabled = false;//只执行一次

			Cursor oldcursor = this.Cursor;
			this.Cursor = Cursors.WaitCursor;

			Init();

			this.Cursor = oldcursor;
		}

增加一个变量"bool init_once"来控制不要重复执行,因为从事件触发到执行事件代码的间隔是不确定的,最理想是用个互斥对象,这里比较草率了,使用了不严格的互斥处理。

进入事件处理立即关闭了定时器(定时器是在Load里启动的),然后设置了等待光标。

Init()里面是实际的初始化代码。

三、构造函数和Load事件

构造函数里能不做的事就别做了,new 对象也可以放到后面去,设置了等待光标嘛,不用担心用户提前操作。

Load事件里面只启动定时器,别的也都延迟去做:

cs 复制代码
		private void FormMain_Load(object sender, EventArgs e)
		{
			timer_init_once.Interval = 10;
			timer_init_once.Enabled = true;
        }

定时器间隔设置了10毫秒,具体多少应该是没所谓的。窗口会先显示,然后定时器计时,触发初始化......嗯,这里有个BUG,应该在这里设置等待光标的,不然存在一个短暂的可操作间隔。


(这里是文档结束)

相关推荐
(Charon)19 分钟前
【C++面试】线程并发与异步:区别、实现原理及使用场景
开发语言·c++
AIFQuant32 分钟前
Python A股实时行情API接入:沪深股票数据与WebSocket推送实战
开发语言·python·websocket·金融·a股行情
字节暗面37 分钟前
客户端上报不可信:游戏服务端数据校验与对局重演设计
c#·游戏开发·服务端校验·反作弊
2302_8057710741 分钟前
Day23:POM设计模式(封装)
java·开发语言·设计模式
十年Java程序媛44 分钟前
Java String、StringBuilder、StringBuffer 底层原理|字符串拼接性能与线程安全
java·开发语言·spring boot·安全·面试
Cx330❀44 分钟前
Qt 界面美化指南:从零掌握 QSS 核心机制与工程实践
开发语言·qt·ui·性能优化·图形渲染
可乐ea1 小时前
2000 个智能体把 Agent 重写成 Rust:编排流水线拆解
开发语言·后端·rust·多智能体协作·ai编程助手·智能体编排·rust重写
我是人✓1 小时前
SpringMVC异常处理与拦截器实战揭秘
java·开发语言·后端
不是万能的豆学长1 小时前
排查Go服务40天后的内存泄漏问题
开发语言·后端·golang·go
码匠许师傅1 小时前
【C++三方组件】libpqxx:PostgreSQL 的 C++ 客户端
开发语言·c++·postgresql