none
关于Control的OnKeyUp的疑问 RRS feed

  • 问题

  • 设置了一个控件A,通过OnKeyUp捕获↑/↓,以对控件进行重绘

    在一个窗体上放置两个控件A,发现OnKeyUp被控件1和控件2间隔性应答,如何能固定到当前焦点所在控件?

    控件代码如下:

     

    namespace Test
    {
        public partial class TestControl : Control
        {
            public TestControl()
            {
                InitializeComponent();
            }
    
            private string _keyPress = string.Empty;
    
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
    
                e.Graphics.DrawString(_keyPress, this.Font, new SolidBrush(Color.Black), 20, 20);
            }
    
            /// <summary>
            /// 间隔响应???
            /// </summary>
            /// <param name="e"></param>
            protected override void OnKeyUp(KeyEventArgs e)
            {
                base.OnKeyUp(e);
    
                int kv = e.KeyValue;
    
                switch (kv)
                {
                    case 38://↑
                        _keyPress = _keyPress + "↑";
                        e.Handled = true;
                        break;
                    case 40://↓
                        _keyPress = _keyPress + "↓";
                        e.Handled = true;
                        break;
                }
                this.Refresh();
            }
        }
    }
    
    

     


    • 已编辑 chinull 2012年1月4日 2:19
    2012年1月4日 2:17

答案

  • 把构造函数修改成这样

    public TestControl()
            {
                SetStyle(ControlStyles.ResizeRedraw, true);
                SetStyle(ControlStyles.Selectable, true);

                DoubleBuffered = true;

            }

     

    问题已经解决了,果然是↑/↓造成了控件焦点的变化

    把这两个控件分别放在两个Panel里面,切断了同一容器中↑/↓切换控件焦点(在不同的容器或分组间不会切换焦点),问题解决了

    不过,在同一容器或分组中,如何让↑/↓不响应焦点切换,只在控件内响应呢,还是没有什么眉目

     

     

     

     

    • 已标记为答案 chinull 2012年1月4日 3:36
    2012年1月4日 3:36

全部回复

  • 是自定义控件还是?你的InitializeComponent()没有定义啊,请具体说明你那个Control是如何做出来的?我不能直接黏贴你的代码,但是自定义控件又不是直接继承于Control的,我用WinForm。
       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2012年1月4日 3:08
    版主
  • 把构造函数修改成这样

    public TestControl()
            {
                SetStyle(ControlStyles.ResizeRedraw, true);
                SetStyle(ControlStyles.Selectable, true);

                DoubleBuffered = true;

            }

     

    问题已经解决了,果然是↑/↓造成了控件焦点的变化

    把这两个控件分别放在两个Panel里面,切断了同一容器中↑/↓切换控件焦点(在不同的容器或分组间不会切换焦点),问题解决了

    不过,在同一容器或分组中,如何让↑/↓不响应焦点切换,只在控件内响应呢,还是没有什么眉目

     

     

     

     

    • 已标记为答案 chinull 2012年1月4日 3:36
    2012年1月4日 3:36