• C#WinForm设计时编程【4】响应鼠标事件


    在设计器中,先看效果:

    1、鼠标离开

    2、鼠标进入(手形光标没截出来)

    3、鼠标单击

    代码及其分析:

    引用命名空间:

    1 using System.ComponentModel;
    2 using System.ComponentModel.Design;
    3 using System.Drawing;
    4 using System.Windows.Forms;
    5 using System.Windows.Forms.Design;
    6 using System.Windows.Forms.Design.Behavior;

    第一步:定义一个行为类EventBehavior,这个类继承了Behavior,对需要处理的事件进行重写,用于处理鼠标事件,代码很简单,就不需要解释了,代码如下:

     1     class EventBehavior : Behavior
     2     {
     3         bool isPressed = false;
     4         Control control;
     5 
     6         public EventBehavior(Control control)
     7         {
     8             this.control = control;
     9         }
    10 
    11         public override bool OnMouseDown(Glyph g, MouseButtons button, Point mouseLoc)
    12         {
    13             isPressed = true;
    14             return true;
    15         }
    16 
    17         public override bool OnMouseUp(Glyph g, MouseButtons button)
    18         {
    19             if (isPressed) 
    20                 OnClick();
    21 
    22             isPressed = false;
    23             return true;
    24         }
    25 
    26         public override bool OnMouseEnter(Glyph g)
    27         {
    28             this.control.BackColor = Color.LightPink;
    29             return true;
    30         }
    31 
    32         public override bool OnMouseLeave(Glyph g)
    33         {
    34             this.control.BackColor = Color.FromKnownColor(KnownColor.Control);
    35             return true;
    36         }
    37 
    38         public void OnClick()
    39         {
    40             MessageBox.Show("你单击了我!");
    41         }
    42     }

    第二步:定义一个EventGlyph类,这个类继承Glyph,实现自定义控件的选择和图像处理,代码如下:

     1 class EventGlyph : Glyph
     2      {
     3          Control control;
     4          BehaviorService behaviorSvc;
     5  
     6          public EventGlyph(BehaviorService behaviorSvc, Control control)
     7              : base(new EventBehavior(control))
     8          {
     9              this.behaviorSvc = behaviorSvc;
    10              this.control = control;
    11          }
    12  
    13          public override Rectangle Bounds
    14          {
    15              get
    16              {
    17                  Point edge = behaviorSvc.ControlToAdornerWindow(control);
    18                  Size size = control.Size;
    19                  Rectangle bounds = new Rectangle(edge.X, edge.Y, size.Width, size.Height);
    20  
    21                  return bounds;
    22              }
    23          }
    24  
    25          public override Cursor GetHitTest(System.Drawing.Point p)
    26          {
    27              if (this.Bounds.Contains(p))
    28              {
    29                  return Cursors.Hand;
    30              }
    31  
    32              return null;
    33          }
    34  
    35          public override void Paint(PaintEventArgs pe)
    36          {
    37              TextFormatFlags sf = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis;
    38              TextRenderer.DrawText(pe.Graphics, "设计时响应鼠标单击事件哦", this.control.Font, this.Bounds, Color.DarkBlue, Color.Transparent, sf);
    39          }

    第三步:定义一个设计器EventControlDesigner,它将行为和绘制部分的内容绑定在设计器中,代码如下:

     1     public class EventControlDesigner : ScrollableControlDesigner
     2     {
     3         private ISelectionService SelectionService
     4         {
     5             get
     6             {
     7                 return this.GetService(typeof(ISelectionService)) as ISelectionService;
     8             }
     9         }
    10 
    11         public override GlyphCollection GetGlyphs(GlyphSelectionType selectionType)
    12         {
    13             GlyphCollection glyphs = base.GetGlyphs(selectionType);
    14             if (SelectionService != null)
    15             {
    16                 if (SelectionService.PrimarySelection == this.Control)
    17                     glyphs.Add(new EventGlyph(this.BehaviorService, this.Control));
    18             }
    19             return glyphs;
    20         }
    21     }

     第四步:在自定义控件上使用设计器,代码如下:

    1     [Designer(typeof(EventControlDesigner))]
    2     class EventControl:System.Windows.Forms.Control
    3     {
    4     }


    至此为止,一个可以在设计时响应鼠标事件的控件可以运行了。

  • 相关阅读:
    innerHtml的用法
    可变的框架
    用js实现弹出窗口《iframe》
    搜索栏的实现(JS)
    使用ASP.NET Atlas开发随输入内容自动调整行数的textarea(转)
    C#实现手动在IE中增加受信任/受限制站点(更新过后的代码)
    WebSerivce[创建分布式应用程序]
    有关于5个文本栏
    SQL 语句优化
    取HyperLink中的值
  • 原文地址:https://www.cnblogs.com/godcity/p/2518811.html
Copyright © 2020-2023  润新知