博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#-WinForm-设计时编程【4】-响应鼠标事件
阅读量:5286 次
发布时间:2019-06-14

本文共 3840 字,大约阅读时间需要 12 分钟。

在设计器中,先看效果:

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 Bounds14          {15              get16              {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.Control3     {4     }

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

转载于:https://www.cnblogs.com/godcity/archive/2012/05/26/2518811.html

你可能感兴趣的文章
NYOJ-42 一笔画问题
查看>>
C# out Keyword
查看>>
【转】VC中MessageBox与AfxMessageBox用法与区别
查看>>
Template
查看>>
jQuery局部动态刷新
查看>>
C#abstract 抽象类
查看>>
ubuntu 下执行定时任务
查看>>
composer.lock文件的作用
查看>>
Android -- startActivityForResult-------&&&----setResult
查看>>
Android SDK 2.3/3.0/4.0/4.1 下载与安装教程
查看>>
gitlab-ce安装01
查看>>
【转】有关“干部身份”
查看>>
bzoj3211花神游历各国 线段树
查看>>
Django——如何在Django模板中注入全局变量?——part1
查看>>
esriControlsMousePointer常量
查看>>
前端面试记录NO.1
查看>>
【java】String类和StringBuffer类常用操作
查看>>
MariaDB MariaDB、MySQL存储过程、游标基础应用举例说明
查看>>
测试思想-测试设计 测试用例设计需要注意的几个点
查看>>
MySQL半同步复制
查看>>