作者:Junhot
更新时间:2004-12-15

-------------------------------------------------------------------------------
总的流程描述图:

DirectX Sample分析:Framework中的控件事件绑定(一)


从具体控件看起,以鼠标点击
Button控件的事件为例,Button控件代码包含在dxmutgui.cs文件中:

 

ButtonClick事件的原型:

Button中声明了如下的事件Click及事件触发方法RaiseClickEvent

DirectX Sample分析:Framework中的控件事件绑定(一)        public event EventHandler Click;

DirectX Sample分析:Framework中的控件事件绑定(一)        protected void RaiseClickEvent(Button sender, bool wasTriggeredByUser)
{
DirectX Sample分析:Framework中的控件事件绑定(一)            
// Discard events triggered programatically if these types of events haven't been
DirectX Sample分析:Framework中的控件事件绑定(一)            
// enabled
DirectX Sample分析:Framework中的控件事件绑定(一)
            if (!Parent.IsUsingNonUserEvents && !wasTriggeredByUser)
DirectX Sample分析:Framework中的控件事件绑定(一)                
return;
DirectX Sample分析:Framework中的控件事件绑定(一)
DirectX Sample分析:Framework中的控件事件绑定(一)            
if (Click != null)
DirectX Sample分析:Framework中的控件事件绑定(一)                Click(sender, EventArgs.Empty);
DirectX Sample分析:Framework中的控件事件绑定(一)        }

DirectX Sample分析:Framework中的控件事件绑定(一)        
#endregion

Button内部如何触发Click事件:

HandleMouse这个方法调用RaiseClickEvent方法从而导致Click事件的触发,另外还有如HandleKeyboard方法等,同样也是事件触发的方法之一。

DirectX Sample分析:Framework中的控件事件绑定(一)

DirectX Sample分析:Framework中的控件事件绑定(一)        
/// Handle mouse messages from the buttons
DirectX Sample分析:Framework中的控件事件绑定(一)        
/// </summary>
DirectX Sample分析:Framework中的控件事件绑定(一)        public override bool HandleMouse(NativeMethods.WindowMessage msg, System.Drawing.Point pt, IntPtr wParam, IntPtr lParam)
{
DirectX Sample分析:Framework中的控件事件绑定(一)            
if (!IsEnabled || !IsVisible)
DirectX Sample分析:Framework中的控件事件绑定(一)                
return false;
DirectX Sample分析:Framework中的控件事件绑定(一)
DirectX Sample分析:Framework中的控件事件绑定(一)            
switch(msg)
{
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.LeftButtonDoubleClick:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.LeftButtonDown:
{
DirectX Sample分析:Framework中的控件事件绑定(一)                    
if (ContainsPoint(pt))
{
DirectX Sample分析:Framework中的控件事件绑定(一)                        
// Pressed while inside the control
DirectX Sample分析:Framework中的控件事件绑定(一)
                        isPressed = true;
DirectX Sample分析:Framework中的控件事件绑定(一)                        NativeMethods.SetCapture(Parent.SampleFramework.Window);
DirectX Sample分析:Framework中的控件事件绑定(一)                        
if (!hasFocus)
DirectX Sample分析:Framework中的控件事件绑定(一)                            Dialog.RequestFocus(
this);
DirectX Sample分析:Framework中的控件事件绑定(一)
DirectX Sample分析:Framework中的控件事件绑定(一)                        
return true;
DirectX Sample分析:Framework中的控件事件绑定(一)                    }

DirectX Sample分析:Framework中的控件事件绑定(一)                }

DirectX Sample分析:Framework中的控件事件绑定(一)                    
break;
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.LeftButtonUp:
{
DirectX Sample分析:Framework中的控件事件绑定(一)                    
if (isPressed)
{
DirectX Sample分析:Framework中的控件事件绑定(一)                        isPressed 
= false;
DirectX Sample分析:Framework中的控件事件绑定(一)                        NativeMethods.ReleaseCapture();
DirectX Sample分析:Framework中的控件事件绑定(一)                        
if (!parentDialog.IsUsingKeyboardInput)
DirectX Sample分析:Framework中的控件事件绑定(一)                            Dialog.ClearFocus();
DirectX Sample分析:Framework中的控件事件绑定(一)
DirectX Sample分析:Framework中的控件事件绑定(一)                        
// Button click
DirectX Sample分析:Framework中的控件事件绑定(一)
                        if (ContainsPoint(pt))
DirectX Sample分析:Framework中的控件事件绑定(一)                            RaiseClickEvent(
thistrue);
DirectX Sample分析:Framework中的控件事件绑定(一)                    }

DirectX Sample分析:Framework中的控件事件绑定(一)                }

DirectX Sample分析:Framework中的控件事件绑定(一)                    
break;
DirectX Sample分析:Framework中的控件事件绑定(一)            }

DirectX Sample分析:Framework中的控件事件绑定(一)
DirectX Sample分析:Framework中的控件事件绑定(一)            
return false;
DirectX Sample分析:Framework中的控件事件绑定(一)        }

控件如何知道何时该触发Click事件:

Dialog类中(Dialog类代码同样包含在dxmutgui.cs中)通过MessageProc捕获WindowMessage,然后调用ControlHandleKeyboard或者HandleMouse方法,下面是调用HandleMouse方法的代码:

