Piszę grę planszową opartą na szachownicy w czystym WinAPI i GDI. Założenia:

  1. Ilość pionków jest zmienna i zależy od ustawień
  2. Tło pól szachownicy może zmieniać się w czasie gry (podpowiedzi)
  3. Rysujemy w GDI, nie korzystamy z gotowych bitmap

Kod generujący szachownicę w zdarzeniu WM_PAINT może wyglądać tak:

for(int i=0; i<10; i++)
{
    for(int j=0; j<10; j++)
    {
        Rectangle(hdc, i*20, j*20, i*20+20, j*20+20);
    }
}

System wydaje komendę WM_PAINT, jeżeli choć część trzeba odrysować, czyli po zmianie rozmiaru, przywróceniu, maksymalizacji, wyświetleniu go na pierwszy plan. Rysowanie wszystkiego od nowa (całej planszy i interfejsu) nie ma sensu. Pierwsze pytanie - czy da się na stałe przykleić zawartość do okna, aby komenda WM_PAINT nie wymazywała wszystkiego i nie trzeba było rysować ponownie?

Wykonujemy ruch. Przesuwamy pionek z pozycji (1,1) na (2,2). Najprościej wywołać UpdateWindow, żeby wywołać WM_PAINT, a tam narysować planszę i pionki zgodnie ze stanem gry. Tylko po co?

GDI ma struktury zwane Rectangles oraz Regions. Jakie są główne różnice między nimi? Chodzi o zastosowania w praktyce. Funkcje i ich opisy znajdę na MSDN. Oba mechanizmy mają podobne możliwości.

Na MSDN jest przykład, gdzie funkcja RectVisible() sprawdza, czy prostokąt znajduje się w obszarze przycięcia (do odrysowania) (clipping region). Jest lepsze wyjście?

Tak, mają funkcje do przesuwania i wypełniania regionów/prostokątów. Czy to sprawi, że pionek cudowie zmieni pozycję na planszy, a kolory pól się zmienią? Raczej nie. Znów WM_PAINT całego okna bądź wybranego obszaru? To strata czasu procesora. Jakie operacje są niezbędne do tak prostych czynności: przesunięcie pionka, zmiana koloru pola, animacje?

Ostatnia rzecz - wykrywanie zdarzeń. Aktualnie znam 2 sposoby:

  1. Obliczyć matematycznie, które pole zostało kliknięte na podstawie (X,Y) kursora
  2. Użyć PtInRect() i przejechać pętelką po polach

Jakie rady dalibyście osobom, które zaczynają przygodę z WinAPI i GDI?