Zegary. Zegary (timers) umożliwiają cykliczne w danych odstępach czasu wykonać określone operacje.

Podobne dokumenty
OpenGL - charakterystyka

Komunikaty w Windows. Jarosław Kuchta

Programowanie współbieżne. Tworzenie i obsługa semaforów oraz wątków przy użyciu funkcji Windows API.

Zatem standardowe rysowanie prymitywów wygląda następująco:

Podstawowy projekt OpenGL utworzony przy użyciu środowisk programistycznych firmy Microsoft.

IFiZR Laboratorium 5 Info

Podstawy programowania w języku C dla środowiska Windows

3 Przygotował: mgr inż. Maciej Lasota

Temat: Transformacje 3D

Laboratorium Grafiki Komputerowej i Animacji. Ćwiczenie III. Biblioteka OpenGL - wprowadzenie, obiekty trójwymiarowe: punkty, linie, wielokąty

Procedura okna: LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);

Aplikacja Sieciowa wątki po stronie klienta

Wielozadaniowość w systemie Microsoft Windows

Programowanie na poziomie sprzętu. Programowanie w Windows API

Formaty plików graficznych - wprowadzenie

Grafika 3D OpenGL część II

Wprowadzenie do programowania w Windows

Laboratorium Grafiki Komputerowej i Animacji. Ćwiczenie I. Wprowadzenie do programowania w Windows

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Programowanie w środowiskach RAD Język C++ w środowiskach RAD

1. Wstęp. 2. Szablon. 1 WinApi Wstęp i szablon. Czym jest API?

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

Podstawy programowania w języku C dla środowiska Windows

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.5

Ćwiczenie nr 1 Szkielet aplikacji wykorzystującej bibliotekę OpenGL dla środowiska Windows z wykorzystaniem Visual C++

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Janusz Ganczarski. OpenGL Pierwszy program

Programowanie wielowątkowe. Jarosław Kuchta

Część 4 życie programu

Microsoft Visual C++

Wskaźniki w C. Anna Gogolińska

PROGRAMOWANIE SYSTEMÓW WBUDOWANYCH INTER-PROCESS COMMUNICATION

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

I - Microsoft Visual Studio C++

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Umieszczanie kodu. kod skryptu

1.1. Programowanie dla Windows. Programowanie dla Windows. Komunikaty w systemie Windows. Application Programming Interface

PROE wykład 8 Interfejs użytkownika (GUI) dr inż. Jacek Naruniec

Jak zainstalować i skonfigurować komunikator MIRANDA, aby wyglądał i funkcjonował jak Gadu Gadu Tutorial by t800.

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Microsoft IT Academy kurs programowania

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Ćwiczenie 4 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

1 Podstawy c++ w pigułce.

Programowanie - instrukcje sterujące

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

1 Podstawy c++ w pigułce.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Elementarne obiekty geometryczne, bufory. Dorota Smorawa

Programowanie w języku C++ z użyciem Windows API

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Laboratorium 1. Część I. Podstawy biblioteki graficznej OpenGL.

Wstawianie nowej strony

Programowanie - wykład 4

1. Proszę wejść na stronę: poczta.home.pl i zalogować się do nowej skrzynki za pomocą otrzymanych danych.

Tworzenie aplikacji Windows Podstawy obsługi komunikatów Windows (Delphi)

Pobieranie argumentów wiersza polecenia

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Programowanie obiektowe

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Aplikacje w Javie- wykład 11 Wątki-podstawy

Język ludzki kod maszynowy

Aplikacje WWW - laboratorium

Informatyka II. Laboratorium Aplikacja okienkowa

Podstawy Programowania Podstawowa składnia języka C++

Programowanie Równoległe wykład, CUDA, przykłady praktyczne 1. Maciej Matyka Instytut Fizyki Teoretycznej

WYKONANIE APLIKACJI OKIENKOWEJ OBLICZAJĄCEJ SUMĘ DWÓCH LICZB W ŚRODOWISKU PROGRAMISTYCZNYM. NetBeans. Wykonał: Jacek Ventzke informatyka sem.

DLL Injection. Przejęcie kontroli nad procesem

Projektowanie i programowanie aplikacji biznesowych. Wykład 2

Podstawy Kompilatorów

1. Tworzenie nowego projektu.

Rodzina protokołów TCP/IP. Aplikacja: ipconfig.

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

imei CYFROWE PRZETWARZANIE SYGNAŁÓW Laboratorium Temat: Tworzenie aplikacji w środowisku LabWindows/CVI Instytut Metrologii, Elektroniki i Informatyki

Podstawy Programowania C++

Aplikacje WWW - laboratorium

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

Instrukcja do ćwiczeń

Podstawy programowania w środowisku Windows. Oto identyfikatory najczęściej obsługiwanych meldunków (przedrostek WM to skrót od Windows message):

Konstrukcje warunkowe Pętle

Budowa i generowanie planszy

Instalacja protokołu PPPoE

Układy VLSI Bramki 1.0

