UWAGA! Promocja dla firm - MICROSOFT OFFICE 365  na 12 miesiecy ZA DARMO! Tylko na CentrumXP.pl!
Wielka promocja Office 365 na CentrumXP.pl!
Do góry Skomentuj

Mini Paint w C#

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.

Zobacz również

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

Dodaj swój komentarz

Zasady publikacji komentarzyZasady publikacji komentarzy

Redakcja CentrumXP.pl nie odpowiada za treść komentarzy publikowanych na stronach Portalu
i zastrzega sobie prawo do usuwania wypowiedzi, które:

  • zawierają słowa wulgarne, obraźliwe, prowokujące i inne naruszające dobre obyczaje;
  • są jedynie próbami reklamowania stron internetowych (spamowanie poprzez umieszczanie linków);
  • przyczyniają się do złamania prawa bądź warunków licencyjnych oprogramowania (cracki, seriale, torrenty itp.);
  • zawierają dane osobowe, teleadresowe, adresy mailowe lub numery GG;
  • merytorycznie nie wnoszą nic do dyskusji lub nie mają związku z tematem komentowanego newsa, artykułu bądź pliku.

Autor:

Komentarz:

Dodaj komentarz