Windowsin sanomanvälitys. Juha Järvensivu 2007

Samankaltaiset tiedostot
Windowsin sanomanvälitys. Juha Järvensivu 2008

Winapi. Juha Järvensivu 2007

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

OpenGL:n perusteet - Osa 1: Ikkunan luominen

1 of

Graafisen käyttöliittymän ohjelmointi

Peliohjelmointirajapinnoista

OpenGL:n perusteet - Osa 2: 3D grafiikka

Peliohjelmointirajapinnoista

Datalaitteiden esikonfigurointijärjestelmä

Ohjelmointiharjoituksia Arduino-ympäristössä

Rinnakkaisuus. Juha Järvensivu 2008

QT tyylit. Juha Järvensivu 2008

1.1 Pino (stack) Koodiluonnos. Graafinen esitys ...

Graafisen käyttöliittymän ohjelmointi Syksy 2013

TIETORAKENTEET JA ALGORITMIT

Interaktiivinen käyttöliittymä. 2008

PÄÄTTÖTYÖ YKSINKERTAISEN C-KIELISEN GRAAFISEN KÄYTTÖLIITTYMÄN LUONTI

#include <stdio.h> // io-toiminnot. //#define KM_MAILISSA int main( ){

Olio-ohjelmointi Javalla

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

UML -mallinnus Viestiyhteyskaavio EERO NOUSIAINEN

3. Binääripuu, Java-toteutus

Muuttujien roolit Kiintoarvo cin >> r;

Ohjelmoinnin perusteet Y Python

Hiirisanomiin vastaaminen. 2007

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Jypelin käyttöohjeet» Ruutukentän luominen

Sisällys. 15. Lohkot. Lohkot. Lohkot

Rinnakkaisuus (.NET) Juha Järvensivu 2007

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

OpenGL:n perusteet Osa 4: Valot ja varjot

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

RINNAKKAINEN OHJELMOINTI A,

// // whiledemov1.c // #include <stdio.h> int main(void){ int luku1 = -1; int luku2 = -1;

QT model view. Juha Järvensivu 2008

10 Lock Lock-lause

ICS-C2000 Tietojenkäsittelyteoria Kevät 2016

Ohjelmoinnin perusteet Y Python

Proseduurit, funktiot ja herättimet - esimerkkeinä Oracle, SQL Server, MySQL ja OCELOT. Jouni Huotari S2008

PROSEDUURIT, FUNKTIOT JA HERÄTTIMET - ESIMERKKEINÄ ORACLE, SQL SERVER, MYSQL JA OCELOT JOUNI HUOTARI K2009

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

ITKP102 Ohjelmointi 1 (6 op)

Tietueet. Tietueiden määrittely

Oliot viestivät metodeja kutsuen

Tapahtumapohjainen ohjelmointi

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

OHJ-7400 Graafisen käyttöliittymän ohjelmointi 4/6op

Lista luokan sisällä

TAITAJA 2007 ELEKTRONIIKKAFINAALI KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro:

6.3. AVR_rauta. EEPROM-muisti pva

Sisältö. 22. Taulukot. Yleistä. Yleistä

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

ITKP102 Ohjelmointi 1 (6 op)

1 Tehtävän kuvaus ja analysointi

C# ja.net. Juha Järvensivu 2007

Lumon tuotekirjaston asennusohje. Asennus- ja rekisteröintiohje

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

Sisällys. 16. Lohkot. Lohkot. Lohkot

1. Olio-ohjelmointi 1.1

Sisältö. 2. Taulukot. Yleistä. Yleistä

Tietorakenteet ja algoritmit

11. Javan valintarakenteet 11.1

Ohjelmoinnin peruskurssi Y1

Algoritmit 2. Luento 7 Ti Timo Männikkö

public static void main (String [] args)

Verkkoliikennettä Java[ssa lla] Jouni Smed

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

1. Omat operaatiot 1.1

Sovellusten ohjelmointi Microsoft Foundation Classes -luokkien avulla

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Rajapinta (interface)

Olio-ohjelmointi 2. välikoe HYV5SN

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Ohjelmoinnin perusteet Y Python

Uutiskirjesovelluksen käyttöohje

Kielioppia: toisin kuin Javassa

Piirtofunktiot ja ikkunan päivittäminen. Juha Järvensivu 2008

Esimerkki 1: Kahviautomaatti.

HELIA 1 (1) Outi Virkki Käyttöliittymät ja ohjelmiston suunnittelu :04

Windows 8 -kurssi. Kurssista

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Loppukurssin järjestelyt C:n edistyneet piirteet

Javan perusteita. Janne Käki

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Java ja grafiikka. Ville Sundberg

14. Poikkeukset 14.1

CE (versio 3) tukee neljää ajurityyppiä: native, stream interface, USB ja NDIS.

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Tutoriaaliläsnäoloista

Transkriptio:

