Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /******************************************************************
- Grafika komputerowa, środowisko MS Windows - program przykładowy
- *****************************************************************/
- #include <windows.h>
- #include <gdiplus.h>
- using namespace Gdiplus;
- POINT ver1[] = { {500,210}, {515,160}, {585,190}, {620,140} , {630,120}, {730,100}, {780,140} , {800,190}, {830,160}, {840,210} , {640,205}, {685,205}, {500,210} };
- bool fDraw = false;
- POINT ptPrevious;
- HDC hdc;
- HWND hwnd;
- //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";
- GdiplusStartupInput gdiplusParametry;// parametry GDI+; domyślny konstruktor wypełnia strukturę odpowiednimi wartościami
- ULONG_PTR gdiplusToken; // tzw. token GDI+; wartość uzyskiwana przy inicjowaniu i przekazywana do funkcji GdiplusShutdown
- // Inicjujemy GDI+.
- GdiplusStartup(&gdiplusToken, &gdiplusParametry, NULL);
- //Definiujemy klase głównego okna aplikacji
- //Okreslamy tu wlasciwosci okna, szczegoly wygladu oraz
- //adres funkcji przetwarzajacej komunikaty
- nasza_klasa.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
- 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)
- }
- GdiplusShutdown(gdiplusToken);
- 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);
- 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:
- fDraw = TRUE;
- ptPrevious.x = LOWORD(lParam);
- ptPrevious.y = HIWORD(lParam);
- return 0;
- case WM_LBUTTONUP:
- for (int i = 0; i < 13; i++) {
- for (int dx = -3; dx < 4; dx++) {
- for (int dy = -3; dy < 4; dy++) {
- if (LOWORD(lParam) == ver1[i].x + dx && HIWORD(lParam) == ver1[i].y + dy) {
- fDraw = true;
- }
- }
- }
- }
- if (fDraw)
- {
- hdc = GetDC(hwnd);
- MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL);
- LineTo(hdc, LOWORD(lParam), HIWORD(lParam));
- ReleaseDC(hwnd, hdc);
- }
- fDraw = FALSE;
- return 0;
- case WM_MOUSEMOVE:
- if (fDraw)
- {
- }
- return 0;
- case WM_PAINT:
- {
- PAINTSTRUCT paint;
- HDC kontekst;
- kontekst = BeginPaint(okno, &paint);
- // MIEJSCE NA KOD GDI
- HBRUSH oldbrush = (HBRUSH)SelectObject(kontekst, GetStockObject(NULL_BRUSH)); //stworzenie nowego p?dzla i
- //przypisanie do niego "starego" p?dzla i za razem wybranie nowego pustego p?dzla
- HBRUSH brsh = CreateSolidBrush(RGB(160, 28, 30)); //Wybranie koloru pędzla
- SelectObject(kontekst, brsh); //przypisanie pędzla
- Pie(kontekst,0, 40, 300, 340, 170, 170, 0, 190); //Narysowanie wycinka koła
- DeleteObject(brsh);
- HBRUSH brsh2 = CreateSolidBrush(RGB(50,255,50));
- SelectObject(kontekst, brsh2);
- Pie(kontekst,0, 40, 300, 340, 170, 200, 170, 170);
- DeleteObject(brsh2);
- HBRUSH brsh3 = CreateSolidBrush(RGB(50, 50, 250));
- SelectObject(kontekst, brsh3);
- Pie(kontekst,0, 40, 300, 340, 0, 190, 170, 200);
- DeleteObject(brsh3);
- SelectObject(kontekst, GetStockObject(NULL_BRUSH)); //usunięcie pędzla
- //rysowanie kola
- HPEN pioro = CreatePen(PS_SOLID, 3, RGB(0, 0, 0));
- SelectObject(kontekst, pioro);
- Ellipse(kontekst, 0, 40, 300, 340);
- DeleteObject(pioro);
- //rysowanie litery
- HBRUSH E = CreateSolidBrush(RGB(30, 30, 30));
- HPEN pioro2 = CreatePen(PS_SOLID, 3, RGB(150, 150, 150));
- SelectObject(kontekst, E);
- SelectObject(kontekst, pioro2);
- POINT vertices[] = { {80, 100}, {200, 100}, {200, 130}, {130,130}, {130,170}, {170, 170},{170,200}, {130,200}, {130,260},{200, 260}, {200, 290}, {80,290} };
- Polygon(kontekst, vertices, sizeof(vertices) / sizeof(vertices[0]));
- DeleteObject(E);
- DeleteObject(pioro2);
- //rysowanie krzywej beziera
- HPEN pioro3 = CreatePen(PS_SOLID, 3, RGB(30,30,30));
- SelectObject(kontekst, pioro3);
- PolyBezier(kontekst, ver1, 13);
- Ellipse(kontekst, 530, 197, 580, 247);
- Ellipse(kontekst, 810, 197, 760, 247);
- DeleteObject(pioro3);
- HPEN pioro4 = CreatePen(PS_SOLID, 2, RGB(255,255,153));
- SelectObject(kontekst, pioro4);
- for (int i = 0; i < 13; i++) {
- int x = ver1[i].x;
- int y = ver1[i].y;
- Ellipse(kontekst, x - 2, y - 2, x + 2, y + 2);
- }
- // utworzenie obiektu umożliwiającego rysowanie przy użyciu GDI+
- // (od tego momentu nie można używać funkcji GDI
- Graphics grafika(kontekst);
- // MIEJSCE NA KOD GDI+
- // utworzenie czcionki i wypisanie tekstu na ekranie
- //FontFamily fontFamily(L"Times New Roman");
- //Font font(&fontFamily, 24, FontStyleRegular, UnitPixel);
- //PointF pointF(100.0f, 400.0f);
- //SolidBrush solidBrush(Color(255, 0, 0, 255));
- //grafika.DrawString(L"To jest tekst napisany za pomocą GDI+.", -1, &font, pointF, &solidBrush);
- 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);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement