Tak siedzę przed monitorem i zastanawiam się jak tu zacząć
I chyba zacznę prosto z mostu
Wielu z Was robi różne projekty na AVR-ach ale czasem brakuje możliwości prezentacji działania takiego układu na
PC z prozaicznego powodu, brakuje odpowiednich kontrolek.
Otóż sprawa wcale nie jest z góry przegrana, bo takie cuda robi się prościej niż wam się wydaje
co udowodnię Wam
Kontrolki można "stworzyć" w C# na wiele różnych sposobów np. używając GDI+ czy też WPF.
Ja na razie wybiorę GDI+ chociażby z chęci przypomnienia sobie tego cuda (w końcu zaczyna się niedługo semestr i lepiej przypomnieć sobie co nie co
)
No to do dzieła
Odpalamy VS --> Nowy project --> Windows Forms Control Library i nazywamy ją np:kontrolki_avr
Po tej operacji ukaże nam się takie okienko
Zaglądamy do Solution Explorer i zmieniamy nazwę naszej kontrolki z "UserControl1" na "Wskaznik"
Gdy wyskoczy nam komunikat jak na obrazku bez wahania się zgadzamy (będzie mniej roboty
)
Po tej operacji odnajdujemy class Wskaznik i klikamy na niej dwa razy
I już nareszcie zabieramy się do właściwego projektowania i zaprogramowania naszej kontrolki która będzie wyglądała tak :
No to do dzieła.
Zaglądamy jeszcze do Wskaznik.cs(design) i we właściwościach ustawiamy wielkość naszej kontrolki na Width=300 Height = 150 ,
następnie odnajdujemy BorderStyle i suatwiamy na FixedSingle.
Po tych czynnościach wracamy z powrotem do Wskaznik.cs
Na początek musimy podłączyć sobie referencję do rysowania 2D co czynimy na początku pliku w następujący sposób
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Po dodaniu referencji warto by się zastanowić jakie własności czy też właściwości będą nam potrzebne
( przed tym etapem gorąco polecam przeprosić się z kartką a także ołówkiem i rozrysować sobie przyszłą kontrolkę co ułatwi późniejsze pisanie kodu )
ja wybrałem takie jak:
- Wartość aktualna
- Wartość Maksymalna
- Wartość Minimalna
- różne grubości linii oraz kolory które będą potrzebne do rysowania
- oraz fonty do cyferek
i teraz plik wskazniki.cs u mnie wygląda tak:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Jak widać zmienne z wartościami domyślnymi są prywatne bo przecież nie chcemy aby ktoś niepowołany miał do nich dostęp, zresztą i tak dobudujemy do nich "logikę"
która umożliwi nam zmianę tych wartości nie jako z zewnątrz.
A skoro już o tym mowa, w/w logika wygląda tak:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Tutaj zatrzymamy się na chwilkę aby wyjaśnić co robią poszczególne linie:
Pierwsza linia mówi nam że ta właściwość ma być widoczna we właściwościach kontrolki (Properties),
gdy w tej linii zmienimy wartość true na false nie będzie ona dostępna. Czasami zachodzi potrzeba debugowania jakieś zmiennej która ogólnie
później ma być nie dostępna ...
Druga linia wskazuje jak się nazywa grupa właściwości w której ma być zlokalizowana nasza wartość, można wpisać tutaj dowolną nazwę lub nazwę znajdującą się już we właściwościach
Trzecia linia to nic innego jak opis tego co ta opcja zmienia.
Dalej to już standardowe wykorzystanie akcesorów, gdzie:
get - pobiera wartość ze zmiennej i wystawia ją na zewnątrz
set - ustawia wartość zmiennej. Dodatkowo w set można ustawić dodatkowe warunki sprawdzenia wartości przed wpisaniem jej na swoje miejsce, co zresztą
uczyniłem poprzez warunek if. Skoro już jesteśmy przy nim dlatego został w ten sposób napisany aby zapobiec ciągłemu "przerysowywaniu" naszej kontrolki przy zmianie wartości a raczej braku jej zmiany.
Dla chcących troszkę poklepać zamieszczam logikę
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dla ciekwaskich którzy mają chęć zobaczyć efekty pracy zachęcam do użycia klawisza F5, gdzie po wciśnięciu go powinno ukazać nam się takie okienko
Jak widzicie na razie efekty naszego pisania pojawiły się w prawym okienku właściowści naszej kontrolki w postaci parametrów.
Dzięki tym wszystkim operacjom mamy juz przygotowane pole do utworzenia właściwego wyglądu, który zaczniem od utworzenia funkcji nadpisującej rysowanie kontrolki,
a wygląda ona tak:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
I zaczynamy pisanie zaraz pod base.OnPaint(e);
Na początek powołamy do życia kilka lokalnych zmiennych pomocniczych które ułatwia nam obliczenia oraz pisanie kodu.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Zmienne które przechowują wartości kątów dla elpisy która jest na zewnątrz skali oraz zmienne niezbędne do jej utworzenia
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Struktura text umożliwi nam później sprawdzenie wielkości szerokości i wysokości tekstu która umożliwi nam prawidłowe pozycjonowanie go
oraz struktura przechowująca punkt centralny dla elipsy.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Ogranicznie blokujące proporcje kontrolgi żeby nam się nie rozjeżdżała.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Powołyjemy do życia "ołówek" którym będziemy rysować po kontrolce oraz strukturę która umożliwia wypełnienie kształtów kolorem
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Będzie także potrzebna nam struktura która umożliwia rysowanie dowolnego kształtu
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No to czas na naszą pierwszą łuk, a raczej jego fragment
Pierwszy parametr to nasz ołówek który został zdefiniowany chwilkę wcześniej podczas deklaracji
Następnie dwa zera które odpowiadają połóżeniu prostokąta w który będzie wrysowany łuk,
kolejne dwie wartości odpowiadają za rozmiar tego prostokątka, następnie podajemy kąt od którego ma być rozpoczętę rysowanie i
ostatnia wartość to jak rozwarty ma być nasz łuk.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dla ciekawskich F5
Przed przystąpieniem do dalszego rysowania stworzymy sobie jeszcze przywatną metodą do przeliczenia stopni na radiany
którą możecie umieścić na końcu klasy Wskaznik a wygląda ona tak:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Skoro już możemy przeliczać na radiany to przystępujemy do narysowania skali, w tym celu wykorzystamy pętlę while która zakończy się w momencie osiągnięcia zadanego kąta
Same obliczenia są na tyle proste że nie ma sensu ich wyjaśniać, może tylko napiszę że został wykorzystany wzór na znalezienie dowolnego punktu
na elipsie (zmienne x..,y.. itd.)
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dla ciekawskich F5 (jak komuś przeszkadza wielkość czcionki na skali to sobie może zmieć w prawym okienku
)
A dla leniwych cała dotychczasowa zawartość kodu
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Skoro mamy już tak dużo to teraz wypadało by skonstruować jakąś wskazówkię która by pokazywała nam bierzącą wartość
I znowu nic ciekawego, kolejne obliczenia po elipsie, przypisanie do "ołówka" koloru oraz grubości kreski oraz samo wyrysowanie wskazówki za pośrednictwem linii.
Może warto nadmienić że linie rysuje się troszkę innaczej niż pozostałe figury, po prostu podaje się początek oraz koniec linii w postaci współrzędnych.
Należy tylko pamiętać że tutaj jest troszkę innaczej niż przy współżędnych kartezjańskich dlatego że punkt (0,0) jest w górnym lewym rogu .....
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
No cóż po woli zbliżamy się już do końca, dlatego wypadało by położyć przysłowiowa wisienkę na trocie
W postaci pół elipsy po środku na kórej będą prezentowane aktualne wartości.
Tym razem wykorzystamy do tego klasę GraphicsPath a to dlatego że chciałem uzyskać dodatkowe obramowanie elipsy a już nie chciało mi sie klepać kodu
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dla ciekawskich F5
Tak się przyglądamy tej naszej kontrolce ... i co ? Wygląda jakoś kanciasto
, więc czym prędzej biegniemy w naszej metodzie na początek
i zaraz za
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
klepiemy tą linijke kodu która włączy nam AntiAliasing żeby nasza kontrolka wyglądała po ludzku.
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Dodatkowo warto też włąćzyć podwójne buforowanie żeby kontrolka nie mrygała nam podczas szybkich zmian wartości,
robi się to w public Wskaznik() który powinien wyglądać tak:
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
I jak zwykle dla leniwych cały kod
język csharp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
A teraz nie pozostaje już nam nic innego jak utworzyć nowy projekt
, zajrzeć do menu TOOLS --> Chooice toolbox items
zakładka .Net FrameWork Components
następnie Browse i wskazać naszą dll-ke która znajduje się w katalogu bin\debug naszego projektu
P.S tak jak obiecałem dołączam bibliotekę i projekt