因为主界面载入时候,其中几张表格会有一个读数据库初始化的过程,想将数据读出来初始化后一起显示出来。
所以考虑让主窗体生成后延迟2秒显示出来。利用了定时器来实现。不过尝试了几个方法之后,效果都不是很理想。
主要尝试的方法有
1、在Form_Load之中加入form1.Hide(); //感觉加进去这个函数根本没起作用。
2、构造form1函数之中加入form1.hide();//效果跟方法1一样。
3、利用事件Shown//发现主窗体在生成之后,会出现一次,然后再消失,效果还是不好
4、用visiable = false尝试了下1、2方法,感觉跟用hide没什么两样。
快郁闷死了,求教各位给个思路
所以考虑让主窗体生成后延迟2秒显示出来。利用了定时器来实现。不过尝试了几个方法之后,效果都不是很理想。
主要尝试的方法有
1、在Form_Load之中加入form1.Hide(); //感觉加进去这个函数根本没起作用。
2、构造form1函数之中加入form1.hide();//效果跟方法1一样。
3、利用事件Shown//发现主窗体在生成之后,会出现一次,然后再消失,效果还是不好
4、用visiable = false尝试了下1、2方法,感觉跟用hide没什么两样。
快郁闷死了,求教各位给个思路
解决方案 »
- PictureBox.Image 为null
- vs add-in Context Menu 为何不能触发事件?
- gridview动态绑定数据,如何将删除编辑列放到最后一列
- ArrayList[]=new ArrayList[]?
- 用dotmsn开发过MSN机器人,问个有关dotmsn的问题
- 关于弹出窗体的问题
- 我该如何C#中调用ShellExecute???
- 有没有办法截获WebBrowser控件向服务器发送的请求以及接收到的响应信息
- C#如何把一个string数组中不同的数据给另一个string数组
- 为什么我设置了TabIndex=0,开始运行后还是跑到另外一个按钮上去了?
- 小妹请教查找TreeView父节点和子节点的问题。
- 求助:Windows 2008 IIS 7 发布网站图片不显示
/// <summary>
/// 窗体动画函数
/// </summary>
/// <param name="hwnd">指定产生动画的窗口的句柄</param>
/// <param name="dwTime">指定动画持续的时间</param>
/// <param name="dwFlags">指定动画类型,可以是一个或多个标志的组合。</param>
/// <returns></returns>
[DllImport("user32")]
private static extern bool AnimateWindow(IntPtr hwnd, int dwTime, int dwFlags);//下面是可用的常量,根据不同的动画效果声明自己需要的private const int AW_HOR_POSITIVE = 0x0001;//自左向右显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
private const int AW_HOR_NEGATIVE = 0x0002;//自右向左显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
private const int AW_VER_POSITIVE = 0x0004;//自顶向下显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志
private const int AW_VER_NEGATIVE = 0x0008;//自下向上显示窗口,该标志可以在滚动动画和滑动动画中使用。使用AW_CENTER标志时忽略该标志该标志
private const int AW_CENTER = 0x0010;//若使用了AW_HIDE标志,则使窗口向内重叠;否则向外扩展
private const int AW_HIDE = 0x10000;//隐藏窗口
private const int AW_ACTIVE = 0x20000;//激活窗口,在使用了AW_HIDE标志后不要使用这个标志
private const int AW_SLIDE = 0x40000;//使用滑动类型动画效果,默认为滚动动画类型,当使用AW_CENTER标志时,这个标志就被忽略
private const int AW_BLEND = 0x80000;//使用淡入淡出效果窗体代码(将窗体的FormBorderStyle属性设置为none):private void Form1_Load(object sender, EventArgs e)
{
int x = Screen.PrimaryScreen.WorkingArea.Right - this.Width;
int y = Screen.PrimaryScreen.WorkingArea.Bottom - this.Height;
this.Location = new Point(x, y);//设置窗体在屏幕右下角显示
AnimateWindow(this.Handle, 1000, AW_SLIDE | AW_ACTIVE | AW_VER_NEGATIVE);
}private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
AnimateWindow(this.Handle, 1000, AW_BLEND | AW_HIDE);
}//其他效果,可以更换上面的常量,初始位置可以更改x,y的值。
在Application.Run(new Form1());之前加入你要做的事
同意楼上的说法,你需要告诉用户程序已经启动了,而不是让用户以为程序死掉了
对,做一个启动窗体,很多软件都有的像Photoshop的,最好有提示和加载进度显示,这样让用户知道软件在运行,这是一种很好的用户交互设计,如果你不做任何提示的情况下用户等待超过2秒钟,就会感觉到无法忍受,如果你有进度提示的话,超过5秒钟甚至都不会感觉太久
Application.Run(new 欢迎窗体());
Application.Run(new 主窗体());
这样欢迎窗体关闭后会自动启动主窗体
这样子对于我来讲,跟在Form_Load里面加载Form2.ShowDialog()效果是一样,都是阻塞主窗体的运行。
问题时显示欢迎窗体时,我需要主窗体同时进行初始化操作……
既然不是第一个显示的窗体,这个窗体就根本不应该设计为主窗体。只要你另外搞一个主窗体,一切都迎刃而解。主窗体(或者欢迎界面窗体)可以new出来主窗体,并且注册其 Closed 事件,等它关闭了就自动关闭自己。
程序暂停1秒
System.Threading.Thread.Sleep(1000);
所以欢迎界面是用来拖延这段初始化时间的。单纯打开关闭的话对于我最初的目的相左了
请不要再讨论窗体关闭打开的问题了 >_<"
{
private const int WM_NCHITTEST = 0x84;
private const int HTCLIENT = 0x01;
private const int HTCAPTION = 0x02;
private FrmTestTool frm;
public LoadForm()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCHITTEST:
base.WndProc(ref m);
if ((int)m.Result == HTCLIENT)
{
m.Result = (IntPtr)HTCAPTION;
}
return;
}
base.WndProc(ref m);
}
private void LoadSource()
{
var dt = new DirectoryInfo("../Scene");
var max = dt.GetFiles().Where(f => !f.Name.Contains("S")).Count();
progressBar1.Maximum = max;
SceneMgr.LoadScene += new EventHandler<jy.DataEventArgs<string>>(SceneMgr_LoadScene);
SceneMgr.Increment += new EventHandler(SceneMgr_Increment);
SceneMgr.LoadComplete += new EventHandler(SceneMgr_LoadOk);
lblStatus.Text = "开始加载技能资源";
Application.DoEvents();
SkillMgr.GetSkillMgr();
SceneMgr.GetSceneMgr();
} void SceneMgr_LoadOk(object sender, EventArgs e)
{
lblStatus.Text = "资源加载已完成";
lblStatus.ForeColor = Color.Green;
Application.DoEvents();
Thread.Sleep(100);
this.Hide();
frm.Show();
} void SceneMgr_Increment(object sender, EventArgs e)
{
progressBar1.Increment(1);
} void SceneMgr_LoadScene(object sender, jy.DataEventArgs<string> e)
{
lblStatus.Text = "正在加载资源" + e.Arg1; Application.DoEvents();
} private void LoadForm_Shown(object sender, EventArgs e)
{
frm = new FrmTestTool();
LoadSource();
} private void label1_Click(object sender, EventArgs e)
{
Application.Exit();
}
public class SceneMgr
{
public static event EventHandler LoadComplete;
private SceneMgr()
{
LoadSceneFiles();
}
/// <summary>
/// 获取场景管理器单例
/// </summary>
/// <returns></returns>
public static SceneMgr GetSceneMgr()
{
if (_sm == null)
{
Mutex mu = new Mutex();
mu.WaitOne(); if (_sm == null)
{
_sm = new SceneMgr();
}
if (LoadComplete != null)
{
LoadComplete(null, null);
}
mu.Close();
}
return _sm;
}}public partial class LoadForm : Form
{
private void LoadSource()
{
SceneMgr.LoadComplete += new EventHandler(SceneMgr_LoadOk);
lblStatus.Text = "开始加载技能资源";
Application.DoEvents();
SceneMgr.GetSceneMgr();
}
}
void SceneMgr_LoadOk(object sender, EventArgs e)
{
lblStatus.Text = "资源加载已完成";
lblStatus.ForeColor = Color.Green;
Application.DoEvents();
Thread.Sleep(100);
this.Hide();
frm.Show();
}
static class Program
{
private static frmMain _mainForm = null;
private static frmStartup _startForm = null; /// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); _startForm = new frmStartup();
_startForm.Show(); _mainForm = new frmMain();
_mainForm.Loaded += new EventHandler(_mainForm_Loaded); Application.Run(_mainForm);
} static void _mainForm_Loaded(object sender, EventArgs e)
{
_startForm.Close();
_startForm = null;
} static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
if (_startForm != null)
_startForm.Close();
_mainForm.Hook.ShowProcess("Ready", false);
AppLog.LogError(e.Exception.ToString());
MessageBox.Show(e.Exception.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}