Metody Metody, parametry, zwracanie wartości

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Wstęp do programowania 1

Wybieramy File->New->Project Wybieramy aplikację MFC->MFC Application jak na rysunku poniżej:

Ćwiczenia z S Komunikacja S z dotykowymi panelami HMI na przykładzie współpracy sterownika z panelem KTP600 PN.

Visual Studio instalacja

Język C zajęcia nr 5

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Transkrypt:

Zegary Zegary (timers) umożliwiają cykliczne w danych odstępach czasu wykonać określone operacje. Zaczniemy od funkcji przetwarzania komunikatów: //procedura okna LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) static HWND wndbutton; switch(msg) case WM_CREATE: SetTimer(hWnd, 101, 2500, NULL); case WM_DESTROY: KillTimer(hWnd, 101); PostQuitMessage(0); case WM_TIMER: if(wparam==101) MessageBox(hWnd, "tekst okna dialogowego","okno dialogowe", 0); return DefWindowProc(hWnd, msg, wparam, lparam); Zegar tworzy funkcją SetTimer. Jej pierwszy parametr określa okno z którym jest związany. Parametr drugi to identyfikator zegara, trzeci określa odstęp czasu pomiędzy kolejnymi uruchomieniami podany w milisekundach (1sekunda = 1000milisekund). Zegar obsługujemy komunikatem WM_TIMER. Sprawdzamy wartość parametru wparam jeśli jest równa identyfikatorowi naszego zegara (101) wówczas zostanie wyświetlone okno dialogowe. Ponieważ rodzicem okna jest formularz więc okienko nie zostanie wyświetlone na pasku start.

Teraz dodamy drugi zegar, który będzie wyświetlał współrzędne myszy: #include <stdio.h> case WM_CREATE: SetTimer(hWnd, 102, 1, NULL); case WM_DESTROY: KillTimer(hWnd,102); case WM_TIMER: else if(wparam==102) static POINT screenpoint; static char posx[10]; static char posy[10]; static char posstr[10]; GetCursorPos(&screenPoint); sprintf(posx, "%d", screenpoint.x); sprintf(posy, "%d", screenpoint.y); strcpy(posstr,""); strcat(posstr, posx); strcat(posstr,":"); strcat(posstr,posy); SetWindowText(hWnd, posstr); Ustawienie trzeciego parametru funkcji SetTimer na 1 oznacza, że odświeżanie współrzędnych następuje co 1 milisekundę. Funkcja GetCursorPos umożliwia pobranie zmiennej typu POINT która zawiera współrzędne naszego kursora.

Wątki Wątki (threads) umożliwiają uruchamianie w aplikacji kilku elementów naraz. W grach jeden wątek może być odpowiedzialny za grafikę, drugi za fizykę, inny za sieć itd. Do przedstawienia działania wątków stworzymy aplikację konsolową: #include<windows.h> #include<stdio.h> DWORD WINAPI mythread(lpvoid indata) int i; for(i=0; i<3; i++) int value = *(int*)(indata); printf("%d \n", value); return 0; int main() HANDLE thread; int data = 10; DWORD id; thread = CreateThread(NULL, 0, mythread, &data, 0, &id); CloseHandle(thread); printf("id WATKOW: %d \n",id); getchar(); return 0; Funkcja CreateThread tworzy nam nowy wątek. Jej pierwszym parametrem może być struktura opisująca bezpieczeństwo, my ustawimy atrybuty na domyślne poprzez wstawienie wartości NULL. Drugi parametr to ilość bajtów przydzielonych wątkowi. Podając 0 przydzielamy domyślną ilość pamięci 1MB. Trzeci parametr to wskaźnik na funkcję wątku. Czwarty to dodatkowe informacje jakie możemy przekazać funkcji wątku. Piąty parametr określa flagi towarzyszące tworzeniu wątku, 0 oznacza że zostanie uruchomiony zaraz po utworzeniu. Ostatni parametr to adres do zmiennej w której zostanie zapisany numer wątku, nie musimy go podawać.

Funkcja CreateThread zwraca uchwyt do wątku w postaci typu HANDLE. Gdy wątek nie jest już potrzebny i chcemy go usunąć uruchamiamy funkcję CloseHandle i przekazać jej uchwyt wątku. Funkcja mythread musi mieć klauzulę WINAPI, zwraca wartość całkowitą i może mieć jeden parametr wskazujący typ void(lpvoid).

OpenGL Rendering w OpenGL musi wykonywany być cały czas. Dlatego operacje rysowania najlepiej przeprowadzać w pętli obsługi komunikatów. Niestety GetMessage działa tylko wtedy kiedy wiadomości są wysyłane do aplikacji, dlatego też stosuje się PeekMessage która nie powoduje wstrzymania aplikacji z momencie braku komunikatu w kolejce. Pompa komunikatów działająca z OpenGL wygląda następująco: //pompa komunikatow while(1) if(peekmessage(&msg, 0, 0, 0, PM_REMOVE)) if(msg.message == WM_QUIT) TranslateMessage(&Msg); DispatchMessage(&Msg);