DirectX Sample分析:Framework中的控件事件绑定(一)
DirectX Sample分析:Framework中的控件事件绑定(一)                
// Mouse messages
DirectX Sample分析:Framework中的控件事件绑定(一)
                case NativeMethods.WindowMessage.MouseMove:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.MouseWheel:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.LeftButtonUp:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.LeftButtonDown:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.LeftButtonDoubleClick:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.RightButtonUp:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.RightButtonDown:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.RightButtonDoubleClick:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.MiddleButtonUp:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.MiddleButtonDown:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.MiddleButtonDoubleClick:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.XButtonUp:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.XButtonDown:
DirectX Sample分析:Framework中的控件事件绑定(一)                
case NativeMethods.WindowMessage.XButtonDoubleClick:
{
DirectX Sample分析:Framework中的控件事件绑定(一)                    
// If not accepting mouse input, return false to indicate the message should still 
DirectX Sample分析:Framework中的控件事件绑定(一)                    
// be handled by the application (usually to move the camera).
DirectX Sample分析:Framework中的控件事件绑定(一)
                    if (!usingMouseInput)
DirectX Sample分析:Framework中的控件事件绑定(一)                        
return false;
DirectX Sample分析:Framework中的控件事件绑定(一)
DirectX Sample分析:Framework中的控件事件绑定(一)                    
// Current mouse position
DirectX Sample分析:Framework中的控件事件绑定(一)
                    short mouseX = NativeMethods.LoWord((uint)lParam.ToInt32());
DirectX Sample分析:Framework中的控件事件绑定(一)                    
short mouseY = NativeMethods.HiWord((uint)lParam.ToInt32());
DirectX Sample分析:Framework中的控件事件绑定(一)                    System.Drawing.Point mousePoint 
= new System.Drawing.Point(mouseX, mouseY);
DirectX Sample分析:Framework中的控件事件绑定(一)                    
// Offset mouse point
DirectX Sample分析:Framework中的控件事件绑定(一)
                    mousePoint.X -= dialogX;
DirectX Sample分析:Framework中的控件事件绑定(一)                    mousePoint.Y 
-= dialogY;
DirectX Sample分析:Framework中的控件事件绑定(一)
DirectX Sample分析:Framework中的控件事件绑定(一)                    
// If caption is enabled, offset the Y coordinate by the negative of its height.
DirectX Sample分析:Framework中的控件事件绑定(一)
                    if (hasCaption)
DirectX Sample分析:Framework中的控件事件绑定(一)                        mousePoint.Y 
-= captionHeight;
DirectX Sample分析:Framework中的控件事件绑定(一)
DirectX Sample分析:Framework中的控件事件绑定(一)                    
// If a control is in focus, it belongs to this dialog, and it's enabled, then give
DirectX Sample分析:Framework中的控件事件绑定(一)                    
// it the first chance at handling the message.
DirectX Sample分析:Framework中的控件事件绑定(一)
                    if (controlFocus != null && 
DirectX Sample分析:Framework中的控件事件绑定(一)                        controlFocus.Parent 
== this && 
DirectX Sample分析:Framework中的控件事件绑定(一)                        controlFocus.IsEnabled)
{
DirectX Sample分析:Framework中的控件事件绑定(一)                        
// If the control MsgProc handles it, then we don't.
DirectX Sample分析:Framework中的控件事件绑定(一)
                        if (controlFocus.HandleMouse(msg, mousePoint, wParam, lParam))
DirectX Sample分析:Framework中的控件事件绑定(一)                            
return true;
DirectX Sample分析:Framework中的控件事件绑定(一)                    }

DirectX Sample分析:Framework中的控件事件绑定(一)
DirectX Sample分析:Framework中的控件事件绑定(一)                    
// Not yet handled, see if the mouse is over any controls
DirectX Sample分析:Framework中的控件事件绑定(一)
                    Control control = GetControlAtPoint(mousePoint);
DirectX Sample分析:Framework中的控件事件绑定(一)                    
if ((control != null&& (control.IsEnabled))
{
DirectX Sample分析:Framework中的控件事件绑定(一)                        
// Let the control handle the mouse if it wants (and return true if it handles it)
DirectX Sample分析:Framework中的控件事件绑定(一)
                        if (control.HandleMouse(msg, mousePoint, wParam, lParam))
DirectX Sample分析:Framework中的控件事件绑定(一)                            
return true;
DirectX Sample分析:Framework中的控件事件绑定(一)                    }

DirectX Sample分析:Framework中的控件事件绑定(一)                    
else
{
DirectX Sample分析:Framework中的控件事件绑定(一)                        
// Mouse not over any controls in this dialog, if there was a control
DirectX Sample分析:Framework中的控件事件绑定(一)                        
// which had focus it just lost it
DirectX Sample分析:Framework中的控件事件绑定(一)
                        if (msg == NativeMethods.WindowMessage.LeftButtonDown &&
DirectX Sample分析:Framework中的控件事件绑定(一)                            controlFocus 
!= null &&
DirectX Sample分析:Framework中的控件事件绑定(一)                            controlFocus.Parent 
== this)
{
DirectX Sample分析:Framework中的控件事件绑定(一)                            controlFocus.OnFocusOut();
DirectX Sample分析:Framework中的控件事件绑定(一)                            controlFocus 
= null;
DirectX Sample分析:Framework中的控件事件绑定(一)                        }

DirectX Sample分析:Framework中的控件事件绑定(一)                    }

相关文章:

  • 2022-12-23
  • 2021-07-24
  • 2021-08-20
  • 2022-12-23
  • 2022-12-23
  • 2021-07-10
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-01-23
  • 2022-02-27
  • 2021-07-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-31
  • 2022-12-23
相关资源
相似解决方案