- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[VB.NET] Chia sẻ source tạo sắp xếp đội hình bóng đá Line-ups đội bóng
Xin chào các bạn, bài viết hôm nay mình chia sẻ các bạn source code tạo đội hình thi đấu bóng đá, có thêm di chuyển và sắp xếp đội hình trên VB.NET Winform.
[VB.NET] Line-ups Layout Football in Winform
Dưới đây là hình ảnh demo ứng dụng:
Các chức năng:
- Tạo mới cầu thủ
- Load danh sách cầu thủ
- Lưu lại đội hình
- Tải đội hình đã cài đặt
- Chỉnh sửa di chuyển trực tiếp đội hình
Video demo ứng dụng:
Đầu tiên, các bạn tạo cho mình một usercontrol PlayerControl.vb
Source code VB:
Imports System.ComponentModel
Imports System.Drawing
Imports System.Drawing.Drawing2D
Imports System.Net.Http.Headers
Imports System.Windows.Forms
Imports System.Windows.Forms.Design
Imports System.Windows.Forms.VisualStyles.VisualStyleElement
Public Class PlayerControlData
Public _textValue As String
Public _textColor As Color
Public _textFont As Font
Public _namePlayerValue As String
Public _namePlayerColor As Color
Public _namePlayerFont As Font
Public _backgroundColor As Color
Public _borderColor As Color
Public _borderWidth As Integer
Public _size As Size
Public _location As Point
Public _urlAvatarImage As String
End Class
Public Class PlayerControl
Inherits UserControl
Private _textValue As String = "GK"
Private _textColor As Color = Color.White
Private _textFont As Font = Me.Font
Private _namePlayerValue As String = "Player Name"
Private _namePlayerColor As Color = Color.White
Private _namePlayerFont As Font = Me.Font
Private _backgroundColor As Color = ColorTranslator.FromHtml("#D00C0F")
Private _borderColor As Color = Color.White
Private _borderWidth As Integer = 4
Private contextMenuNew As ContextMenuStrip
Private editMenuItem As ToolStripMenuItem
Private advEditMenuItem As ToolStripMenuItem
Private removeMenuItem As ToolStripMenuItem
Private _urlAvatarImage As String
<Category("Appearance"), DisplayName("Choose Player Image")>
<EditorAttribute(GetType(CustomFileBrowser), GetType(System.Drawing.Design.UITypeEditor))>
Public Property AvatarPlayerImage() As String
Get
Return _urlAvatarImage
End Get
Set(ByVal value As String)
_urlAvatarImage = value
If String.IsNullOrEmpty(value) Then
Me.Size = New Size(88, 80)
Else
Me.Size = New Size(120, 125)
End If
Invalidate()
End Set
End Property
Public Property AvatarImage() As Image
Get
If String.IsNullOrEmpty(_urlAvatarImage) Then
Return Nothing
End If
Return GetImageFromLocalDisk(_urlAvatarImage)
End Get
Set(value As Image)
End Set
End Property
Public Function GetImageFromLocalDisk(filePath As String) As Image
If filePath Is Nothing Then
Return Nothing
End If
Dim image As Image = Image.FromFile(filePath)
Return image
End Function
Public Sub New()
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
BackColor = Color.Transparent
Padding = New Padding(10, 5, 10, 25)
If AvatarImage Is Nothing Then
Me.Size = New Size(88, 80)
Else
Me.Size = New Size(120, 125)
End If
_namePlayerFont = New Font("Tahoma", 10, FontStyle.Regular)
_textFont = New Font("Tahoma", 14, FontStyle.Bold)
Me.Cursor = Cursors.Hand
contextMenuNew = New ContextMenuStrip()
editMenuItem = New ToolStripMenuItem("Edit")
advEditMenuItem = New ToolStripMenuItem("Advance Edit")
removeMenuItem = New ToolStripMenuItem("Remove")
' Add event handlers for menu items
AddHandler editMenuItem.Click, AddressOf EditMenuItem_Click
AddHandler advEditMenuItem.Click, AddressOf AdvEditMenuItem_Click
AddHandler removeMenuItem.Click, AddressOf RemoveMenuItem_Click
' Add menu items to context menu
contextMenuNew.Items.Add(editMenuItem)
contextMenuNew.Items.Add(advEditMenuItem)
contextMenuNew.Items.Add(removeMenuItem)
' Attach the context menu to the control
Me.ContextMenuStrip = contextMenuNew
Me.DoubleBuffered = True
End Sub
Public Function GetPlayerData() As PlayerControlData
Dim userData As New PlayerControlData()
userData._textValue = Me.TextValue
userData._textColor = Me.TextColor
userData._textFont = Me.TextFont
userData._namePlayerValue = Me.NamePlayerValue
userData._namePlayerColor = Me.NamePlayerColor
userData._namePlayerFont = Me.NamePlayerFont
userData._backgroundColor = Me.BackgroundColor
userData._borderColor = Me.BorderColor
userData._borderWidth = Me.BorderWidth
userData._size = Me.Size
userData._location = Me.Location
userData._urlAvatarImage = Me.AvatarPlayerImage
Return userData
End Function
Public Sub SetPlayerData(userData As PlayerControlData)
Me.TextValue = userData._textValue
Me.TextColor = userData._textColor
Me.TextFont = userData._textFont
Me.NamePlayerValue = userData._namePlayerValue
Me.NamePlayerColor = userData._namePlayerColor
Me.NamePlayerFont = userData._namePlayerFont
Me.BackgroundColor = userData._backgroundColor
Me.BorderColor = userData._borderColor
Me.BorderWidth = userData._borderWidth
Me.Size = userData._size
Me.Location = userData._location
Me.AvatarPlayerImage = userData._urlAvatarImage
End Sub
Public Event EditClicked As EventHandler
Private Sub EditMenuItem_Click(sender As Object, e As EventArgs)
' Raise the EditClicked event
RaiseEvent EditClicked(Me, EventArgs.Empty)
End Sub
Public Event AdvEditClicked As EventHandler
Private Sub AdvEditMenuItem_Click(sender As Object, e As EventArgs)
' Raise the EditClicked event
RaiseEvent AdvEditClicked(Me, EventArgs.Empty)
End Sub
Private Sub RemoveMenuItem_Click(sender As Object, e As EventArgs)
Dim dlg = MessageBox.Show("Bạn muốn xóa player này?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
If dlg = DialogResult.Yes Then
Dim parentForm As Form = Me.FindForm()
parentForm.Controls.Remove(Me)
End If
End Sub
<Browsable(True)>
<Category("Appearance")>
<Description("The main text value to display in the control.")>
Public Property TextValue() As String
Get
Return _textValue
End Get
Set(ByVal value As String)
_textValue = value
Invalidate()
End Set
End Property
<Browsable(True)>
<Category("Appearance")>
<Description("The color of the main text.")>
Public Property TextColor() As Color
Get
Return _textColor
End Get
Set(ByVal value As Color)
_textColor = value
Invalidate()
End Set
End Property
<Browsable(True)>
<Category("Appearance")>
<Description("The font of the main text.")>
Public Property TextFont() As Font
Get
Return _textFont
End Get
Set(ByVal value As Font)
_textFont = value
Invalidate()
End Set
End Property
<Browsable(True)>
<Category("Appearance")>
<Description("The name player value to display below the circle.")>
Public Property NamePlayerValue() As String
Get
Return _namePlayerValue
End Get
Set(ByVal value As String)
_namePlayerValue = value
Invalidate()
End Set
End Property
<Browsable(True)>
<Category("Appearance")>
<Description("The color of the name player text.")>
Public Property NamePlayerColor() As Color
Get
Return _namePlayerColor
End Get
Set(ByVal value As Color)
_namePlayerColor = value
Invalidate()
End Set
End Property
<Browsable(True)>
<Category("Appearance")>
<Description("The font of the name player text.")>
Public Property NamePlayerFont() As Font
Get
Return _namePlayerFont
End Get
Set(ByVal value As Font)
_namePlayerFont = value
Invalidate()
End Set
End Property
<Browsable(True)>
<Category("Appearance")>
<Description("The background color of the control.")>
Public Property BackgroundColor() As Color
Get
Return _backgroundColor
End Get
Set(ByVal value As Color)
_backgroundColor = value
Invalidate()
End Set
End Property
<Browsable(True)>
<Category("Appearance")>
<Description("The color of the border.")>
Public Property BorderColor() As Color
Get
Return _borderColor
End Get
Set(ByVal value As Color)
_borderColor = value
Invalidate()
End Set
End Property
<Browsable(True)>
<Category("Appearance")>
<Description("The width of the border.")>
Public Property BorderWidth() As Integer
Get
Return _borderWidth
End Get
Set(ByVal value As Integer)
_borderWidth = value
Invalidate()
End Set
End Property
'Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
' MyBase.OnPaint(e)
' Dim g As Graphics = e.Graphics
' g.SmoothingMode = SmoothingMode.AntiAlias
' ' Calculate the available area for the circle, considering padding
' Dim availableWidth As Single = ClientSize.Width - Padding.Left - Padding.Right
' Dim availableHeight As Single = ClientSize.Height - Padding.Top - Padding.Bottom
' ' Calculate the diameter of the circle based on the available area
' Dim diameter As Single = Math.Min(availableWidth, availableHeight)
' ' Calculate the position of the circle based on padding
' Dim circleX As Single = Padding.Left + (availableWidth - diameter) / 2
' Dim circleY As Single = Padding.Top + (availableHeight - diameter) / 2
' ' Create a rectangle that represents the circle
' Dim circleRect As New RectangleF(circleX, circleY, diameter, diameter)
' ' Draw the background circle
' Dim backgroundBrush As New SolidBrush(_backgroundColor)
' g.FillEllipse(backgroundBrush, circleRect)
' ' Draw the border
' Dim borderPen As New Pen(_borderColor, _borderWidth)
' g.DrawEllipse(borderPen, circleRect)
' ' Draw the main text in the center of the circle
' Dim textBrush As New SolidBrush(_textColor)
' Dim format As New StringFormat()
' format.Alignment = StringAlignment.Center
' format.LineAlignment = StringAlignment.Center
' g.DrawString(_textValue, _textFont, textBrush, circleRect, format)
' textBrush.Color = _namePlayerColor
' ' Draw the name player text below the circle image
' Dim nameRect As New RectangleF(0, circleRect.Bottom + 5, ClientSize.Width, ClientSize.Height - circleRect.Bottom - 5)
' g.DrawString(_namePlayerValue, _namePlayerFont, textBrush, nameRect, format)
'End Sub
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
MyBase.OnPaint(e)
Dim g As Graphics = e.Graphics
g.SmoothingMode = SmoothingMode.AntiAlias
Dim format As New StringFormat()
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Center
' Calculate the available area for the circle, considering padding
Dim availableWidth As Single = ClientSize.Width - Padding.Left - Padding.Right
Dim availableHeight As Single = ClientSize.Height - Padding.Top - Padding.Bottom
' Calculate the diameter of the circle based on the available area
Dim diameter As Single = Math.Min(availableWidth, availableHeight)
' Calculate the position of the circle based on padding
Dim circleX As Single = Padding.Left + (availableWidth - diameter) / 2
Dim circleY As Single = Padding.Top + (availableHeight - diameter) / 2
' Create a rectangle that represents the circle
Dim circleRect As New RectangleF(circleX, circleY, diameter, diameter)
If String.IsNullOrEmpty(AvatarPlayerImage) Then
' Draw the background circle
Dim backgroundBrush As New SolidBrush(_backgroundColor)
g.FillEllipse(backgroundBrush, circleRect)
' Draw the border
Dim borderPen As Pen
If String.IsNullOrEmpty(AvatarPlayerImage) Then
borderPen = New Pen(_borderColor, _borderWidth)
Else
borderPen = New Pen(Color.Transparent, _borderWidth)
End If
g.DrawEllipse(borderPen, circleRect)
' Draw the main text in the center of the circle
Dim textBrush As New SolidBrush(_textColor)
g.DrawString(_textValue, _textFont, textBrush, circleRect, format)
End If
Dim textBrush2 As New SolidBrush(_namePlayerColor)
format.Alignment = StringAlignment.Center
format.LineAlignment = StringAlignment.Center
' Draw the name player text below the circle image
Dim nameRect As New RectangleF(0, circleRect.Bottom + 5, ClientSize.Width, ClientSize.Height - circleRect.Bottom - 5)
g.DrawString(_namePlayerValue, _namePlayerFont, textBrush2, nameRect, format)
' Draw the avatar image
If AvatarImage IsNot Nothing Then
g.DrawImage(AvatarImage, circleRect)
End If
End Sub
'Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
' MyBase.OnMouseDown(e)
' DoDragDrop(Me, DragDropEffects.Move)
'End Sub
Private mdLoc As Point
Protected Overrides Sub OnMouseDown(e As MouseEventArgs)
MyBase.OnMouseDown(e)
mdLoc = e.Location
End Sub
Protected Overrides Sub OnMouseMove(e As MouseEventArgs)
MyBase.OnMouseMove(e)
If e.Button = MouseButtons.Left Then
Me.Left += e.X - mdLoc.X
Me.Top += e.Y - mdLoc.Y
End If
End Sub
End Class
Public Class CustomFileBrowser
Inherits FileNameEditor
Protected Overrides Sub InitializeDialog(ByVal openFileDialog As OpenFileDialog)
MyBase.InitializeDialog(openFileDialog)
openFileDialog.Title = "Select Player Image: "
openFileDialog.Filter = "Image File (*.png)|*.png"
End Sub
End Class
Tiếp đến là source code ở Form1.vb chứa hình ảnh sân bóng và sắp xếp đội hình
Imports System.IO
Imports System.Reflection
Imports System.Threading
Imports Newtonsoft.Json
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.DoubleBuffered = True
End Sub
Private Sub menu_save_Click(sender As Object, e As EventArgs) Handles menu_save.Click
Dim saveFileDialog As New SaveFileDialog()
saveFileDialog.RestoreDirectory = True
saveFileDialog.FileName = "mylayout.layout"
saveFileDialog.Filter = "Layout Files (*.layout)|*.layout|All Files (*.*)|*.*"
saveFileDialog.FilterIndex = 1
Dim result As DialogResult = saveFileDialog.ShowDialog()
If result = DialogResult.OK Then
Dim selectedFileName As String = saveFileDialog.FileName
Dim listData = New List(Of PlayerControlData)
For Each control As Control In Me.Controls
If TypeOf control Is PlayerControl Then
Dim pictureBox As PlayerControlData = DirectCast(control, PlayerControl).GetPlayerData()
listData.Add(pictureBox)
End If
Next
Dim jsonData = JsonConvert.SerializeObject(listData)
File.WriteAllText(saveFileDialog.FileName, jsonData)
MessageBox.Show("Save Layout Successful.")
End If
End Sub
Private Sub menu_open_Click(sender As Object, e As EventArgs) Handles menu_open.Click
Dim openFileDialog As New OpenFileDialog()
openFileDialog.RestoreDirectory = True
openFileDialog.Filter = "Layout Files (*.layout)|*.layout|All Files (*.*)|*.*"
openFileDialog.FilterIndex = 1
Dim result As DialogResult = openFileDialog.ShowDialog()
If result = DialogResult.OK Then
Dim selectedFileName As String = openFileDialog.FileName
Dim rawData = File.ReadAllText(selectedFileName)
Dim listData = JsonConvert.DeserializeObject(Of List(Of PlayerControlData))(rawData)
ClearAllPlayer()
For Each item As PlayerControlData In listData
Dim itemPlayer = New PlayerControl()
itemPlayer.SetPlayerData(item)
AddHandler itemPlayer.EditClicked, AddressOf CircularTextControl_EditClicked
AddHandler itemPlayer.AdvEditClicked, AddressOf AdvCircularTextControl_EditClicked
Me.Controls.Add(itemPlayer)
Next
End If
End Sub
Private Sub menu_add_Click(sender As Object, e As EventArgs) Handles menu_add.Click
Dim player = New PlayerControl()
Dim frmAddPlayer = New FrmAddPlayer(player)
Dim result = frmAddPlayer.ShowDialog()
If result = DialogResult.OK Then
Me.Controls.Add(player)
AddHandler player.EditClicked, AddressOf CircularTextControl_EditClicked
AddHandler player.AdvEditClicked, AddressOf AdvCircularTextControl_EditClicked
End If
End Sub
Private Sub CircularTextControl_EditClicked(sender As Object, e As EventArgs)
Dim player = DirectCast(sender, PlayerControl)
Dim frmEdit = New FrmEditPlayer(player)
Dim dlg = frmEdit.ShowDialog()
If dlg = DialogResult.OK Then
player = player
End If
End Sub
Sub ClearAllPlayer()
For i As Integer = Me.Controls.Count - 1 To 0 Step -1
Dim control As Control = Me.Controls(i)
If TypeOf control Is PlayerControl Then
Me.Controls.Remove(control)
control.Dispose()
End If
Next
End Sub
Private Sub menu_new_Click(sender As Object, e As EventArgs) Handles menu_new.Click
ClearAllPlayer()
CreateNewPlayer("GK", "Allision", 56, 204, Color.Green)
CreateNewPlayer("LB", "Moreno", 153, 27)
CreateNewPlayer("CB", "Van DijK", 153, 127)
CreateNewPlayer("CB", "Lovren", 153, 239)
CreateNewPlayer("RB", "Clyne", 153, 348)
CreateNewPlayer("CM", "Wijnadium", 317, 96)
CreateNewPlayer("CM", "Fabinho", 317, 270)
CreateNewPlayer("AM", "Fimino", 461, 189)
CreateNewPlayer("LW", "Origi", 536, 35)
CreateNewPlayer("RW", "Mane", 536, 330)
CreateNewPlayer("CF", "F.Torres", 621, 180)
End Sub
Private Sub CreateNewPlayer(position As String, player_name As String, x As Integer, y As Integer, Optional ByVal bgColor As Color = Nothing)
Dim player As New PlayerControl()
If bgColor = Nothing Then
player.BackgroundColor = ColorTranslator.FromHtml("#D00C0F")
Else
player.BackgroundColor = bgColor
End If
player.TextValue = position
player.NamePlayerValue = player_name
player.Location = New Point(x, y)
AddHandler player.EditClicked, AddressOf CircularTextControl_EditClicked
AddHandler player.AdvEditClicked, AddressOf AdvCircularTextControl_EditClicked
Me.Controls.Add(player)
End Sub
Private Sub AdvCircularTextControl_EditClicked(sender As Object, e As EventArgs)
Dim player = DirectCast(sender, PlayerControl)
'Dim backupPlayer = player.Clone()
Dim clonedObject As New PlayerControl()
clonedObject.BackgroundColor = player.BackgroundColor
clonedObject.TextValue = player.TextValue
clonedObject.NamePlayerValue = player.NamePlayerValue
clonedObject.NamePlayerColor = player.NamePlayerColor
clonedObject.NamePlayerFont = player.NamePlayerFont
clonedObject.TextFont = player.TextFont
clonedObject.Location = player.Location
clonedObject.AvatarPlayerImage = player.AvatarPlayerImage
AddHandler clonedObject.EditClicked, AddressOf CircularTextControl_EditClicked
AddHandler clonedObject.AdvEditClicked, AddressOf AdvCircularTextControl_EditClicked
Dim originLocation = player.Location
Dim frmEdit = New FrmAddPlayer(player)
Dim dlg = frmEdit.ShowDialog()
If dlg = DialogResult.OK Then
player.Location = originLocation
Me.Controls.Add(player)
Else
Me.Controls.Add(clonedObject)
End If
End Sub
Private Sub menu_clear_Click(sender As Object, e As EventArgs) Handles menu_clear.Click
ClearAllPlayer()
End Sub
End Class
Tạo 1 form cho menu Edit FrmEditPlayer.vb
Public Class FrmEditPlayer
Public _playControl As PlayerControl
Public Sub New(ByVal playControl As PlayerControl)
InitializeComponent()
txtPos.Text = playControl.TextValue
txtName.Text = playControl.NamePlayerValue
txtUrl.Text = playControl.AvatarPlayerImage
_playControl = playControl
If Not String.IsNullOrEmpty(txtUrl.Text) Then
Dim pic = GetImageFromLocalDisk(txtUrl.Text)
picImage.Image = pic
End If
End Sub
Private Sub btnOk_Click(sender As Object, e As EventArgs) Handles btnOk.Click
_playControl.TextValue = txtPos.Text.Trim
_playControl.NamePlayerValue = txtName.Text.Trim
_playControl.AvatarPlayerImage = txtUrl.Text.Trim
End Sub
Public Function GetImageFromLocalDisk(filePath As String) As Image
Dim image As Image = Image.FromFile(filePath)
Return image
End Function
Private Sub btnBrowse_Click(sender As Object, e As EventArgs) Handles btnBrowse.Click
Dim openFileDialog As New OpenFileDialog()
openFileDialog.Filter = "Image Files (*.png;*.gif;*.jpg;*.jpeg)|*.png;*.gif;*.jpg;*.jpeg"
If openFileDialog.ShowDialog() = DialogResult.OK Then
Dim imagePath As String = openFileDialog.FileName
picImage.Image = Image.FromFile(imagePath)
txtUrl.Text = openFileDialog.FileName
End If
End Sub
End Class
Và tiếp đến tạo một form Advance Edit hay AddPlayer:
Public Class FrmAddPlayer
Public Sub New(ByVal playerControl As PlayerControl)
InitializeComponent()
playerControl.Location = New System.Drawing.Point(136, 248)
Me.Controls.Add(playerControl)
PropertyGrid1.SelectedObject = playerControl
End Sub
Private Sub btnHoanTat_Click(sender As Object, e As EventArgs) Handles btnHoanTat.Click
End Sub
End Class
Thanks for watching!