OpenGL Tworząc nowy projekt i wybierając aplikacje typu opengl otrzymujemy gotowy szkielet aplikacji. Składa się ona z: Funkcji określającej format pikseli: void EnableOpenGL(HWND hwnd, HDC* hdc, HGLRC* hrc) PIXELFORMATDESCRIPTOR pfd; int iformat; /* get the device context (DC) */ *hdc = GetDC(hwnd); /* set the pixel format for the DC */ ZeroMemory(&pfd, sizeof(pfd)); pfd.nsize = sizeof(pfd); pfd.nversion = 1; pfd.dwflags = PFD_DRAW_TO_WINDOW PFD_SUPPORT_OPENGL PFD_DOUBLEBUFFER; pfd.ipixeltype = PFD_TYPE_RGBA; pfd.ccolorbits = 24; pfd.cdepthbits = 16; pfd.ilayertype = PFD_MAIN_PLANE; iformat = ChoosePixelFormat(*hDC, &pfd); SetPixelFormat(*hDC, iformat, &pfd); /* create and enable the render context (RC) */ *hrc = wglcreatecontext(*hdc); wglmakecurrent(*hdc, *hrc); Kończącej działanie OpenGL: void DisableOpenGL (HWND hwnd, HDC hdc, HGLRC hrc) wglmakecurrent(null, NULL); wgldeletecontext(hrc); ReleaseDC(hwnd, hdc);

Funkcji przetwarzającej komunikaty: LRESULT CALLBACK WindowProc(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam) switch (umsg) case WM_CLOSE: PostQuitMessage(0); case WM_DESTROY: return 0; case WM_KEYDOWN: switch (wparam) case VK_ESCAPE: PostQuitMessage(0); default: return DefWindowProc(hwnd, umsg, wparam, lparam); return 0;

Główną pętlą programu jest pętla przetwarzająca komunikaty: while (!bquit) /* check for messages */ if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) /* handle or dispatch messages */ if (msg.message == WM_QUIT) bquit = TRUE; else TranslateMessage(&msg); DispatchMessage(&msg); else /* OpenGL animation code goes here */ glclearcolor(0.0f, 0.0f, 0.0f, 0.0f); glclear(gl_color_buffer_bit); glpushmatrix(); glrotatef(theta, 0.0f, 0.0f, 1.0f); glbegin(gl_triangles); glcolor3f(1.0f, 0.0f, 0.0f); glvertex2f(0.0f, 1.0f); glcolor3f(0.0f, 1.0f, 0.0f); glvertex2f(0.87f, -0.5f); glcolor3f(0.0f, 0.0f, 1.0f); glvertex2f(-0.87f, -0.5f); glend(); glpopmatrix(); SwapBuffers(hDC); theta += 1.0f; Sleep (1);

Prymitywy Prymitywem określamy najprostszy z elementów geometrycznych. Są to elementy takie jak punkt, linia, trójkąt, czworokąt czy wielokąt. Aby poprawnie wyświetlały nam się nasze prymitywy, potrzebujemy upewnić się, że wyczyszczone są odpowiednie bufory opengl. Dlatego, przed rozpoczęciem rysowania czegokolwiek piszemy (w pętli głównej programu): glclear(gl_color_buffer_bit GL_DEPTH_BUFFER_BIT); glclearcolor(0.0f, 0.0f, 0.0f, 1.0f); Na koniec pętli głównej dodajemy także funkcję zamieniającą bufory: SwapBuffers(hDC); Przed pętlą główną wpisujemy glenable(gl_depth_test); Punkty Punkt jest najprostszym elementem. Procedura tworząca punkt na środku ekranu prezentuje się następująco: glbegin(gl_points); glend(); glvertex3f(0.0f, 0.0f, 0.0f); Utworzy ona punkt na środku naszego obszaru. Rozmiar punktu: Możliwe jest zmienianie rozmiaru punktu, służy do tego funkcja glpointsize() przyjmująca za parametr rozmiar punktu. W OpenGL wywołanie jednej funkcji wpływającej na zachowanie jakiegoś prymitywu powoduje, że działa ona na wszystkie następne, do czasu ponownego jej wywołania i zmienienia właściwości. glpointsize(15.0f);

Wygładzanie krawędzi punktu: Domyślnie punkt jest kwadratem, widać to przede wszystkim jeśli rozmiar ustawimy na większy od 1. Aby wymusić zaokrąglenie punktów, musimy uruchomić opcję GL_POINT_SMOOTH: glenable(gl_point_smooth); Opcję wyłącza się za pomocą: gldisable(gl_point_smooth); Kolory: Aby zmienić kolor stosujemy funkcję: glcolor3f(); Funkcja ta wczytuje 3 floaty odpowiedzialne za natężenie czerwieni, zieleni i niebieskiego: glcolor3f(1.0f, 1.0f, 1.0f);