Tworzenie nowego pióra w WinApi - poprawność zapisu

0

Hey, chciałem dla pewności zapytać się czy poniższy fragment kodu jest poprawny pod względem zarządzania zasobami etc? Chodzi o to, że gdy tworzymy nowe pióro w WinApi to poprzednie trzeba usunąć.

DeleteObject(SelectObject(hdc, CreatePen(style, width, color)));

Jest to trochę zmodyfikowana wersja, którą znalazłem w kursie od 0 do gier kodera z tym, że tutaj od razu wrzuciłem CreatePen do SelectObject.
Czy możecie mi potwierdzić, że taki zapis nie spowoduje żadnych komplikacji w przyszłości? Pytam, bo mam dziwne wątpliwości co do tego...
Z góry dzięki za odpowiedź.

0

@olesio po pierwsze co Ci nie pasuje? W którym miejscu popełniłem błąd?
Po drugie jak pouczasz innych w zakresie pisowni to sam nie popełniaj błędów!

w czegokolwiek

Po trzecie takie komentarze zostawiaj dla siebie - nikomu nie pomagają a irytują

0

Piszę z dotykowej klawiatury. A jeśli Ciebie irytuje zwrócenie uwagi na ortografię, to nie pisz na fora. Lub pisz w prawidłowy sposób. Bo gdy się widzi "piura", to się nóz w kieszeni otwiera. Wygoogluj sobie i poczytaj stronę bykom stop. Moderuje tutaj, więc zwracam też uwagę, jeżeli ktoś aż tak wyraźnie kaleczy słowo pisane. I to w tytule wątku. Dział Newbie nie oznacza, że można mieć za nic poprawną pisownie tak oczywistych wyrazów.

0

Ten kod nie spowoduje wycieku zasobów (oczywiście jeżeli wywołanie wszystkich funkcji się powiedzie) ale poprawny jest tylko gdy rzeczywiście CHCESZ usunąć poprzednie pióro. Nie jest prawdą i nie wiem gdzie wyczytałeś że poprzednie od razu TRZEBA usunąć. Jeżeli w programie masz zamiar naprzemiennie używać kilku piór możesz usunąć je później tylko oczywiście musisz w zmiennych przechowywać uchwyty do nich. Wprawdzie Windows ma ograniczoną ilość zasobów ale bez przesady jeżeli nie tworzysz ich w dużych ilościach na raz to nic się nie dzieje.
Jeżeli chcesz sprawdzić program pod kątem wycieków zasobów GDI możesz skorzystać z programu GDIView http://www.nirsoft.net/utils/gdi_handles.html

1

Z dokumentacji SelectObject:

An application should always replace a new object with the original, default object after it has finished drawing with the new object.

Czyli nie powinieneś usuwać domyślnego obiektu GDI, tylko z powrotem go przypisać do kontekstu. Średnio wygodne, ale tak mówi biblia...

0

zamiast tworzyć pióro/pędzel można użyć funkcji SetDCPenColor/SetDCBrushColor i malować przy użyciu GetStockObject(DC_PEN)/GetStockObject(DC_BRUSH).

Nie trzeba tych obiektów zwalniać.
Ale trzeba pamiętać, żeby ustawiać kolor tuż przed rysowaniem, bo nie jest to ustawienie trwałe (inne komponenty też mogą w tym mieszać).

0

Dzięki wszystkim za odpowiedzi.
@Azarien mam jeszcze pytanko: czy jest możliwość przy takich ustawieniach zmienić styl rysowanej linii np. na DOT oraz grubość linii?
Bo jeśli dobrze rozumiem to należy takie pióro utworzyć następująco:

DeleteObject(SelectObject(hdc, GetStockObject(DC_PEN)));

a zmieniać kolor tak:

SetDCPenColor (hdc, RGB(0, 255, 0));

Ale jak w takim razie zmienić grubość i rodzaj pisanej linii?
Z góry dzięki za pomoc!

0

możesz spróbować tak jak dla każdego innego pena - nie próbowałem, ale wywal to DeleteObject...
wyżej masz wyjaśnione: oryginalny pen/brush trzeba zapamiętać i przywrócić po skończeniu malowania, a nie usuwać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1