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

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

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

      WinForm控件開發總結(十二)-----讓控件處理導航鍵

          最近真的真的太忙了,以至于一個多月都沒喲更新我的blog。昨天晚上,一個網上的朋友看了我的ToolBox的文章,問我一個問題,他說如何讓ToolBox控件也能響應鍵盤操作,也就是用Updown按鍵來選擇工具箱控件里的Item,他添加了鍵盤事件,但是不起作用。一開始做這個控件的時候也只是演示一下控件的制作過程,只用了很短的時間做了一個,只考慮了用鼠標選取,沒有考慮鍵盤操作,我想要添加鍵盤操作無非重載KeyDown事件,針對UpDown做一些響應就可以了。可是添加了重載了OnKeyDown事件后,結果和那位朋友所說的一樣,沒有任何作用,我設了斷點,調試了一下,發現KeyDown根本捕獲不到UpDown按鍵的點擊,是什么原因呢,是不是忘記設控件的風格以便讓它能夠獲得焦點?于是,我使用了語句:
         
      SetStyle(ControlStyles.Selectable, true);
      依然沒有效果,當我們在控件上按下Down鍵的時候,另一個控件獲得了焦點。這時UpDown按鈕只是起到了導航的作用就像Tab鍵一樣。
            接下來,我在測試工程的窗體上放置了一個ListBox控件做一個對比,其實ToolBoxListBox在界面表現上有相似之處,就是都有子Item,并且在ListBox上點擊Down是起作用的,ListBox并沒有失去焦點,這說明這時UpDown按鍵沒有成為導航鍵。我想Windows一定是對默認的導航鍵UpDown,Left,Right有默認的處理,除非你希望你的控件希望自己處理這些鍵。用反匯編工具看了一下ListBoxControl控件的源代碼,發現一個有趣的函數:
      protected override bool IsInputKey(Keys keyData)
      {
          
      if ((keyData & Keys.Alt) == Keys.Alt)
          
      {
              
      return false;
          }

          
      switch ((keyData & Keys.KeyCode))
          
      {
              
      case Keys.Prior:
              
      case Keys.Next:
              
      case Keys.End:
              
      case Keys.Home:
                  
      return true;
          }

          
      return base.IsInputKey(keyData);
      }


      在這里面,ListBoxControl允許PriorNextEndHome成為有效的輸入鍵,接著一路跟下去,看看WinForm控件的基類Control的這個函數是如何處理的:
      [UIPermission(SecurityAction.InheritanceDemand, Window=UIPermissionWindow.AllWindows)]
      protected virtual bool IsInputKey(Keys keyData)
      {
          
      if ((keyData & Keys.Alt) != Keys.Alt)
          
      {
              
      int num = 4;
              
      switch ((keyData & Keys.KeyCode))
              
      {
                  
      case Keys.Left:
                  
      case Keys.Up:
                  
      case Keys.Right:
                  
      case Keys.Down:
                      num 
      = 5;
                      
      break;

                  
      case Keys.Tab:
                      num 
      = 6;
                      
      break;
              }

              
      if (this.IsHandleCreated)
              
      {
                  
      return ((((intthis.SendMessage(0x8700)) & num) != 0);
              }

          }

          
      return false;
      }


            注意這一行return ((((int) this.SendMessage(0x87, 0, 0)) & num) != 0);0x87是什么windows消息呢,打開WinUser.h文件,發現是WM_GETDLGCODE,MSDN中的描述是這樣的:
            The WM_GETDLGCODE message is sent to the window procedure associated with a control. By default, the system handles all keyboard input to the control; the system interprets certain types of keyboard input as dialog box navigation keys. To override this default behavior, the control can respond to the WM_GETDLGCODE message to indicate the types of input it wants to process itself.
            也就是說windows用這個消息來判斷哪些類型的輸入交給控件本身來處理。然后,我注意到,對于方向導航鍵,函數都給于一個值5this.SendMessage(0x87, 0, 0))的返回值進行與操作,那么this.SendMessage(0x87, 0, 0))的返回值都可能是什么值呢,WinUser.h中是這樣聲明的:
         
      /*
       * Dialog Codes
       
      */

      #define DLGC_WANTARROWS     0x0001      /* Control wants arrow keys         */
      #define DLGC_WANTTAB        0x0002      /* Control wants tab keys           */
      #define DLGC_WANTALLKEYS    0x0004      /* Control wants all keys           */
      #define DLGC_WANTMESSAGE    0x0004      /* Pass message to control          */
      #define DLGC_HASSETSEL      0x0008      /* Understands EM_SETSEL message    */
      #define DLGC_DEFPUSHBUTTON  0x0010      /* Default pushbutton               */
      #define DLGC_UNDEFPUSHBUTTON 0x0020     /* Non-default pushbutton           */
      #define DLGC_RADIOBUTTON    0x0040      /* Radio button                     */
      #define DLGC_WANTCHARS      0x0080      /* Want WM_CHAR messages            */
      #define DLGC_STATIC         0x0100      /* Static item: don't include       */
      #define DLGC_BUTTON         0x2000      /* Button item: can be checked      */
            5最貼切的表達就是DLGC_WANTMESSAGE | DLGC_WANTARROWS,也就是將方向鍵發送給控件處理,對于6呢,也就是DLGC_WANTMESSAGE| DLGC_WANTTAB,將Tab鍵發送給控件處理。
         
          從這段代碼里和控件實際的行為我們可以得出一個結論,那就是,控件本身是不處理方向鍵和Tab鍵的,因為他們有默認的行為,也就是支持焦點在窗體的控件之間轉換。如果你想要處理這些導航鍵,那么結論很簡單,就是重載IsInputKey方法,它是一個保護類型的虛方法。       
            在ToolBox控件的代碼里重載IsinputKey方法:
              protected override bool IsInputKey(Keys keyData)
              
      {
                  
      if ((keyData & Keys.Alt) == Keys.Alt)
                  
      {
                      
      return false;
                  }

                  
      switch ((keyData & Keys.KeyCode))
                  
      {
                      
      case Keys.Up:
                      
      case Keys.Down:                
                          
      return true;
                  }

                  
      return base.IsInputKey(keyData);

              }

             

             當用戶點擊的鍵是UpDown的時候,返回true,這時我們的OnKeyDown方法里就可以捕獲到UpDown的點擊事件了。
      posted @ 2007-05-11 22:51  綸巾客  閱讀(10967)  評論(14)    收藏  舉報
      主站蜘蛛池模板: 宅男久久精品国产亚洲av麻豆| 这里只有精品免费视频| 国产精品无码av不卡| 国产在线不卡精品网站| 久久精品女人天堂av免费观看| 国产精品推荐视频一区二区| 亚洲成av人片无码迅雷下载| 在线日韩日本国产亚洲| 黑人异族巨大巨大巨粗| 成年女人免费碰碰视频| 国产熟妇另类久久久久久| 国产69成人精品视频免费| 鲁一鲁一鲁一鲁一澡| 亚洲性av网站| 亚洲丶国产丶欧美一区二区三区 | 另类 亚洲 图片 激情 欧美| 天天爱天天做天天爽夜夜揉| 亚洲一区二区av在线| 亚洲日韩精品无码一区二区三区| 男女做aj视频免费的网站| 国产精品免费无遮挡无码永久视频 | 好男人官网资源在线观看| 色婷婷狠狠久久综合五月| 国产精品尤物乱码一区二区| 国内精品视频一区二区三区八戒| 蜜臀av午夜精品福利| 色九月亚洲综合网| 免费无码AV一区二区波多野结衣| 国产成人永久免费av在线| 熟女精品视频一区二区三区| 亚洲码和欧洲码一二三四| 忘忧草社区在线www| 久久综合国产色美利坚| 亚洲一区二区中文av| 久草热在线视频免费播放| 91蜜臀国产自产在线观看| 国产精品视频一区二区三区无码 | 成人白浆一区二区三区在线观看| 国产精品va在线观看无码不卡| 久久精品国产清自在天天线| 日韩加勒比一本无码精品|