IssueVision的两个不是问题的问题

最近在用Smart Client写范本,由于是第一次用SC,再加上平时写WinForm比较少,所以拿TaskVision和IssueVision作为参考.昨天看了IssueVision的登陆的实现过程,发现了两个小小的问题.

第一个问题
IV登陆窗口有点酷,是渐渐显示的(渐显),看了下面代码

        private void fadeTimer_Tick(object sender, EventArgs e)
        {
            
if (m_showing)
            {
                
double d = 1000.0 / fadeTimer.Interval / 100.0;
                
if (Opacity + d >= 1.0)
                {
                    Opacity 
= 1.0;                                                    
                    fadeTimer.Stop();                                                  //fadeTimer从命名上看知道应该是个显示/隐的定时器.
                }
                
else
                {
                    Opacity 
+= d;                                                        //控制窗口的不透明度.
                }
            }
            
else
            {
                
double d = 1000.0 / fadeTimer.Interval / 100.0;
                
if (Opacity - d <= 0.0)
                {
                    Opacity 
= 0.0;
                    fadeTimer.Stop();
                }
                
else
                {
                    Opacity 
-= d;
                }
            }
        }

注意到这段代码的else部分,从程序上看应该是渐隐.
再看一下Closing事件
        private void LoginForm_Closing(object sender, CancelEventArgs e)
        {
            m_showing 
= false;
            fadeTimer.Start();
        }
从LoginForm_Closing可以看出窗口是想实现渐隐的,但是实际上关闭窗口时并没有渐隐的效果,Why?

查了一下MSDN的Closing事件
"在窗体关闭时,Closing 事件发生。在窗体关闭后,将释放在该对象内创建的所有资源并处置该窗体。"
我的猜想:
虽然Closing 事件中把fadeTimer重新启动了,但是紧接着窗口就被关闭,窗体资源被释放.窗口都没了,这个渐隐变得没有效果了也是当然的.

改进办法,"若要取消窗体的关闭操作,请将传递给事件处理程序的 CancelEventArgs 的 Cancel 属性设置为 true。"(MSDN)
e.Cancel = true;
然后在
窗口完全透明时(Opacity <= 0)时才真正去关闭窗口
                if (Opacity - d <= 0.0)
                {
                    Opacity 
= 0.0;
                    fadeTimer.Stop();
                    this.Close();
                }

还有一个问题是主窗口
IV在Form_Load中先把自已不可见(this.Visible = false;),然后打开登陆窗口,当我关闭登陆窗口时(按"Cancel"或"X"),主窗口会闪一下,WHY?
同样查看代码
                Application.Exit();


还是找不到问题所在,然后我试着在Exit()之前加了

                this.Close();
哈哈,后面的窗口不再闪了~~WHY?我还是搞不明白. 谁能告诉我WHY?

最后说一个自己在昨天犯的两个错误:
1.net中的"DateTime.MinValue值等效于 0001 年 1 月 1 日 00:00:00.0000000。","在MS SQL Server中,使用 datetime 数据类型存储从 1753 年 1 月 1 日至 9999 年 12 月 31 日的日期(每个数值要求 8 个字节的存储空间)。"
在程序调试时为了方便,我直接使用DateTime.MinValue作为存储过程参数进行测试,结果可以想像,跟踪了好久才找到了问题~~
2.程序在异步操作时吃掉了异常.

原文地址:https://www.cnblogs.com/zitiger/p/211257.html