/******************************************************************** FUNKCJA OKNA realizujaca przetwarzanie meldunków kierowanych do okna aplikacji*/ LRESULT CALLBACK WndProc (HWND okno, UINT kod_meldunku, WPARAM wParam, LPARAM lParam) { // PONI¯SZA INSTRUKCJA DEFINIUJE REAKCJE APLIKACJI NA POSZCZEGÓLNE MELDUNKI KlawiszologiaSterowania(kod_meldunku, wParam, lParam); switch (kod_meldunku) { case WM_CREATE: //meldunek wysy³any w momencie tworzenia okna { g_context = GetDC(okno); srand( (unsigned)time( NULL ) ); int wynik = InicjujGrafike(g_context); if (wynik == 0) { printf("nie udalo sie otworzyc okna graficznego\n"); //exit(1); } PoczatekInterakcji(); SetTimer(okno, 1, 10, NULL); return 0; } case WM_KEYDOWN: { switch (LOWORD(wParam)) { case VK_F1: // wywolanie systemu pomocy { char lan[1024],lan_bie[1024]; //GetSystemDirectory(lan_sys,1024); GetCurrentDirectory(1024,lan_bie); strcpy(lan,"C:\\Program Files\\Internet Explorer\\iexplore "); strcat(lan,lan_bie); strcat(lan,"\\pomoc.htm"); int wyni = WinExec(lan,SW_NORMAL); if (wyni < 32) // proba uruchominia pomocy nie powiodla sie { strcpy(lan,"C:\\Program Files\\Mozilla Firefox\\firefox "); strcat(lan,lan_bie); strcat(lan,"\\pomoc.htm"); wyni = WinExec(lan,SW_NORMAL); if (wyni < 32) { char lan_win[1024]; GetWindowsDirectory(lan_win,1024); strcat(lan_win,"\\notepad pomoc.txt "); wyni = WinExec(lan_win,SW_NORMAL); } } break; } case VK_ESCAPE: // wyjœcie z programu { SendMessage(okno, WM_DESTROY,0,0); break; } } return 0; } case WM_PAINT: { PAINTSTRUCT paint; HDC kontekst; kontekst = BeginPaint(okno, &paint); RysujScene(); SwapBuffers(kontekst); EndPaint(okno, &paint); return 0; } case WM_TIMER: Cykl_WS(); InvalidateRect(okno, NULL, FALSE); return 0; case WM_SIZE: { int cx = LOWORD(lParam); int cy = HIWORD(lParam); ZmianaRozmiaruOkna(cx,cy); return 0; } case WM_DESTROY: //obowi¹zkowa obs³uga meldunku o zamkniêciu okna if (lParam == 100) MessageBox(okno,"Jest zbyt póŸno na do³¹czenie do wirtualnego œwiata. Trzeba to zrobiæ zanim inni uczestnicy zmieni¹ jego stan.","Zamkniêcie programu",MB_OK); ZakonczenieInterakcji(); ZakonczenieGrafiki(); ReleaseDC(okno, g_context); KillTimer(okno, 1); PostQuitMessage (0) ; return 0; default: //standardowa obs³uga pozosta³ych meldunków return DefWindowProc(okno, kod_meldunku, wParam, lParam); } }
LRESULT COknoGL::WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { long wynik = COkno::WndProc(hWnd,message,wParam,lParam); switch(message) { case WM_CREATE: //utworzenie okna InitWGL(hWnd); UstawienieSceny(false); break; case WM_SIZE: UstawienieSceny(false); break; case WM_PAINT: RysujScene(); ValidateRect(hWnd,NULL); break; case WM_DESTROY: UsunWGL(); break; } if(kontrolaKameryPrzezUzytkownika) { switch(message) { case WM_RBUTTONDOWN: poczatkowaPozycjaKursoraMyszy.x = LOWORD(lParam); poczatkowaPozycjaKursoraMyszy.y = HIWORD(lParam); break; case WM_MOUSEMOVE: if (wParam & MK_RBUTTON) { POINT biezacaPozycjaKursoraMyszy = {LOWORD(lParam),HIWORD(lParam)}; POINT przesuniecieKursoraMyszy= { biezacaPozycjaKursoraMyszy.x - poczatkowaPozycjaKursoraMyszy.x, biezacaPozycjaKursoraMyszy.y - poczatkowaPozycjaKursoraMyszy.y }; if(przesuniecieKursoraMyszy.x == 0 && przesuniecieKursoraMyszy.y == 0) break; const float czuloscMyszy=5.0f; kameraCelPhi += przesuniecieKursoraMyszy.x/czuloscMyszy; float zmianaCelTheta = przesuniecieKursoraMyszy.y/czuloscMyszy; if(fabs(kameraCelTheta+zmianaCelTheta)<90) kameraCelTheta += zmianaCelTheta; poczatkowaPozycjaKursoraMyszy.x = LOWORD(lParam); poczatkowaPozycjaKursoraMyszy.y = HIWORD(lParam); RysujScene(); } break; case WM_KEYDOWN: const float przesuniecie=0.1f; switch(wParam) { case VK_OEM_MINUS: natezenie_swiatla_tla -= 0.01f; if(natezenie_swiatla_tla<0) natezenie_swiatla_tla=0; Oswietlenie(); break; case VK_OEM_PLUS: case '=': natezenie_swiatla_tla += 0.01f; if(natezenie_swiatla_tla>1) natezenie_swiatla_tla=1; Oswietlenie(); break; case 'W': case VK_UP: kameraZ += przesuniecie; break; case 'S': case VK_DOWN: kameraZ -= przesuniecie; break; case 'A': case VK_LEFT: kameraX += przesuniecie; break; case 'D': case VK_RIGHT: kameraX -= przesuniecie; break; case 'C': static bool rzutowanieIzometryczne=false; rzutowanieIzometryczne = !rzutowanieIzometryczne; UstawienieSceny(rzutowanieIzometryczne); break; } RysujScene(); break; } } return wynik; }