Windowsin sanomanvälitys Juha Järvensivu juha.jarvensivu@tut.fi 2007

Sisällys Windowsin sanomat Sanomanvälitysmekanismi Ikkunan kahva Sanomien lähettäminen Esimerkki winamp

Tapahtumapohjainen toiminta Windows-sovellus käsittelee tapahtumat sanomina (Message) Ohjelma käsittelee sanomat saapumis- ja tärkeysjärjestyksessä (sanomajono, message queue) Windows lähettää viestin ikkunalle = Windows kutsuu ikkunaan liitettyä funktiota, ikkunaproseduuria

Sanoma WM_PAINT, WM_SIZE, WM_COMMAND Define avainsanalla määriteltyjä numerovakioita define WM_SIZE 0005 Käyttäjän omille sanomille varattu oma lukualue WM_USER through 0x7FFF

Sanoma Sanomaan liitetään 2 parametria WPARAM = 32bit integer LPARAM = 32bit integer Parametrien merkitys riippuu sanomasta Esim ID = WM_MOUSEMOVE fwkeys = wparam; xpos = LOWORD(lParam); ypos = HIWORD(lParam);

Sanomastruktuuri MSG struct MSG HWND hwnd; UINT message; WPARAM wparam; LPARAM lparam; DWORD time; Point pt; // Ikkunan kahva // viestin ID // viestin parametri // viestin parametri. // aika jolloin viesti on lähetetty // Kursorin sijainti

Sanoman vastaanotto WM_PAINT WM_SIZE Sanomajono WM_DESTROY WM_COMMAND Ohjelma Sanomasilmukka IkkunaProseduuri Sanomakäsittelijä Sanomakäsittelijä Sanomakäsittelijä Sanomakäsittelijä Sanoman oletuskäsittelijä DefWindowProc

Sanomajono Kun windows-sovellus käynnistyy, windows luo ohjelmalle (säikeelle) sanomajonon Käyttöjärjestelmä laittaa ikkunoille lähetetyt viestit sanomajonoon, josta sovellus käy ne hakemassa

Sanomasilmukka Hakee sanomat yksitellen sanomajonosta ja lähettää ne edelleen oikealle ikkunaproseduurille while (GetMessage(&msg, NULL, 0, 0)) TranslateMessage(&msg); DispatchMessage(&msg);

Ikkunaproseduuri Funktio, joka käsittelee ikkunalle lähetetyt sanomat Ikkunaproseduuri liittyy tiettyyn ikkunaluokkaan, joten useampi ikkuna (ilmentymä) voi käyttää samaa ikkunaproseduuria

Ikkunaluokka Ikkunat perustuvat ikkunaluokkaan Esim Button Ikkunaluokka pitää rekisteröidä ennen ensimmäisen ikkunan luomista WNDCLASSEX wndclass RegisterClassEx (&wndclass) ;

