Symulacja gry LIFE. Wyswietlanie pod Visual C++

Witam.

Chodzi mi o to, że pobieram dane od uzytkownika (rozmiary tablicy: wysokość i szerokość). Po tym chcialbym użyć tych danych i wyswietlić pustą tablicę. Do tego chciałbym użyć RadioButton’ów i za ich pomocą pobrać kolejne dane, które reprezentowałyby życia. Dwa problemy:

  1. Jak za pomocą pobranej wysokości i szerokości wyswietlić odpowiednio wielką tablicę z radiobutton’ów;

  2. Jak po wyświetleniu tablicy sczytać kolejne pola tablicy.

Jak ktoś ma inne ciekawe prośby co do sposobu wyświetlenia tej tablicy to proszę o sugestie…

Tylko co ma radio button do pobierania danych?

Ad. 1.: Pętla…

Ad. 2.: jw.

Też nie rozumiem dlaczego radio button. :slight_smile: Funkcja CreateWindow() zawołana n * m razy z odpowiednią nazwą klasy okna (kontrolki mają je predefiniowane) powinna rozwiązać sprawę.

Hmmm… Przyszło mi coś do głowy, jako dobre ćwiczenie z WinAPI. :slight_smile:

Rozwiązanie bardziej eleganckie: zamiast radio buttonów używamy kontrolki “Picture Control” typu Owner Draw sprzężonej z tablicą (jeśli robimy to w oknie dialogowym). W zwykłym oknie można rysować bezpośrednio w obszarze roboczym.

Sugestie:

a) komunikat WM_PAINT; rysowanie “pixeli” w postaci czarnych i białe prostokątów na podstawie tablicy;

b) komunikaty WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE: obsługa rysowania;

c) kwestia obliczenia współrzędnych w tablicy na podstawie współrzędnych “klikniętych” w kontrolce i odwrotnie, wyliczenie na podstawie indeksów (indeksu) w tablicy współrzędnych lewego górnego rogu “pixela”;

Inne przydatne funkcje:

HWND SetCapture(HWND hWnd);

BOOL ReleaseCapture(void);

BOOL GetClientRect(HWND hWnd, LPRECT lpRect);

BOOL GetWindowRect(HWND hWnd, LPRECT lpRect);

BOOL ScreenToClient(HWND hWnd, LPPOINT lpPoint);

Własny radio button? Toż to za proste. Już lepiej własny edit box, trochę trudniej. Radio Buttona można w 20, może 30 linijkach zrobić, a edit boxa(podobnego do tego z WinAPI i pochodnych) już nie tak łatwo.

Miałem na mysli własne okienko do edycji dużych pikseli (to nie jest takie trudne na jakie wygląda i o wiele bardziej efektowne niż zbiór kontrolek). Idąc zaś tropem buttonów i editów, to chyba najlepszy jest taki button, co pozostaje wciśnięty. Klasa okna “BUTTON” styl… hmmm… BS_AUTOCHECKBOX | BS_PUSHLIKE

hButtonN = ::CreateWindow(_T("BUTTON"), _T(""), WS_VISIBLE | WS_CHILD | BS_AUTOCHECKBOX | BS_PUSHLIKE, x, y, 10, 10, hWnd, (HMENU)ID_BUTTON_N, hInstance, NULL);

I tak w pętli. :slight_smile: Za każdym razem przypisywać inne ID przyciskowi (ID_BUTTON_N) najlepiej kolejne liczby zaczynając od jakiś 10000 :D. A potem sprawdzamy czy to co zwróci:

::SendMessage(hWnd, BM_GETCHECK, 0, 0);

jest BST_CHECKED czy BST_UNCHECKED. Analogiczny komunikat do zmiany stanu przycisku:

::SendMessage(hWnd, BM_SETCHECK, stan, 0);

W dniu 12.05.2008 , o godzinie 16:44 został dopisany post przez schabik

Sorry, ale się rozpędziłem. Nadawanie ID można olać, bo nie chcemy obsługiwać komunikatów. Tylko odczytywać/ustawiać stany.