快速自定义Region的解决方法
作者:wgscd(自由奔腾)
(转载请注明作者和出处)
.net为们提供了简单方便自定义控件形状(Region)的方法,不管是Form,Button,Label等,我们都可以通过改变Region属性达到自定义形状的目的,.NET 的GDI+功能强大是有目共睹的!画各种图形的方法就不用我说了,我的目标是快速实现一个自定意的Region,通常我们的方法是Drawing2D.GraphicsPath的AddRectangle,AddPolygon,AddLine之类的,但是当我们想画一个很复杂的Region时候(比如画一个人体是造型)这些简单的方法使用起来就难。 我 正在做一个播放器,想将界面加上个人体的形状,我开始是用AddPolygon的方法计算各Point(x,y),可想而知,多么的费力!中午我在食堂吃饭了(许多事情都是在不经意间闪现的吧),哈哈,忽然想到了,原来方法如下:
我一说大家就明白了,原理:在From的先将你要画的Rrgion画成图片,在将Form的背景设置为此图片
加一个RichTextBox1,一个TextBox
Dim x, y As String
Dim i As Integer '用于记录Point数
Private Sub Form1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseMove
Me.TextBox1.Text = e.X & "," & e.Y
End Sub
Private Sub Form1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseUp
If e.Button = MouseButtons.Right Then
Me.RichTextBox1.Text = x & "Point 数" & i
End If
End Sub
Dim i As Integer
Private Sub Form1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown
If e.Button =MouseButtons.Left Then
l = True
Dim c As Graphics = Me.CreateGraphics
c.DrawLine(New Pen(Color.Red), e.X, e.Y, e.X - 1, e.Y - 1)
c.SmoothingMode = SmoothingMode.HighQuality
x &= "new Point(" & e.X & "," & e.Y & "),"
i += 1
End If
End Sub
现在你应该看懂这样的目的了吧!也就是记录鼠标单击的点,因为我们需要这些点来构造我们的Point(),不规则的Region当然一般用Drawing2D.GraphicsPath的AddPolygon方法,于是我们要Point()。
而现在这些Point都有了,最后就是将TextBox1的内容复制来构造我们的Point()
例如:
Dim p As New Drawing2D.GraphicsPath
Dim pf As Point() = New Point() {New Point(60, 6), New Point(67, 1), New Point(105, 6), New Point(107, 13), New Point(111, 25), New Point(111, 32), New Point(112, 42), New Point(109, 46), New Point(108, 55), New Point(108, 70), New Point(111, 83), New Point(112, 89), New Point(119, 96), New Point(122, 102), New Point(118, 112), New Point(118, 118), New Point(124, 128), New Point(128, 137), New Point(128, 152), New Point(119, 166), New Point(113, 176), New Point(116, 194), New Point(120, 203), New Point(126, 212), New Point(129, 216), New Point(129, 16), New Point(135, 12), New Point(297, 12), New Point(304, 7), New Point(445, 7), New Point(454, 14), New Point(467, 20), New Point(475, 20), New Point(483, 12), New Point(650, 11), New Point(650, 336), New Point(485, 336), New Point(477, 327), New Point(473, 327), New Point(466, 336), New Point(206, 336), New Point(187, 323), New Point(180, 324), New Point(164, 330), New Point(152, 330), New Point(141, 326), New Point(135, 322), New Point(128, 314), New Point(129, 311), New Point(125, 325), New Point(120, 337), New Point(107, 338), New Point(70, 335), New Point(49, 304), New Point(37, 302), New Point(20, 287), New Point(26, 265), New Point(21, 249), New Point(14, 234), New Point(8, 218), New Point(4, 203), New Point(2, 193), New Point(3, 181), New Point(7, 158), New Point(15, 125), New Point(21, 103), New Point(25, 94), New Point(37, 86), New Point(47, 81), New Point(51, 71), New Point(53, 59), New Point(52, 45), New Point(54, 33), New Point(56, 18), New Point(59, 6), New Point(34, 147), New Point(27, 168), New Point(22, 185), New Point(25, 208), New Point(30, 233), New Point(34, 251), New Point(35, 240), New Point(38, 226), New Point(41, 210), New Point(43, 198), New Point(42, 182), New Point(38, 169), New Point(36, 156), New Point(35, 148)} 'Point 数75
p.AddPolygon(pf)
Me.Region = New Region(p)
完成
效果如下:
http://blog.youkuaiyun.com/images/blog_youkuaiyun.com/wgsnet/97899/r_region.JPG