<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      一種用戶體驗-顯示對話框時灰化你的主窗體

      袁永福 ( http://www.xdesigner.cn ) 2007-8-10

      程序全部源代碼下載(工程文件使用VS.NET2003格式):/Files/xdesigner/DisableMask.rar

          在一些Web程序中,有一種頁面效果,當彈出一個模擬的對話框時,主頁面就整體灰化了,其他的元素不能動彈,只有這個對話框能用,用戶關閉了對話框,整個頁面才恢復原來的操作.這種用戶體驗是不錯的,提示了用戶必須處理的對話框才能繼續處理頁面.如何實現的我猜想是動態生成一個大的DIV層,把它置于頂層并設置半透明的灰色.

          在WinForm程序中也需要這種用戶體驗,我們有時觀察到主窗體顯示了一個對話框,此時用戶還試圖用鼠標點擊主窗體搞些操作,但這種操作注定是要失敗,影響到軟件可用性.于是我就想到把Web程序中的這種用戶體驗移植到WinForm程序中來幫助用戶意識到主窗體的當前狀態.

          實現這個用戶體驗有兩個問題,一是如何知道主窗體彈出對話框,二是如何灰化主窗體.

          首先是解決如何知道主窗體何時彈出對話框,研究了一下,沒發現窗體對象System.Windows.Forms.Form類型提供有所幫助的事件方法屬性.我們可以在程序代碼中,每次彈出對話框前添加灰化主窗體的代碼,這樣加大了程序開發量,而且代碼移植性不好。后來想了又想,試了又試,發現彈出對話框時,主窗體的狀態是不可用的,但此時窗體的Enabled屬性不能反應這種狀態,使用Win32API函數卻能正確獲得其狀態.因此最后決定使用計時器System.Windows.Forms.Timer來不斷的調用Win32API函數來測試主窗體是否可用,若可用則不必灰化主窗體,若不可用則灰化主窗體。

          第二步就是灰化主窗體了,根據WEB程序中的實現過程,我們很自然的想到用一個半透明的控件來覆蓋整個主窗體,于是我們又如何創造這個半透明控件。縱觀System.Windows.Forms名稱空間,號稱提供半透明效果效果的只有Label類型了,經過測試,發現Label類型的半透明屬性是假的,是模擬出來的,它是在控件背景中模擬繪制窗體的背景來搞出半透明的效果,若Label控件背后有其他控件還是要被Label無情的覆蓋掉。因此我們需要一個真正的半透明控件,于是我又想了又想,試了又試,找了又找,終于把這個真正的半透明控件搞出來了。

          基礎問題解決了,然后就是代碼的組成和組件化了,我定義了一個DisableMaskControl控件,實現了真正的半透明處理,里面有個定時器,不斷的使用Win32API函數測試這個控件所在的窗體是否有效,若有效則隱藏控件,若無效則顯示控件,把控件覆蓋整個窗體并置于頂層。這樣我就用一百來行的C#代碼實現了這種彈出對話框灰化主窗體的用戶體驗,而且這個代碼使用非常簡單,只要在需要這種效果的主窗體上添加一行代碼 this.Controls.Add( new DisableMaskControl()) 即可。

         此處或許有人提出這個定時器的效率問題,我覺得沒多大問題,首先控件少,一個窗體才用一個,相對于高速的CPU,用戶手動操作來顯示和關閉對話框是極其緩慢的操作。而且定時器中進行的判斷不多,只調用了一個API函數,無傷大雅。

         以下是程序的運行效果。



         以下是控件 DisableMaskControl的全部代碼。

        1 using System;
        2 using System.Runtime.InteropServices ;
        3 namespace DisableMask
        4 {
        5     /// <summary>
        6     /// 窗體無效時用于掩蓋整個狀態的半透明控件
        7     /// </summary>
        8     /// <remarks>編制 袁永福( http://www.xdesigner.cn )</remarks>
        9     public class DisableMaskControl : System.Windows.Forms.Control
       10     {
       11         /// <summary>
       12         /// 初始化對象
       13         /// </summary>
       14         public DisableMaskControl()
       15         {
       16             this.SetStyle( System.Windows.Forms.ControlStyles.SupportsTransparentBackColor , true );
       17             myTimer = new System.Windows.Forms.Timer();
       18             myTimer.Interval = 100 ;
       19             myTimer.Tick +=new EventHandler(myTimer_Tick);
       20             this.BackColor = System.Drawing.Color.FromArgb( 80 , 0 , 0 , 0 );
       21             myTimer.Start();
       22         }
       23         /// <summary>
       24         /// 內部用于定時處理的計時器
       25         /// </summary>
       26         private System.Windows.Forms.Timer myTimer = null;
       27 
       28         /// <summary>
       29         /// 已重載:返回控件創建參數
       30         /// </summary>
       31         protected override System.Windows.Forms.CreateParams CreateParams
       32         {
       33             get
       34             {
       35                 System.Windows.Forms.CreateParams ps = base.CreateParams;
       36                 ps.ExStyle = ps.ExStyle | 0x20 ;
       37                 return ps ;
       38             }
       39         }
       40 
       41         /// <summary>
       42         /// 繪制控件的背景,啥也不干.
       43         /// </summary>
       44         /// <param name="pevent">事件參數</param>
       45         protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs pevent)
       46         {
       47         }
       48         /// <summary>
       49         /// 繪制控件
       50         /// </summary>
       51         /// <param name="e">事件參數</param>
       52         protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
       53         {
       54             using( System.Drawing.SolidBrush b = new System.Drawing.SolidBrush( this.BackColor ))
       55             {
       56                 e.Graphics.FillRectangle( b , e.ClipRectangle );
       57             }
       58         }
       59 
       60         /// <summary>
       61         /// 定時器處理
       62         /// </summary>
       63         /// <param name="sender">事件參數</param>
       64         /// <param name="e">事件參數</param>
       65         private void myTimer_Tick(object sender, EventArgs e)
       66         {
       67             System.Windows.Forms.Form frm = this.FindForm();
       68             if( frm == null )
       69                 return ;
       70             if( frm.IsDisposed )
       71                 return ;
       72             ifthis.IsDisposed )
       73                 return ;
       74             ifthis.IsHandleCreated == false )
       75                 return ;
       76 
       77             // 主窗體顯示對話框時窗體不可用,但此時它的Enable屬性無法判斷其是否真的
       78             // 不可用,因此必須調用Win32API來判斷其是否真的不可用.
       79             if( IsWindowEnabled( frm.Handle ) == false )
       80             {
       81                 ifthis.Visible == false )
       82                 {
       83                     this.Dock = System.Windows.Forms.DockStyle.None ;
       84                     this.Bounds = new System.Drawing.Rectangle( 
       85                         0 , 
       86                         0 , 
       87                         frm.ClientSize.Width ,
       88                         frm.ClientSize.Height );
       89                     this.BringToFront();    
       90                     this.Visible = true;
       91                     this.Refresh();
       92                     frm.Refresh();
       93                 }
       94             }
       95             else
       96             {
       97                 ifthis.Visible )
       98                     this.Visible = false;
       99             }
      100         }
      101 
      102         /// <summary>
      103         /// 用于判斷窗體是否有效的Win32API函數
      104         /// </summary>
      105         /// <param name="hWnd">窗體句柄</param>
      106         /// <returns>窗體是否有效</returns>
      107         [DllImport("user32.dll", CharSet=CharSet.Auto, ExactSpelling=true)]
      108         private static extern bool IsWindowEnabled(IntPtr hWnd);
      109 
      110     }//public class DisableMaskControl : System.Windows.Forms.Control
      111 }

      posted on 2007-08-10 09:29  袁永福 電子病歷,醫療信息化  閱讀(5335)  評論(28)    收藏  舉報

      導航

      主站蜘蛛池模板: 亚洲AV午夜成人无码电影| 国语自产少妇精品视频蜜桃| 97精品亚成在人线免视频| 北岛玲中文字幕人妻系列| 一道本AV免费不卡播放| 国产精品麻豆成人av电影艾秋| 国产粉嫩系列一区二区三| 东京热人妻无码一区二区av| 国产成人精品无码播放| 久青草国产在视频在线观看| 成年视频人免费网站动漫在线 | 无码伊人久久大杳蕉中文无码| 亚洲国产片一区二区三区| 国产色无码专区在线观看| 国产超碰无码最新上传| 欧美熟妇xxxxx欧美老妇不卡| av亚洲一区二区在线| 性高湖久久久久久久久| 青青草国产自产一区二区| 亚洲国产精品久久久天堂麻豆宅男 | 国产免费久久精品44| av区无码字幕中文色| 国产成人不卡一区二区| 高清自拍亚洲精品二区| 乱人伦中文视频在线| 国产欧美日韩精品第二区| 噜噜噜亚洲色成人网站∨ | 亚洲精品一区久久久久一品av| 国产精品久久久久久久专区| 国产一区二区亚洲精品| 强奷乱码欧妇女中文字幕熟女| 金寨县| 久久精品国产色蜜蜜麻豆| 庄河市| 97视频精品全国免费观看| 精品国产一区二区三区国产区| 午夜精品视频在线看| 亚洲男人第一无码av网| 亚洲一区av在线观看| 国产精品尤物午夜福利| 中文字幕在线日韩|