1、一个可以接收焦点的控件,在客户端使用的click属性中,被使用msgbox弹出了一个对话框,在对话框完毕后,该控件无法再重新响应keydown和keyascii事件.当时焦点仍然在该控件上.只有切换到其他控件在返回才可以重新响应回该事件.怎么使该控件在对话框弹出后,返回时能够重新响应事件(而且仅仅在MDI的子窗口中出现这种情况,一般窗口则无此现象)?
2、另外一个情况,客户端的keydown事件中被msgbox后,无法再响应keyup事件,怎么解决(而且仅仅在MDI的子窗口中出现这种情况,一般窗口则无此现象)?

解决方案 »

  1.   

    '控件名为xpbu
    '控件中的代码是这样
    Private Sub UserControl_Click()
        RaiseEvent Click
    End Sub
    在客户端,xpbu_click事件中,
    private sub xpbu_click
        msgbox "pp"
    end sub
    '下次在控件的KeyDown、KeyUp、KeyPress就不会触发了。所有vb自定义控件都会有这种情况。但仅仅在mdi中的子窗口会有这种问题,一般窗口则没有。当msgbox执行完毕后,焦点应该还是在该控件,(可以检测到activecontrol)但为什么却不会再触发usercontrol_keydown等键盘事件?
      

  2.   

    考虑了一下
    可能是事件冻结参考
    http://ebook.0451.net/bcrj.htm
    第五章,事件--〉事件的冻结
    如果控件需要产生不能丢失的事件,则在EventsFrozen 属性设置为false之前,这些事件必须排入事件队列之中
      

  3.   

    EventsFrozen属性只能读.比较困难.
    另外msgbox以后,才造成usercontrol以后所有的的键盘事件丢失.那么这个情况又和事件冻结有些区别.像微软的按钮它自己却没有这些问题,是不是微软故意隐藏些什么细节.
      

  4.   

    最好别用msgbox,或者在msgbox之前加一个doevents
      

  5.   

    Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As String, ByVal lpCaption As String, ByVal wType As Long) As Long使用这个看看
      

  6.   

    使用MessageBox确实能返回并再次引起该事件.
    但我的控件是做过开发小组用的,不能要求他们不使用msgbox吧.而且vb用msgbox确实比较方面.另外,当子窗体采用模式状态,调用的时候也会出现和msgbox一样的问题,如选择客户窗口等等模式选择窗口.这种情况肯定是有的.
    关键的一条还是只有mdi的子窗口才会出现这种情况.
      

  7.   

    sorry,只有msgbox有此问题,模式窗口无此问题.但用msgbox更好.