/******************************************************************
Grafika komputerowa, środowisko MS Windows - program przykładowy
*****************************************************************/
#include
bool keys[256];
struct s_linia {
int x1, x2, y1, y2;
};
s_linia linie[100];
int aktualna_linia = 0;
//deklaracja funkcji obslugi okna
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
//funkcja Main - dla Windows
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG meldunek; //innymi slowy "komunikat"
WNDCLASS nasza_klasa; //klasa głównego okna aplikacji
HWND okno;
static char nazwa_klasy[] = "Podstawowa";
//Definiujemy klase głównego okna aplikacji
//Okreslamy tu wlasciwosci okna, szczegoly wygladu oraz
//adres funkcji przetwarzajacej komunikaty
nasza_klasa.style = CS_HREDRAW | CS_VREDRAW;
nasza_klasa.lpfnWndProc = WndProc; //adres funkcji realizującej przetwarzanie meldunków
nasza_klasa.cbClsExtra = 0 ;
nasza_klasa.cbWndExtra = 0 ;
nasza_klasa.hInstance = hInstance; //identyfikator procesu przekazany przez MS Windows podczas uruchamiania programu
nasza_klasa.hIcon = 0;
nasza_klasa.hCursor = LoadCursor(0, IDC_ARROW);
nasza_klasa.hbrBackground = (HBRUSH) GetStockObject(GRAY_BRUSH);
nasza_klasa.lpszMenuName = "Menu" ;
nasza_klasa.lpszClassName = nazwa_klasy;
//teraz rejestrujemy klasę okna głównego
RegisterClass (&nasza_klasa);
/*tworzymy okno główne
okno będzie miało zmienne rozmiary, listwę z tytułem, menu systemowym
i przyciskami do zwijania do ikony i rozwijania na cały ekran, po utworzeniu
będzie widoczne na ekranie */
okno = CreateWindow(nazwa_klasy, "Grafika komputerowa", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
/* wybór rozmiaru i usytuowania okna pozostawiamy systemowi MS Windows */
ShowWindow (okno, nCmdShow) ;
//odswiezamy zawartosc okna
UpdateWindow (okno) ;
// GŁÓWNA PĘTLA PROGRAMU
while (GetMessage(&meldunek, NULL, 0, 0))
/* pobranie komunikatu z kolejki; funkcja GetMessage zwraca FALSE tylko dla
komunikatu wm_Quit; dla wszystkich pozostałych komunikatów zwraca wartość TRUE */
{
TranslateMessage(&meldunek); // wstępna obróbka komunikatu
DispatchMessage(&meldunek); // przekazanie komunikatu właściwemu adresatowi (czyli funkcji obslugujacej odpowiednie okno)
}
return (int)meldunek.wParam;
}
/********************************************************************
FUNKCJA OKNA realizujaca przetwarzanie meldunków kierowanych do okna aplikacji*/
LRESULT CALLBACK WndProc (HWND okno, UINT kod_meldunku, WPARAM wParam, LPARAM lParam)
{
HMENU mPlik, mInfo, mGlowne;
/* PONIŻSZA INSTRUKCJA DEFINIUJE REAKCJE APLIKACJI NA POSZCZEGÓLNE MELDUNKI */
switch (kod_meldunku)
{
case WM_CREATE: //meldunek wysyłany w momencie tworzenia okna
mPlik = CreateMenu();
AppendMenu(mPlik, MF_STRING, 100, "&Zapiszcz...");
AppendMenu(mPlik, MF_SEPARATOR, 0, "");
AppendMenu(mPlik, MF_STRING, 101, "&Koniec");
mInfo = CreateMenu();
AppendMenu(mInfo, MF_STRING, 200, "&Autor...");
mGlowne = CreateMenu();
AppendMenu(mGlowne, MF_POPUP, (UINT_PTR) mPlik, "&Plik");
AppendMenu(mGlowne, MF_POPUP, (UINT_PTR) mInfo, "&Informacja");
SetMenu(okno, mGlowne);
DrawMenuBar(okno);
return 0;
case WM_COMMAND: //reakcje na wybór opcji z menu
switch (wParam)
{
case 100: if(MessageBox(okno, "Zapiszczeć?", "Pisk", MB_YESNO) == IDYES)
MessageBeep(0);
break;
case 101: DestroyWindow(okno); //wysylamy meldunek WM_DESTROY
break;
case 200: MessageBox(okno, "Imię i nazwisko:\nNumer indeksu: ", "Autor", MB_OK);
}
return 0;
case WM_LBUTTONDOWN: //reakcja na lewy przycisk myszki
{
linie[aktualna_linia].x1 = LOWORD(lParam);
linie[aktualna_linia].y1 = HIWORD(lParam);
return 0;
}
case WM_LBUTTONUP: //reakcja na lewy przycisk myszki
{
linie[aktualna_linia].x2 = LOWORD(lParam);
linie[aktualna_linia].y2 = HIWORD(lParam);
aktualna_linia++;
InvalidateRect(okno, NULL, true);
return 0;
}
case WM_KEYDOWN:
{
keys[wParam] = TRUE;
return 0;
}
case WM_KEYUP:
{
if (GetKeyState(VK_LCONTROL))
if (keys[90])
aktualna_linia--;
keys[wParam] = FALSE;
InvalidateRect(okno, NULL, true);
return 0;
}
case WM_PAINT:
{
PAINTSTRUCT paint;
HDC kontekst;
kontekst = BeginPaint(okno, &paint);
HPEN pioro = CreatePen(PS_SOLID, 10, RGB(255,0,0));
HBRUSH pedzel = CreateSolidBrush(RGB(0,0,255));
SelectObject(kontekst, pedzel);
float mnoznik = 0.5;
int domek_x = 300*mnoznik; int domek_y = 400*mnoznik;
Rectangle(kontekst, domek_x, domek_y, domek_x+200*mnoznik, domek_y+100*mnoznik);
pedzel = CreateSolidBrush(RGB(0,255,0));
SelectObject(kontekst, pedzel);
Rectangle(kontekst, domek_x+40*mnoznik, domek_y+50*mnoznik, domek_x+60*mnoznik, domek_y+100*mnoznik);
Rectangle(kontekst, domek_x+120*mnoznik, domek_y+20*mnoznik, domek_x+160*mnoznik, domek_y+60*mnoznik);
SelectObject(kontekst, pioro);
MoveToEx(kontekst, domek_x-50*mnoznik, domek_y, NULL);
LineTo(kontekst, domek_x+250*mnoznik, domek_y);
MoveToEx(kontekst, domek_x-50*mnoznik, domek_y, NULL);
LineTo(kontekst, domek_x, domek_y-50*mnoznik);
MoveToEx(kontekst, domek_x+250*mnoznik, domek_y, NULL);
LineTo(kontekst, domek_x+200*mnoznik, domek_y-50*mnoznik);
MoveToEx(kontekst, domek_x, domek_y-50*mnoznik, NULL);
LineTo(kontekst, domek_x+200*mnoznik, domek_y-50*mnoznik);
FloodFill(kontekst,domek_x+100,domek_y-25, RGB(255,0,0));
pioro = CreatePen(PS_SOLID, 10, RGB(0,0,0));
SelectObject(kontekst, pioro);
if (aktualna_linia>0)
for (int i=0; i<=aktualna_linia-1; i++) {
MoveToEx(kontekst, linie[i].x1, linie[i].y1, NULL);
LineTo(kontekst, linie[i].x2, linie[i].y2);
}
DeleteObject(pioro);
EndPaint(okno, &paint);
return 0;
}
case WM_DESTROY: //obowiązkowa obsługa meldunku o zamknięciu okna
PostQuitMessage (0) ;
return 0;
default: //standardowa obsługa pozostałych meldunków
return DefWindowProc(okno, kod_meldunku, wParam, lParam);
}
}18:59:50
case WM_KEYDOWN:
{
keys[wParam] = TRUE;
return 0;
}
case WM_KEYUP:
{
if (GetKeyState(VK_LCONTROL))
if (keys[90])
aktualna_linia--;
keys[wParam] = FALSE;
InvalidateRect(okno, NULL, true);
return 0;
}
case WM_PAINT:
{
PAINTSTRUCT paint;
HDC kontekst;
kontekst = BeginPaint(okno, &paint);
HPEN pioro = CreatePen(PS_SOLID, 10, RGB(255,0,0));
HBRUSH pedzel = CreateSolidBrush(RGB(0,0,255));
SelectObject(kontekst, pedzel);
float mnoznik = 0.5;
int domek_x = 300*mnoznik; int domek_y = 400*mnoznik;
Rectangle(kontekst, domek_x, domek_y, domek_x+200*mnoznik, domek_y+100*mnoznik);
pedzel = CreateSolidBrush(RGB(0,255,0));
SelectObject(kontekst, pedzel);
Rectangle(kontekst, domek_x+40*mnoznik, domek_y+50*mnoznik, domek_x+60*mnoznik, domek_y+100*mnoznik);
Rectangle(kontekst, domek_x+120*mnoznik, domek_y+20*mnoznik, domek_x+160*mnoznik, domek_y+60*mnoznik);
SelectObject(kontekst, pioro);
MoveToEx(kontekst, domek_x-50*mnoznik, domek_y, NULL);
LineTo(kontekst, domek_x+250*mnoznik, domek_y);
MoveToEx(kontekst, domek_x-50*mnoznik, domek_y, NULL);
LineTo(kontekst, domek_x, domek_y-50*mnoznik);
MoveToEx(kontekst, domek_x+250*mnoznik, domek_y, NULL);
LineTo(kontekst, domek_x+200*mnoznik, domek_y-50*mnoznik);
MoveToEx(kontekst, domek_x, domek_y-50*mnoznik, NULL);
LineTo(kontekst, domek_x+200*mnoznik, domek_y-50*mnoznik);
FloodFill(kontekst,domek_x+100,domek_y-25, RGB(255,0,0));
pioro = CreatePen(PS_SOLID, 10, RGB(0,0,0));
SelectObject(kontekst, pioro);
if (aktualna_linia>0)
for (int i=0; i<=aktualna_linia-1; i++) {
MoveToEx(kontekst, linie[i].x1, linie[i].y1, NULL);
LineTo(kontekst, linie[i].x2, linie[i].y2);
}
DeleteObject(pioro);
EndPaint(okno, &paint);
return 0;
}
case WM_DESTROY: //obowiązkowa obsługa meldunku o zamknięciu okna
PostQuitMessage (0) ;
return 0;
default: //standardowa obsługa pozostałych meldunków
return DefWindowProc(okno, kod_meldunku, wParam, lParam);
}
}
Wyszukiwarka
Podobne podstrony:
Arch grafika osnovi kompozicii grigoryan
grafika inzynierska wyklad 3 color
Grafika wektorwa cw 2
lab grafika2D 3 zadania
Elementy grafiki inzynierskiej?1
Laboratorium grafika2D 4
Grafik
Wstep do grafiki
Grafika i inne
Grafika inz zaj 3
tekst i grafika
SpadajĄca grafika
grafika pojęcia
Geometria i grafika inżynierska 5
09 grafika dzwiek video
więcej podobnych podstron