Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Winapi] Kilka problemów z rysowaniem

Ostatnio zmodyfikowano 2012-07-22 20:18
Autor Wiadomość
ziombel3
Temat założony przez niniejszego użytkownika
[Winapi] Kilka problemów z rysowaniem
» 2012-07-21 14:38:24
Witam. Mam kilka problemów z rysowaniem w swojej aplikacji:
1.

Tworzę grę tekstową i w tej grze po naciśnięciu pewnych przycisków zmienia się wygląd i treść okna głównego. Po wciśnięciu każdego przycisku pojawiają się inne tabele(zrobione z prostokątów). Nie wiem jak zrobić tak, żeby pewne rysunki wyświetlały się dopiero po naciśnięciu przycisku. Kiedy wsadzam poniższy kod do reakcji na przycisk w WM_COMMAND to nic się nie dzieje(w WM_PAINT kod działa bez zarzutu). Jak napisać instrukcje, aby program rysował po wciśnięciu przycisku.
C/C++
hdc = BeginPaint( hWnd, & ps );

HPEN hPenOld2;

HPEN hLinePen2;
COLORREF qLineColor;
qLineColor = RGB( 0, 0, 0 );
hLinePen2 = CreatePen( PS_SOLID, 2, qLineColor );
hPenOld2 =( HPEN ) SelectObject( hdc, hLinePen2 );

Rectangle( hdc, 400, 1, 200, 160 );

SelectObject( hdc, hPenOld2 );
DeleteObject( hLinePen2 );

EndPaint( hWnd, & ps );
Próbowałem:
Umieszczać cały kod w reakcji na przycisk, umieszczać samo rectangle w reakcji na przycisk, umieszczać WM_PAINT w WM_COMMAND. Wszystko dało się skompilować ale nie dawało efektu.


2. Drugim problemem jest to, że jak rozwiąże problem 1, to po naciśnięciu innego przycisku będę musiał wyczyścić tabele powstałe po naciśnięciu poprzedniego przycisku. Wymyśliłem aby rysować wypełniony biały kwadrat na samym początku malowania w każdym przypadku. Jak to będzie działać na zasoby systemowe? Czy tabele zostaną usunięte czy tylko przykryte? Czy jest jakiś lepszy i wydajniejszy sposób(także wygodny bo ten sposób zajmuje kilka linijek kodu)

3. Trzecim problemem jest rysowanie w oknach modalnych. Jak to zrobić?
P-60761
DejaVu
» 2012-07-22 00:04:17
Jeżeli robisz grę to:
1. zawsze czyścisz ekran
2. rysujesz na scenie to co ma być wyświetlone w danej klatce

Innej filozofii się w grach nie stosuje (bo i tak współczesne karty graficzne mają tak potężną moc obliczeniową, że wyczyszczenie ekranu im po prostu nie zrobi żadnej różnicy).
P-60815
ziombel3
Temat założony przez niniejszego użytkownika
» 2012-07-22 11:12:29
Tylko jak rozwiązać problem 1 i 3.
P-60830
xevuel
» 2012-07-22 11:18:32
1. Flagi, i tak będziesz musiał WM_PAINT wykorzystać
3. Wszystkie okna dialogowe mają swoje własne HWND, więc w czym problem?
P-60831
ziombel3
Temat założony przez niniejszego użytkownika
» 2012-07-22 20:15:34
Problem rozwiązany. Znalazłem poradnik o flagach(angielski) i niewiele z niego zrozumiałem. Poczytałem jednak trochę o updatewindow i znalazłem to:

InvalidateRect (hWnd, NULL, TRUE);
UpdateWindow (hWnd);
Stworzyłem zmienną globalną rysuj typu int. Wartość tego przycisku jest zmieniana po naciśnięciu przycisku. Znajduje się tam tez powyższy kod. W WM_PAINT umieściłem switcha który sprawdza wartość zmiennej rysuj i w zależności od niej wykonuje różne operacje. Nie trzeba wcale czyścić okna bo updatewindow robi to za nas. Nie należy jednak umieszczać tego kodu w WM_PAINT bo wtedy okno będzie odświeżane cały czas. Można by umieścić to w kursie bo to bardzo prosta w użyciu i przydatna funkcja.
P-60879
xevuel
» 2012-07-22 20:18:13
Pisząc flagi mówiłem właśnie o tym, co Ty zastosowałeś. A od WM_PAINT nie uciekniesz, bo rysując za pomocą standardowych funkcji WinAPI po zminimalizowaniu okna wszystko Ci się zniszczy. Jeśli problem rozwiązany, zamknij za sobą temat :)
P-60880
« 1 »
  Strona 1 z 1