Błąd kompilacji w Dev C++

Witam uprzejmie!

Za pomocą Dev C++ wygenerowałem programik wyświetlający puste okno Windowsowe. Następnie, w oparciu o kurs http://cpp0x.pl/kursy/Kurs-WinAPI-C++/Podstawy/Podstawy-WinAPI/168 umieściłem deklarację globalnego uchwytu (przed funkcją WinMain )

HWND g_hPrzycisk;

a następnie - wewnątrz WinMain , zaraz po instrukcji tworzącej okienko główne - wstawiłem kod

g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Nasz przycisk", WS_CHILD | WS_VISIBLE,100, 100, 150, 30, hwnd, NULL, hInstance, NULL );

. Spowodowało to wyświetlenie w oknie żądanego przycisku. Następnie dodałem (tuż poniżej poprzedniego) kod:

case WM_COMMAND:

if(( HWND ) lParam == g_hPrzycisk )

MessageBox( hwnd, "Nacisnąłeś przycisk!", "Ha!", MB_ICONINFORMATION );

break;

który - według wspomnianego kursu - powinien spowodować reakcję na “naciśnięcie” przycisku. Niestety - przy próbie kompilacji wskazywany jest błąd w pierwszej linii powyższego kodu. Zaznaczam, że to moje pierwsze nieśmiałe kroki w próbie programowania i wykonuję je metodą prób i błędów - dlatego osoby chcące ewentualnie poświęcić mi nieco swojego cennego czasu proszę o możliwie “łopatologiczną” pomoc. Poniżej daję jeszcze większe fragmenty mojego “programu” żeby uwidocznić gdzie co dopisałem.

#include 


/* This is where all the input to the window goes to */

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {

	switch(Message) {


		/* trap the WM_CLOSE (clicking X) message, and actually tell the window to close */

		case WM_CLOSE: {

			DestroyWindow(hwnd);

			break;

		}


		/* Upon destruction, tell the main thread to stop */

		case WM_DESTROY: {

			PostQuitMessage(0);

			break;

		}


		/* All other messages (a lot of them) are processed using default procedures */

		default:

			return DefWindowProc(hwnd, Message, wParam, lParam);

	}

	return 0;

}



	HWND g_hPrzycisk;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {

	WNDCLASSEX wc; /* A properties struct of our window */

	HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */

	MSG Msg; /* A temporary location for all messages */


	/* zero out the struct and set the stuff we want to modify */

	memset(&wc,0,sizeof(wc));

	wc.cbSize = sizeof(WNDCLASSEX);

	wc.lpfnWndProc = WndProc; /* This is where we will send messages to */

	wc.hInstance = hInstance;

	wc.hCursor = LoadCursor(NULL, IDC_ARROW);


	/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */

	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);

	wc.lpszClassName = "WindowClass";

	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */

	wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);


	if(!RegisterClassEx(&wc)) {

		MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);

		return 0;

	}


	hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Jacek - ćwiczenie pierwsze",WS_VISIBLE|WS_OVERLAPPEDWINDOW,

		CW_USEDEFAULT, /* x */

		CW_USEDEFAULT, /* y */

		650, /* width */

		480, /* height */

		NULL,NULL,hInstance,NULL);


	g_hPrzycisk = CreateWindowEx( 0, "BUTTON", "Kontrolka pierwsza", WS_CHILD | WS_VISIBLE,

	5, 5, 150, 30, hwnd, NULL, hInstance, NULL );


	case WM_COMMAND:

if(( HWND ) lParam == g_hPrzycisk )

     MessageBox( hwnd, "Nacisnąłeś przycisk!", "Ha!", MB_ICONINFORMATION );


break;

Pierwsza sprawa to słowo kluczowe case jest częścią bloku switch i nie może występować samotnie. Dlatego masz błąd.

Po przejrzeniu tego poradnika na szybko wygląda na to że ten kolejny przypadek (case) powinieneś dopisać do metody obsługi zdarzeń czyli wpasować gdzieś tutaj:

// OBSŁUGA ZDARZEŃ

LRESULT CALLBACK WndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )

{

    switch( msg )

    {

    case WM_CLOSE:

        DestroyWindow( hwnd );

        break;


    case WM_DESTROY:

        PostQuitMessage( 0 );

        break;


        default:

        return DefWindowProc( hwnd, msg, wParam, lParam );

    }


    return 0;

}

“case” nie może występować poza instrukcją “switch”. Zastanów się co ty tam napisałeś (wkleiłeś).

Jeżeli nie chcesz się zastanawiać to podaję odpowiedź: przenieś blok case…break do funkcji WndProc, gdzie jego miejsce. I zastanów się także po co w ogóle ta funkcja.

Problem (a dla Kolegów oczywiście - problemiczek) rozwiązany.

Pozostaję niewypłacalnym dłużnikiem obu Kolegów!

Serdeczne dzięki! !!

Ja na początek radzę nauczyć się w ogóle C++ :wink: