九宫
vb.net吧
全部回复
仅看楼主
level 1
Imports System.Collections.Generic
Imports System.Diagnostics
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Windows.Forms
Imports NineLock.Properties
Namespace NineLock
Public Partial Class FrmMain
Inherits Form
#Region "构造函数"
Public Sub New()
InitializeComponent()
'初始化九宫格的点
CreadtNinePoint()
End Sub
#End Region
#Region "变量"
'九宫格的九个点
Public NinePoints As New List(Of Point)()
'解锁点列表
Public UnLockPoint As New List(Of Point)()
'绘制九宫格圆心点的画笔
Public DrawPen As New Pen(Color.FromArgb(200, Color.Blue), 5)
'是否开始绘制解锁(鼠标左键按下时开始)
Private _isDraw As Boolean = False
'是否选中九宫格中的其中一个点
Private _isSelected As Boolean = False
'临时存储密码字符串
Public PasswordStr As String = ""
#End Region
#Region "方法"
''' <summary>
''' 初始化九宫格的九个点
''' </summary>
Public Sub CreadtNinePoint()
NinePoints.Clear()
Dim pwith As Integer = panel1.Width / 3
Dim pheight As Integer = panel1.Height / 3
For y As Integer = 0 To 2
For x As Integer = 0 To 2
NinePoints.Add(New Point(pwith * x + pwith / 2, pheight * y + pheight / 2))
Next
Next
End Sub
''' <summary>
''' 绘制九宫格解锁图案
''' </summary>
Public Sub ShowAreaAndLine()
Try
'添加一块画布
Dim backBit As New Bitmap(panel1.Width, panel1.Height)
Dim g As Graphics = Graphics.FromImage(backBit)
g.SmoothingMode = SmoothingMode.HighQuality
'清除Graphics
g.Clear(panel1.BackColor)
'绘制画布
g.DrawImage(backBit, New Rectangle(0, 0, panel1.Width, panel1.Height), New Rectangle(0, 0, panel1.Width, panel1.Height), GraphicsUnit.Pixel)
'绘制九宫格的点
For i As Integer = 0 To NinePoints.Count - 1
g.DrawImage(Resources.NinePoints, New Point(NinePoints(i).X - 20, NinePoints(i).Y - 20))
Next
'绘制选中的解锁点
Dim pointIndex As Integer = 1
Dim pointEnd As Point
Dim pointStart As New Point(0, 0)
For i As Integer = 0 To UnLockPoint.Count - 1
'绘制选中点背景
If i < UnLockPoint.Count - 1 OrElse _isSelected Then
'高亮绘制选中点
g.DrawImage(Resources.NinePointsSelect, New Point(UnLockPoint(i).X - 20, UnLockPoint(i).Y - 20))
End If
pointEnd = UnLockPoint(i)
'绘制两点连接的直线
If pointIndex > 1 Then
g.DrawLine(DrawPen, pointStart, pointEnd)
End If
'绘制小圆,覆盖两条线段的连接处
If i < UnLockPoint.Count - 1 OrElse _isSelected Then
'绘制区域()
Dim rg As New Rectangle(UnLockPoint(i).X - 6, UnLockPoint(i).Y - 6, 11, 11)
g.DrawEllipse(DrawPen, rg)
'画空心圆
Dim bru As Brush = New SolidBrush(Color.FromArgb(255, Color.Blue))
'填充空心圆,实心圆
g.FillEllipse(bru, rg)
End If
pointStart = UnLockPoint(i)
pointIndex += 1
Next
g.Dispose()
panel1.CreateGraphics().DrawImage(backBit, 0, 0)
backBit.Dispose()
Catch ex As Exception
Debug.Write(ex.Message)
End Try
End Sub
''' <summary>
''' 传入一个点,判断是否是九宫格中的一个点,并处理
''' </summary>
''' <param name="p">点</param>
Public Sub AddPoint(p As Point)
For i As Integer = 0 To NinePoints.Count - 1
'遍历九宫格的点,鼠标经过的点是否在其中一个九宫格的点的范围内
If (p.X > NinePoints(i).X - 20 AndAlso p.X < NinePoints(i).X + 20) AndAlso (p.Y > NinePoints(i).Y - 20 AndAlso p.Y < NinePoints(i).Y + 20) Then
'判断九宫格的点是否已经选择过,若选择过则不处理
If Not (PasswordStr.IndexOf((i + 1).ToString()) > -1) Then
'若尚未选择过该点则添加
UnLockPoint(UnLockPoint.Count - 1) = (NinePoints(i))
'追加密码字符串
PasswordStr = PasswordStr & Convert.ToString((i + 1))
label1.Text = String.Format("解锁密码顺序:{0}", PasswordStr)
_isSelected = True
Return
End If
End If
Next
End Sub
#End Region
#Region "事件"
''' <summary>
''' 鼠标点击左键且移动时开始绘制解锁
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub DrawMouseMove(sender As Object, e As MouseEventArgs)
If _isDraw Then
'如果还未确定九宫格的点则实时改变最后一个点的坐标
If Not _isSelected Then
UnLockPoint(UnLockPoint.Count - 1) = e.Location
Else
'如果确定了则再添加一个改变点
UnLockPoint.Add(e.Location)
_isSelected = False
End If
AddPoint(e.Location)
End If
ShowAreaAndLine()
GC.Collect()
End Sub
''' <summary>
''' 鼠标左键弹起时结束绘制九宫格
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub DrawMouseUp(sender As Object, e As MouseEventArgs)
If _isDraw Then
'停止绘制标示
_isDraw = False
'清除绘制的九宫格点
UnLockPoint.Clear()
'显示密码(可用来判断九宫格密码)
If PasswordStr.Length < 4 Then
MessageBox.Show("九宫格密码不能小于4个点")
Else
If PasswordStr = "27546" Then
MessageBox.Show(String.Format("解锁成功,工程解锁密码为:{0}", "我爱BinGoo"))
Else
MessageBox.Show(String.Format("解锁密码错误"))
End If
End If
PasswordStr = ""
label1.Text = String.Format("解锁密码顺序:{0}", PasswordStr)
'绘制九宫格(此处相当于初始化九宫格)
ShowAreaAndLine()
End If
End Sub
''' <summary>
''' 鼠标左键点击时触发开始绘制九宫格
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub DrawMouseDown(sender As Object, e As MouseEventArgs)
'开始绘制标记
_isDraw = True
'添加第一个点击的点
UnLockPoint.Add(e.Location)
'显示九宫格解锁图案
ShowAreaAndLine()
End Sub
''' <summary>
''' 船体加载时绘制解锁背景
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub Form1_Load(sender As Object, e As EventArgs)
'添加一块画布
Dim backBit As New Bitmap(panel1.Width, panel1.Height)
Dim g As Graphics = Graphics.FromImage(backBit)
g.SmoothingMode = SmoothingMode.HighQuality
'清除Graphics
g.Clear(panel1.BackColor)
'绘制画布
g.DrawImage(backBit, New Rectangle(0, 0, panel1.Width, panel1.Height), New Rectangle(0, 0, panel1.Width, panel1.Height), GraphicsUnit.Pixel)
'绘制九宫格的点
For i As Integer = 0 To NinePoints.Count - 1
g.DrawImage(Resources.NinePoints, New Point(NinePoints(i).X - 20, NinePoints(i).Y - 20))
Next
panel1.BackgroundImage = backBit
End Sub
#End Region
End Class
End Namespace
2017年10月24日 12点10分 1
1