Úvod
Když jsem se rozhodoval jakou síťovou aplikaci budu popisovat, jako první mě napadnul chatovací prográmek. Řekl jsem si ale, že půjdu o kousek dál a pokusím se popsat krok za krokem vývoj jednoduché sdílené kreslící tabule (podobnou jako znáte například z MSN Live Messangeru). To znamená, že tu nebudeme řešit jen základní komunikaci, ale i nějakou tu synchronizaci a jednoduchý protokol s několika příkazy.
Základní funkce
Ve výsledku bude program podporovat tyto funkce:
- možnost relaci založit a připojit se na ní
- kreslení čar na straně serveru i klienta
- změna barvy a tloušťky čáry
Potřebné znalosti
Pokusím se v článku popsat vše, co je nutné provést, abyste dosáhli stejného výsledku jako zde. Chci klást nějvětší důraz na vysvětlení síťových prvků, proto například o vykreslování tolik rozprávět nebudu. O tom si můžete přečíst v článku
Hungry Snake. Kdyby vám i přesto nebylo něco jasné, zeptejte se v diskuzi.
Rozvržení
Založíme si projekt typu
Windows Application. Aplikace poběží na formuláři, který má neměnnou velikost a bude obsahovat menu, kreslící plochu a stavový panel.
Začneme nastavením vlastnosti formuláře
FrameBorderStyle na
FixedSingle a
MaximizeBox na
False, čímž dosáhneme, že formulář nebude možné maximalizovat, ani ho žádným jiným způsobem zmenšit, či zvětšit.
Pak se vrhneme na horní menu. Na formulář vložíme objekt
MenuStrip z Toolboxu (kategorie
Menus&Toolbars), který se automaticky nalinkuje jako hodnota vlastnosti formuláře
MainMenuStrip (tím se stane výchozím menu na formuláři). Teď už můžete pomocí Window Designeru navrhnout menu stejně jako na obrázku:
TIP: Vodorovné oddělovací čáry uděláme tak, že jako Text zadáme - (pomlčku) TIP: Příkaz Odpojit znepřístupníte v kontextovém menu odškrtnutím položky Enabled Teď vložíme
StatusStrip (stejná kategorie jako MenuStrip), který nám pomůže informovat uživatele o stavu připojení. Nezapomeňte nastavit
SizingGrid na
False - odstraníte tím malou mřížku vpravo dole na změnu velikosti formuláře
. Aby se na StatusStripu mohlo něco zobrazovat, přidáme do něj StatusLabel jako na obrázku:
Na StatusLabel pak klikneme a nastavíme mu jméno na
StripInfo a text na
Připraven.
Poslední, co nám zbývá, je vložit na formulář PictureBox, do kterého budeme vykreslovat. Jeho jméno bude
PicTabule. Formulář by teď měl vypadat asi takto:
Vykreslování
To, co je na kreslící tabuli, budeme muset mít někde uložené. V našem případě bude vhodné použít objekt
Drawing.Bitmap. Funkce pro vykreslování nám pak zprostředkuje
Drawing.Graphics. Jejich deklaraci a inicializaci provedeme takto:
Dim grp As Drawing.Graphics
Dim TBitmap As Drawing.Bitmap
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
TBitmap = New Bitmap(PicTabule.Width, PicTabule.Height)
grp = Graphics.FromImage(TBitmap)
grp.Clear(Color.Black)
grp.SmoothingMode =Drawing2D.SmoothingMode.AntiAlias
End Sub
Aby se obsah
TBitmap vykresloval do PictureBoxu, bude potřeba vložit tento kód:
Private Sub PicTabule_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PicTabule.Paint
e.Graphics.DrawImage(TBitmap, 0, 0)
End Sub
Nesmíme zapomenout na tlačítka "Smazat tabuli" a "Konec" v menu:
Private Sub ToolStripMenuItem_SmazatTabuli_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripMenuItem_SmazatTabuli.Click
grp.Clear(Color.Black)
PicTabule.Invalidate()
End Sub
Private Sub StripMenuItemKonec_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles StripMenuItemKonec.Click
End
End Sub
A nakonec ještě kód, který dovolí myší kreslit čáry:
Dim PosledniBod As Point
Dim drawWidth As Integer = 10
Dim drawColor As Color = Color.White
Dim Kresleni As Boolean
Private Sub PicTabule_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicTabule.MouseDown
If e.Button = Windows.Forms.MouseButtons.Left Then
PosledniBod = e.Location
grp.FillEllipse(New Pen(drawColor).Brush, New RectangleF(e.X - drawWidth / 2, e.Y - drawWidth / 2, drawWidth, drawWidth))
PicTabule.Invalidate()
Kresleni = True
End If
End Sub
Private Sub PicTabule_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicTabule.MouseMove
If e.Button = Windows.Forms.MouseButtons.Left And Kresleni = True Then
grp.DrawLine(New Pen(drawColor, drawWidth), PosledniBod, e.Location)
grp.FillEllipse(New Pen(drawColor).Brush, New RectangleF(e.X - drawWidth / 2, e.Y - drawWidth / 2, drawWidth, drawWidth))
PicTabule.Invalidate()
PosledniBod = e.Location
End If
End Sub
Private Sub PicTabule_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PicTabule.MouseUp
If e.Button = Windows.Forms.MouseButtons.Left Then
Kresleni = False
End If
End Sub
To bude prozatím vše. Výsledek by měl vypadat stejně jako na obrázku níže.
Zatím náš prográmek neumí nic víc, než kreslit čáru, ale v dalším díle se už konečně vrhneme na samotnou komunikaci přes TCP/IP protokol.
První verzi kreslící tabule z tohoto dílu si můžete stáhnout zde: