Windows Api - zmienne statyczne

0

Fragment procedury okna:

 
case WM_LBUTTONDOWN:
		
			
		maluj(hwnd,licznik);

		licznik++;


		break;

licznik jest zdefiniowany i zainicjowany globalnie, zaraz po include'ach ( dodam , że gdy zrobimy to wewnątrz procedury, wyskakuje błąd:

1>c:\users\tomek\documents\visual studio 2010\projects\win32c++roughdraft\win32c++roughdraft\winmain.cpp(91): error C2360: initialization of 'licznik' is skipped by 'case' label
)

static UINT licznik=0;

definicja funkcji maluj

void maluj(HWND uchwytOkna, UINT kolor)
{
	PAINTSTRUCT ps;
            HDC hdc = BeginPaint(uchwytOkna, &ps);

            FillRect(hdc, &ps.rcPaint, (HBRUSH) kolor);
            EndPaint(uchwytOkna, &ps);
			
}

Dlaczego okno zawsze jest białe, bez względu na wartość licznika, i jak już pisałem czemu nie można definiować zmiennych statycznych wewnątrz procedury?

1

A jak chcesz kupić mapę lasu, do którego nie wiesz czy cię wywiozą? Tak samo jest z if'ami i case'ami, (prócz else i default jak dasz), kompilator nie wie czy akurat w tym wypadku wykona się twoja definicja. Definiować można tylko w tym miejscu gdzie kod zawsze się wykona, czyli globalnie lub na początku funkcji, a nie w switch'u. Sprawdź debuggerem ile wynosi licznik, jak zmienia się, a okno jest cały czas białe, coś musi być z parametrami funkcji tzn. coś źle podajesz lub (nie)wykonujesz jakieś operacji.

0

Sprawdzałem debugerem- za każdym razem licznik zwiększa się o jeden, czyli np po 5 kliknięciach lewym klawiszem wynosi 5.
O dziwo gdy zainicjuję licznik do 2 , to wtedy okno jest cały czas czarne. Wygląda na to, że funkcja maluj działa tylko jednorazowo. Dlaczego?

1

Skoro 0 to biały, a 1 to już czarny, może trzeba we float'cie podać a nie w całkowitym int'cie. Z tego co znalazłem w necie HBRUSH tworzy się tak:

HBRUSH blueBrush=CreateSolidBrush(RGB(0,255,0));

A nie poprzez rzutowanie. To zapewne dlatego tak się dzieje. Normalnie utwórz tak brush'a i powinno chulać.

0

No niby jakiś krok do przodu, ale dalej funkcja jest jednorazowa, tzn malowanie jest tylko przy pierwszym kliknięciu.

1

Malować powinieneś w odpowiedzi na komunikat WM_PAINT. Wymuszenie odmalowania (wymuszenie komunikatu WM_PAINT) robi się funkcją InvalidateRect (powinieneś ją wywołać w reakcji na przycisk). Generalnie zapoznaj się z tym prostym i rzeczowym tutkiem:
Using the WM_PAINT Message (MSDN)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.