HWND Ikkunan kahva yksikäsitteinen ikkunan tunniste, jonka käyttöjärjestelmä luo ikkunan luontivaiheessa HWND hwnd = CreateWindow ( IkkunaLuokka", )

Winapi-sovellus Sisältää: Pääohjelman WinMain Ikkunaluokan rekisteröinnin ja ikkunan luomisen Ikkunaluokan sanomakäsittelijän WndProc Sanomasilmukan

Koodiesimerkki WinMain ja sanomasilmukka #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; void MyRegisterClass(HINSTANCE hinstance); void MyCreateWindow(HINSTANCE hinstance, int icmdshow); int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hprevinstance, PSTR szcmdline, int icmdshow) MSG msg ; MyRegisterClass(hInstance); MyCreateWindow(hInstance, icmdshow); // Sanomasilmukka while (GetMessage (&msg, NULL, 0, 0) == TRUE) TranslateMessage (&msg) ; DispatchMessage (&msg) ; return msg.wparam ; // käyttöjärjestelmälle palautuva arvo

Koodiesimerkki Ikkunaluokan alustaminen ja rekisteröinti void MyRegisterClass(HINSTANCE hinstance) WNDCLASSEX wndclass ; wndclass.cbsize = sizeof (wndclass) ; // struktuurin koko wndclass.style = CS_HREDRAW CS_VREDRAW ; // ikkunan tyyli wndclass.lpfnwndproc = WndProc ; // ikkunaproseduurin nimi wndclass.cbclsextra = 0 ; // ikkunan luokan sisältä ohjelman... wndclass.cbwndextra = 0 ; //...omaan käyttöön varattua tilaa wndclass.hinstance = hinstance ; // ohjelman ilmentymän kahva wndclass.hicon = LoadIcon (NULL, IDI_APPLICATION) ; // suuri ikoni wndclass.hcursor = LoadCursor (NULL, IDC_ARROW) ; // kursori wndclass.hbrbackground = (HBRUSH) COLOR_WINDOW ; // taustaväri wndclass.lpszmenuname = NULL ; // valikon kahva wndclass.lpszclassname = "OmaLuokka" ; // ikkunan luokan nimi wndclass.hiconsm = LoadIcon (NULL, IDI_APPLICATION) ; // pieni ikoni RegisterClassEx (&wndclass) ; // ikkunan luokan rekisteröinti

Koodiesimerkki WinMain ja sanomasilmukka #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; void MyRegisterClass(HINSTANCE hinstance); void MyCreateWindow(HINSTANCE hinstance, int icmdshow); int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hprevinstance, PSTR szcmdline, int icmdshow) MSG msg ; MyRegisterClass(hInstance); MyCreateWindow(hInstance, icmdshow); // Sanomasilmukka while (GetMessage (&msg, NULL, 0, 0) == TRUE) TranslateMessage (&msg) ; DispatchMessage (&msg) ; return msg.wparam ; // käyttöjärjestelmälle palautuva arvo

Koodiesimerkki Ikkunaolion luominen ja piirto ruudulle void MyCreateWindow(HINSTANCE hinstance, icmdshow) HWND hwnd = CreateWindow ("OmaLuokka", // ikkunan luokan nimi "Päivää maailma!", // ikkunan otsikko WS_OVERLAPPEDWINDOW, // ikkunan tyyli CW_USEDEFAULT, // x-positio aluksi CW_USEDEFAULT, // y-positio aluksi CW_USEDEFAULT, // leveys aluksi CW_USEDEFAULT, // korkeus aluksi NULL, // emoikkunan kahva NULL, // ikkunan valikon kahva hinstance, // ohjelman ilmentymän kahva NULL) ; // luontiparametrit ShowWindow (hwnd, icmdshow) ; // ikkunan piirto

Koodiesimerkki WinMain ja sanomasilmukka #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; void MyRegisterClass(HINSTANCE hinstance); void MyCreateWindow(HINSTANCE hinstance, int icmdshow); int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hprevinstance, PSTR szcmdline, int icmdshow) MSG msg ; MyRegisterClass(hInstance); MyCreateWindow(hInstance, icmdshow); // Sanomasilmukka while (GetMessage (&msg, NULL, 0, 0) == TRUE) TranslateMessage (&msg) ; DispatchMessage (&msg) ; return msg.wparam ; // käyttöjärjestelmälle palautuva arvo

Koodiesimerkki Sanomakäsittelijä LRESULT CALLBACK WndProc (HWND hwnd, UINT imsg, WPARAM wparam, LPARAM lparam) switch (imsg) case WM_DESTROY: PostQuitMessage (0); return 0; // Sanoman oletuskäsittelijä return DefWindowProc (hwnd, imsg, wparam, lparam) ;

Koodiesimerkki WinMain ja sanomasilmukka #include <windows.h> LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; void MyRegisterClass(HINSTANCE hinstance); void MyCreateWindow(HINSTANCE hinstance, int icmdshow); int WINAPI WinMain (HINSTANCE hinstance, HINSTANCE hprevinstance, PSTR szcmdline, int icmdshow) MSG msg ; MyRegisterClass(hInstance); MyCreateWindow(hInstance, icmdshow); // Sanomasilmukka while (GetMessage (&msg, NULL, 0, 0) == TRUE) TranslateMessage (&msg) ; DispatchMessage (&msg) ; return msg.wparam ; // käyttöjärjestelmälle palautuva arvo

Viestin lähettäminen SendMessage(hwnd,msg,wParam,lParam) Palaa vasta kun vastaanottaja on käsitellyt viestin PostMessage(hwnd,msg,wParam,lParam) Palaa heti kun viesti on lähetetty

Sanoman lähettäminen toiselle ohjelmalle 1. Selvitetään ikkunan kahva 2. Selvitetään mitä sanomia ohjelma kuuntelee 3. Lähetetään sanoma SendMessage funktiolla

Sovelluksen käynnistäminen vain kerran int WinMain( ) HWND prev; prev = FindWindow(szWindowClass,NULL); if(prev!= NULL) // Sovellus on jo käynnissä SetForegroundWindow(prev); return 0; else // Käynnistä sovellus.

Pikanäppäimet HACCEL hacceltable; hacceltable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINAMPUI)); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) if (!TranslateAccelerator(msg.hwnd, hacceltable, &msg)) TranslateMessage(&msg); DispatchMessage(&msg);

Resurssitiedosto.rc ///////////////////////////////////////////////////////////////////////////// // // Accelerator // IDC_WINAMPUI ACCELERATORS BEGIN "/", IDM_ABOUT, ASCII, ALT, NOINVERT "?", IDM_ABOUT, ASCII, ALT, NOINVERT "P", ID_ACCELERATOR32773, VIRTKEY, CONTROL, NOINVERT END

Esimerkki winamp WM_COMMAND

Lähteitä Charles Petzold Programming windows http://www.charlespetzold.com/pw5/ How to communicate with Winamp http://forums.winamp.com/showthread.php?th readid=180297