vb.net设计时鼠标交互
程序员文章站
2022-05-29 15:20:06
...
自定义控件,很多人都知道,但是自定义控件的鼠标交互却很少人说。我一直想做一个类似tabcontrol这样的鼠标交互,但是百度通篇难以找到答案,于是查阅了微软源码,微软用的正是controldesigner这个类里的几个重写方法。想来也没写过博客,第一篇就试试写一个这个自己摸索出来的功能吧。
编译环境:VS2010
1.继承controldeisgner,先引用
System.Windows.Forms.Design,如果没有就去添加引用里添加system.design.dll
Public Class MyDesigner
Inherits ControlDesigner
'接下来用这个类的名称来讲解
End Class
2.重写鼠标交互的方法
比如
Protected Overrides Sub OnMouseEnter()
MyBase.OnMouseEnter()
'此处响应鼠标进入事件
End Sub
但是这不是重点,因为在重写的时候我发现,没有内置的鼠标单击事件。所幸的是有一个这个函数
'鼠标处理函数
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
'下面可进行设计时鼠标消息的拦截
Select Case m.Msg
Case Is = WM_LBUTTONDOWN '拦截鼠标按下左键时
'此处可添加自定义的鼠标交互方法,或者触发事件。。
Case Is = WM_LBUTTONUP '拦截鼠标释放左键时
'
End Select
MyBase.WndProc(m)
End Sub
通过以上的重写,你可以把自己想达到的效果放进去测试一下。不建议用messagebox进行测试,避免阻塞vs.异步弹出或者自建单例窗体弹出都可以。
3.设计时界面的绘制
一般的,默认的设计时界面绘制是我们在自定义控件里的绘制界面,但是我们可以通过重写OnPaintAdornments这个方法进行设计时界面的绘制。
Protected Overrides Sub OnPaintAdornments(pe As System.Windows.Forms.PaintEventArgs)
mybase.OnPaintAdornments
'里面添加设计时界面的代码。
End sub
之所以要用这个的原因是,分离开设计时和运行时的界面,这样在鼠标交互时,并不影响到源控件的属性。简单的说就是,自定义设计器的话,设计时的界面要自己绘制,更好配合鼠标控制得到相关的效果。绘制方法和自定义控件绘制类似,只是在不同的地方绘制。
重写功能完成后,就可以将这个自定义设计器应用到自定义控件上了。
假设有类MyUserControl
<Designer(GetType(MyDesigner))>
Public Class MyUserControl
Inherits UserControl
End Class
在头上打上这个特性标记即可应用自定义的设计器
附上我自定义控件按钮组做出来的效果吧
仅演示功能,不要太在意外观
小弟水平有限,是个菜鸡,美工也不好,也是第一次写博客,希望能有用,路过的各位大佬勿喷哈。
推荐阅读