因为主界面载入时候,其中几张表格会有一个读数据库初始化的过程,想将数据读出来初始化后一起显示出来。
所以考虑让主窗体生成后延迟2秒显示出来。利用了定时器来实现。不过尝试了几个方法之后,效果都不是很理想。
主要尝试的方法有
1、在Form_Load之中加入form1.Hide(); //感觉加进去这个函数根本没起作用。
2、构造form1函数之中加入form1.hide();//效果跟方法1一样。
3、利用事件Shown//发现主窗体在生成之后,会出现一次,然后再消失,效果还是不好
4、用visiable = false尝试了下1、2方法,感觉跟用hide没什么两样。
快郁闷死了,求教各位给个思路

解决方案 »

  1.   

    winForm窗体淡入淡出效果
    /// <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的值。
      

  2.   

    如果是winform程序的话,你可以在program.cs的main函数中去完成这些操作
    在Application.Run(new Form1());之前加入你要做的事
    同意楼上的说法,你需要告诉用户程序已经启动了,而不是让用户以为程序死掉了
      

  3.   


    对,做一个启动窗体,很多软件都有的像Photoshop的,最好有提示和加载进度显示,这样让用户知道软件在运行,这是一种很好的用户交互设计,如果你不做任何提示的情况下用户等待超过2秒钟,就会感觉到无法忍受,如果你有进度提示的话,超过5秒钟甚至都不会感觉太久
      

  4.   

    Application.Run(new Form1());这里改成你的欢迎窗体,在欢迎窗体中启动你的主窗体
      

  5.   

    这样做也不好,再改一下
    Application.Run(new 欢迎窗体());
    Application.Run(new 主窗体());
    这样欢迎窗体关闭后会自动启动主窗体
      

  6.   

    这个方法不好,如果关闭欢迎界面整个程序会退出,最好在Application.Run之前用ShowDialog显示欢迎界面,欢迎界面设置定时器关闭自己,
      

  7.   

    两次Run我还没试过,看起来很新奇不知道行不行,呵呵,
      

  8.   

    Application.Run(new Form1());这个函数是要等窗体Form1关闭了,才会执行下一个
    这样子对于我来讲,跟在Form_Load里面加载Form2.ShowDialog()效果是一样,都是阻塞主窗体的运行。
    问题时显示欢迎窗体时,我需要主窗体同时进行初始化操作……
      

  9.   


    既然不是第一个显示的窗体,这个窗体就根本不应该设计为主窗体。只要你另外搞一个主窗体,一切都迎刃而解。主窗体(或者欢迎界面窗体)可以new出来主窗体,并且注册其 Closed 事件,等它关闭了就自动关闭自己。
      

  10.   

    在打开前 执行这句  
    程序暂停1秒
    System.Threading.Thread.Sleep(1000);
      

  11.   

    我需要显示的主窗体,因为进行数据库交互操作,界面上表格数据显示感觉会有一秒左右的延时,我的目的是想等这些数据初始化完成后,将整个界面一起显示,所以想让窗体初始化时候不显示,等延迟个几秒再显示出来。
    所以欢迎界面是用来拖延这段初始化时间的。单纯打开关闭的话对于我最初的目的相左了
    请不要再讨论窗体关闭打开的问题了 >_<"
      

  12.   

    主窗体(或者欢迎界面窗体)可以new出来主窗体  -->  主窗体(或者欢迎界面窗体)可以new出来这个交互窗体
      

  13.   

    public partial class LoadForm : Form
        {
            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();
            }
      

  14.   

    System.Threading.Thread.Sleep也是阻塞进程的等待,如果你用在界面初始化的话,你会发现,你的整个界面就像是死机一样的效果。讨论那么多,我现在明白了,我就是想知道有没有让一个窗体,一出生就把自己不留痕迹的隐藏掉的方法就像葫芦娃七兄弟中六娃的本领 “Orz
      

  15.   

    举个例子
     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(); 
            }
      

  16.   

    我刚才说的例子是一种方式,还有一种
    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);
            }
        }