Mini Paint w C#
Autor:
Marcin Hałaczkiewicz
Opublikowano:
1 czerwca 2006
Odsłon:
93 950
Tym razem napiszemy prostą aplikację w stylu MS Paint. Zapoznamy się z
podstawowymi metodami rysowania w .NET. Program będzie umożliwiał proste
malowanie, zmianę koloru pędzla a także zapisanie efektu do pliku bmp. Nauczymy
się korzystać z wbudowanych w .NET okienek dialogowych do wybierania koloru oraz
zapisu.
Jak zwykle zaczniemy od stworzenia nowego projektu. Nadajemy mu nazwę Mini
Paint, zmieniamy nazwę pliku z formą na MiniPaint.cs i nadajemy jej
nazwę frmMiniPaint. Następnie zmieniamy jej właściwości: AutoSizeMode
na GrowAndShrink, MaximizeBox na false - dzięki temu nie
będziemy mogli zmaksymalizować ani zmienić wielkości formy. Rozmiar (Size)
proponuje ustawić na 514x478. Do formy dodajemy Panel. Lokujemy go w
pozycji 20x20 i ustawiamy Size na 400x400, po czym zmieniamy BackColor
na White, jeszcze tylko musimy ustawić właściwość BorderStyle na FixedSingle -
aby
nasze 'płótno' było obramowane. Następnie dodajemy PictureBox do panelu (wystarczy kliknąć
z wybranym pictureboxem na panel). Jego położenie to 0x0, rozmiar: 400x400,
nazwa: imgObrazek.
Następnie dorzucamy 3 przyciski (button) i
nazywamy je kolejno: cmdZapisz, cmdCzysc i cmdKolor. Później
tworzymy etykietę i nadajemy jej nazwę lblKolor, czyścimy pole Text, ustawiamy BackColor na Black,
AutoSize na false oraz Size na 23x23. Kontrolka ta posłuży
nam do wyświetlania aktualnego koloru. Po wszystkich operacjach okno programu powinno
wyglądać mniej więcej tak:

