最近在开发一个组合控件:把com等组合在一起,com控件有自己的事件,如何屏蔽(不让用户使用)Usercontrol相同的事件,如:
com控件有keydown(KeysPressedEventArgs e)事件,usercontrol也有Keydown(KeyEventArgs e)事件,如何只让用户使用com.keydown(KeysPressedEventArgs e)事件;
如果让com.Keydown()调用usercontrol.Keydown()事件,这样存在一个问题:就是com.keydown()的参数与usercontrol.keydown()的参数不一致,当然这里要响应多个按键(ctrl,alt,基本按键等);
头痛了,请高手指点一二......

解决方案 »

  1.   

    我也在研究自定义控件  不知道你是指的什么,如果要彻底取消这些事件,重写wndproc就可以做到 只是具体我不会写。因为我不晓得每种消息对应的常数值。我这几天翻过资料,感觉你要对win API相当熟  当然,windows消息在net中封装后的值我也没有找到一个参考的文档。如果是即使发生某些事件,没反应的话,那对应的不写相关的事件处理程序就ok了,而且,我的感觉,原有控件的事件要订阅的话,似乎不会直接暴露给用户的。
      

  2.   

    谢谢,刚刚看了一下MSDN,可以用IDesignFilter来使某些事件不出现在属性编辑器中,但还是没有达到我想要的效果,郁闷中,就是想不让UserControl的某些事件出现在代码中......利用楼上大侠的重写WndProc()来试试,谢谢
      

  3.   

    昨天中午重写了控件的WndProc(),使某些事件不会响应了,呵呵,是个好方法,但是在属性编辑器里还能看到对应的事件,郁闷中
      

  4.   

    在UserControl中重写基类的相应方法而不再调用base的方法,这样就可以避免UserControl引发事件,相反,要在Com等控件的相应事件里调用UserControl的Base方法。例如:private void comboBox1_KeyDown(object sender, KeyEventArgs e)
    {
    base.OnKeyDown(e);
    }
    protected override void OnKeyDown(KeyEventArgs e)
    {
    //base.OnKeyDown(e);
    }
      

  5.   

    谢谢楼上大侠,可惜我需要公布的按键事件是自定义类型的事件参数,我需要控件Ctrl,Shift等键,可能这样做太笨了还会引发很多问题(按键事件是很复杂的处理过程,所以有时难免有错误存在;控件发布后,其事按键事件有两个:一个是UserControl的KeyDown()事件一个是我自定义的KeyDownEvent()事件,这会让控件用户很迷惑,至少我会很迷惑,不知道该用哪个事件,类似的问题还有)为什么要自定义按键事件的参数类型呢,因为我的Com按键只支持单个键按下,不支持多个键(Ctrl+shift+UP)键按下,而KeyEventArgs的Control等又是只读的属性,又加之刚刚开始搞C#不到一年,所以手很生,如果有好的解决方法还望高手不吝赐教,将不胜感激,分再加之!
      

  6.   

    不管你是怎么处理,你需要的是用户最后处理UserControl的按键,所以你一定要通过base.OnKeyDown(e);
    来引发这个事件,你只需要修改参数e的值就是了。你当然可以使用KeyPressEventArgs 或从其继承一个新的类来使用,并把其设置好值的实例传到base.OnKeyDown中就是了 。
      

  7.   

    不一定让用户去处理UserControl的事件吧?Com有自己的按键事件,当Com的按键事件触发时,即触发自定义的按键件事件(参数也是自定义的),把这个自定义的按键事件公布出去,然后让用户使用,效果是一样的,对吗?这样我就没有必要响应UserControl的事件了,
    这样做可能不符合道理......