Zajmijmy się oprogramowywaniem funkcji aplikacji. Chcielibyśmy, aby z
wciśniętym lewym przyciskiem myszy można było rysować. Zacznijmy od dodania do
formy kilku zmiennych (widok kodu formy). Dopiszmy:
private Graphics g;
private Point p = Point.Empty;
private Pen pioro;
Pierwsze pole posłuży do reprezentowania grafiki i rysowania jej. Drugie to
zmienna pomocnicza służąca do kreślenia linii pomiędzy punktem, w którym była
ostatnio myszka (to jest właśnie p) a punktem, w którym znajduje się
aktualnie. Zmienna pioro będzie reprezentować pióro o kolorze, w którym malujemy. Zmienne te inicjujemy w konstruktorze formy frmMiniPaint(). Oto jego kod:
public frmMiniPaint();
{
InitializeComponent();
imgObrazek.Image = new Bitmap(400, 400);
g = Graphics.FromImage(imgObrazek.Image);
pioro = new Pen(Color.Black);
}
Po zadeklarowaniu ww. wartości tworzymy obsługę zdarzenia MouseDown dla
kontrolki imgObrazek. W jego
wnętrzu wpisujemy:
if (e.Button == MouseButtons.Left)
p = e.Location;
Zapamiętujemy w ten sposób położenie kursora w momencie naciśnięcia lewego
przycisku myszki. Teraz dodajmy zdarzenie MouseMove również dla
imgObrazek. W środku wpisujemy kod:
if (e.Button == MouseButtons.Left)
{
g.DrawLine(pioro, p, e.Location);
p = e.Location;
imgObrazek.Refresh();
}
W tym miejscu rysujemy linię pomiędzy punktem zapamiętanym w p a
aktualnym położeniem kursora. Następnie w p zapamiętujemy nowy punkt (tam
gdzie jest kursor) oraz odświeżamy obraz. W tym momencie program już spełnia
swoją najważniejszą funkcję - maluje. Zajmijmy się teraz oprogramowaniem
przycisków. Zacznijmy od cmdCzysc. Klikamy na nim dwa razy (w edytorze
graficznym) i w środku funkcji umieszczamy kod:
g.Clear(Color.White);
imgObrazek.Refresh();
Linie te czyszczą pole do rysowania oraz odświeżają obraz. Utwórzmy teraz zdarzenie Click
dla cmdKolor. Wewnątrz wpisujemy:
ColorDialog dialog = new
ColorDialog();
dialog.Color = lblKolor.BackColor;
dialog.ShowDialog();
lblKolor.BackColor = dialog.Color;
pioro.Color =
dialog.Color;
Korzystamy tutaj z jednego z wbudowanych w .NET okien dialogowych - do wyboru
koloru. Aby je wywołać wystarczy wywołać metodę ShowDialog. Wybrany kolor
będzie znajdował się w zmiennej Color - przypisujemy go do tła etykiety
lblKolor oraz do koloru używanego przez nas pióra pioro. Pozostał
nam jedynie zapis do pliku. Dodajemy zdarzenie Click dla cmdZapisz
i wewnątrz wpisujemy:
SaveFileDialog dialog = new
SaveFileDialog();
dialog.Filter = "bmp|*.bmp";
dialog.ShowDialog();
if (dialog.FileName != "")
imgObrazek.Image.Save(dialog.FileName);
Okno dialogowe do wybrania pliku do zapisu zachowuje się podobnie do kontrolki
ColorDialog. Uaktywniamy je metodą ShowDialog, a następnie
odczytujemy wybrany plik z pola FileName. Mamy do dyspozycji również
filtr, dzięki któremu możemy wybierać jedynie dane konkretnego typu. Gdy
jakiś plik zostanie wskazany, zapisujemy do niego nasz obrazek. Po więcej
szczegółów dotyczących sposobu korzystania z tego okna dialogowego odsyłam do
dokumentacji
MSDN.
I tak oto ukończyliśmy kolejny program. Wydawałoby się, że nie tak łatwo jest
stworzyć aplikację do rysowania, a jednak okazało się to niezwykle proste.
Wszystko dzięki ogromowi bibliotek wbudowanych w .NET. Dzięki nim, gdy chcemy
wybrać plik do zapisu czy kolor nie musimy tworzyć własnych klas, co zajęłoby
dużo czasu. Po prostu korzystamy z gotowych rozwiązań, które wizualnie są
świetnie znane wszystkim użytkownikom Windows.
Stworzony tutaj program wraz z plikami źródłowymi możemy pobrać stąd.
Komentarze
Co to znaczy, że do formy dodajemy Panel ?
Mirek,
1 czerwca 2006, 03:32
W Toolboxie znalazłem Panel, więc pewnie to o to chodzi ...
Mirek,
1 czerwca 2006, 03:35
Zapomniałeś opisać zawartości głównej funkcji projektu frmMiniPaint(), przez co program nie ma prawa działać i nie działa (obiekty g i pioro nie zostają zainicjalizowane). Fragment ten jest w kodzie, który udostępniłes, ale nie ma go w tutorialu. Jeżeli chodzi o opis bez tego małego zgrzytu, to bardzo przystępnie przedstawiony :) Oby tak dalej!
m010ch,
6 czerwca 2006, 00:29
Już poprawione. Dziękuję za info. Ciesze się, że się podoba :) Wszelkie uwagi mile widziane.
Marcin Hałaczkiewicz,
6 czerwca 2006, 01:10
sorry ale niewiem gdzie jest "AutoSizeMode" ten przycisk mugłbyś załączyc obrazki do karzdej operacjitak jak to jest przectawione w kurs c# pozdro ;">
adrian,
23 sierpnia 2006, 17:59
Adrian: to nie jest przycisk tylko wlasciwosc glownej formy. Uaktywnij ja (kliknij na nia) i w Properties bedziesz mial cala liste wlasciwosci a tam miedzy innymi ta ktorej nie mozesz znalezc.
Adam,
28 sierpnia 2006, 21:48
Tutorialek super :) Mam pytanie: jak zrobić takiego Mini Painta, żeby rysował linie proste (tak jak w Paincie w Windowsie)?
Anna,
23 maja 2007, 20:33
Jak dodać gumke do tego projektu??
Znak,
31 maja 2007, 17:11
Ściągłam Twój program i odrazu wyrzuciło mi takie komunikaty w Visual studio 2005.
Dlaczego u mnie nie chodzi :(
Error 1 "System.Windows.Forms.Panel" does not contain a definition for "Image" C:\Documents and Settings\rympel!\Moje dokumenty\Visual Studio 2005\Projects\MiniPaint.cs\MiniPaint.cs\Form1.cs 29 28 MiniPaint.cs
Error 2 The name "g" does not exist in the current context C:\Documents and Settings\rympel!\Moje dokumenty\Visual Studio 2005\Projects\MiniPaint.cs\MiniPaint.cs\Form1.cs 35 13 MiniPaint.cs
Error 3 The name "pioro" does not exist in the current context C:\Documents and Settings\rympel!\Moje dokumenty\Visual Studio 2005\Projects\MiniPaint.cs\MiniPaint.cs\Form1.cs 45 13 MiniPaint.cs
Daga,
24 czerwca 2007, 16:20
Odpowiedź na pytanie Anny: dodaj zdarzenie MouseUp dla imgObrazek i wpisz kod zdarzenia MouseMove. Wtedy linia będzie rysowana dopiero po zwolnieniu przycisku myszy. Trzeba tylko zadbać aby zdarzenia MouseMove i MouseUp wzajemnie się wykluczały, ale to już nie stanowi problemu.
kamas,
13 lipca 2007, 11:18
Nasłuchałem się tyle o tej wspaniałej .NET a tutaj taka kicha. Mam do napisania interface do gierki w której dzieci będą sobie badać coś tam z mużdżkiem. Ogarnołem sobie już co trzeba i powiem państwu że jeśli chcecie poważnie zabrać się za grafikę to tylko przesiadka na c++ i GTK(polecam) albo ew. Qt4.
Obie biblioteki oferują nieporównywalnie większe możliwości do .net z tym że ja rozumiem że ktoś może być postkomunistą i wolne oprogramowanie budzi u niego raczej niechęć.
Przepraszam że tak wylewam swoje boleści, ale wydałęm na podręcznik do c# i czuje się oszukany przez "machinę marketingową".
zniechecony,
29 sierpnia 2007, 21:51
@zniechecony: no ale chyba nie próbowałeś Windows Graphics Foundation tam można nawet obracać buttony :P
Rokamak,
21 września 2007, 22:36
witam ma pytanie jak dodac funkcje pisania do projektu ?? bylbym wdzieczny za wszelka pomoc pozdrawiam
xmass,
17 grudnia 2007, 23:49
jak dodac rysowanie figur?
arwo,
4 lutego 2008, 20:40
jak nie dodawac rysowanie figur?
arwo,
3 maja 2008, 14:32
Dziękuję bardzo bardzo bardzo :*
Kiki,
21 maja 2008, 23:16
nie wiem dlaczego ale wyskakuje mi blad ze
"System.Windows.Forms.PaintEventArgs" does not contain a definition for "Location"
i to sqamo dla button
ja,
8 czerwca 2008, 15:55
@ja - Mi też to samo wyskakuje...
Co robić?
Defozo,
2 lipca 2008, 20:10
Zamiast p = e.Location;
należy napisać p.X = e.X; p.Y = e.Y;
podobnie zamiast g.DrawLine(pioro, p, e.Location);
należy napisać g.DrawLine(pioro, p.X, p.Y, e.X, e.Y);
Ale generalnie baaaardzo mi ten przykłąd pomógł.
-=_=-,
9 stycznia 2009, 12:20
Jak utworzyć funkcję wczytywania pliku do naszego mini painta... Skoro zapisujemy chcili byśmy czasem sobie to zedytować nieprawdaż??
GieeLACeHa,
23 stycznia 2009, 12:39
Jak zrobić tą etykiete
sds,
13 lutego 2009, 20:37
Jak narysować linię prostą i prostokąt zeby wyglądalo to tak jak w normalnym windowsowym Paincie?
pawel,
27 lutego 2009, 08:49
@sds
poszukaj "label" w toolboxie. Przeciagnij i upusc na forme.
Norbert,
26 kwietnia 2009, 13:43
jak zrobic opcje wiaderko??
chodzi o to że jak sie narysuje figurę to żeby można było ją wypelnić...
zapytacz,
29 czerwca 2009, 18:05
a czemu program zapisuje tak że po otwarciu bmp-ka jest cały czarny obrazek, nie ma żadnych kolorów tylko CZERŃ!
?,
12 sierpnia 2009, 20:27
daj na poczatek to co jest w przyciku czysc to bedziesz miec biale tlo ;p a wie ktos jak te funkcje dac pod przycisk? zeby np po kliknieciu buttona rysowal jak pioro a po kliknieciu na inny przycik zeby rysowal linie...
jj,
27 sierpnia 2009, 14:18
Dziekuję za super przykład!!
mrx,
9 stycznia 2010, 18:08
Mam pytanie, jak zrobić aby pióro było grubsze?? Załózny kwadrat (2x2) bo chce zrobić gumkę ^
Bartekkknh,
7 lutego 2010, 14:50
Aby pioro bylo grubsze piszesz:
pioro.Width = ;
maciek32,
25 marca 2010, 15:19
Witam. załóżmy ze tworze sobie obiekt typu PictureBox w jakiejs metodzie. Jak dodać ten PictureBox do Panelu?
narf,
29 listopada 2010, 14:15