úvod 22.10.2015 vjj 1
22.10.2015 vjj 2 programování algoritmus interakce programu a operačního systému UI - interakce programu a uživatele
22.10.2015 vjj 3 programování pro Windows interakce programu a operačního systému UI - interakce programu a uživatele
22.10.2015 vjj 4 dva důvody pro GUI appearance design Aero visual navigation convenience undemanding on user's memory skeuomorphic vs. flat
22.10.2015 vjj 6 GUI komunikace s uživatelem ale komu je vaše aplikace vlastně určena?
22.10.2015 vjj 8 Programování pro Windows nové vs. staré konzument vs. profesionál
22.10.2015 vjj 9 Windows programming phone/tablet vs desktop
22.10.2015 vjj 10 Windows programming Tiles vs Windows the question of taste, fashion, vogue, usability
22.10.2015 vjj 11 Windows programming 2012 vs 2000 vs 1990
22.10.2015 vjj 12 Windows programming Metro vs.net vs Win32 API
22.10.2015 vjj 13 Windows programming Metro vs.net + Win32 API.NET WPF XAML
22.10.2015 vjj 14 Windows programming simplified vs unlimited LightSwitch Windows Phone Windows 8.x/10 WPF + Win32
22.10.2015 vjj 15 Windows programming simplified vs unlimited restricted strengthen GUI security full vulnarable
Windows 10 vs Windows 7 22.10.2015 vjj 16
22.10.2015 vjj 17 hodnocení OS funkčnost, implementace vs UI / UX
UI 22.10.2015 vjj 18
22.10.2015 vjj 19 hodnocení OS funkčnost, implementace + UI / UX
Metro vs Win32 API 22.10.2015 vjj 20
22.10.2015 vjj 22 Steve vs. Soma Somaseghar: bez Win32 API to NEJDE příklad (WPF): Kruhové okno příklad (WPF + API CodePack): Aero Blur Sinofsky: nechci žádné Win32 API, takže zrušíme Aero jakákoliv okna, nejen kruhová a mimo to strukturovanou navigaci (kaskádní konfigurovatelné Start Menu) vizuální navigaci!!!!! (a rovnou celé oddělení User Experience, protože protestovali) modifikovatelný OS, volitelné UI (složité) konfigurování příklad: Metro
Windows innards 22.10.2015 vjj 23
22.10.15 vjj 24 Windows 8 Steven Sinofsky - former President of the Windows and Windows Live Division HTML 5 JavaScript WinRT Runtime (new Windows native runtime)
22.10.15 vjj 25 Windows 8 Steven Sinofsky - former President of the Windows and Windows Live Division HTML 5 JavaScript C# XAML WinRT Runtime (new Windows native runtime)
22.10.15 vjj 26 Windows 8 Steven Sinofsky - former President of the Windows and Windows Live Division HTML 5 JavaScript C# XAML C++ COM DirectX WinRT Runtime (new Windows native runtime)
22.10.15 vjj 27 Windows 8 C# XAML HTML 5 JavaScript C++ WinRT Runtime COM DirectX Win32 API
22.10.15 vjj 28 Windows runtimes C, C++, ASM Visual Basic MFC Borland Pascal for Windows -> Delphi C# Visual Basic.NET F# VS visual editor Metro DLLs: VB runtime MFC (AFX) runtime Pascal/ Delphi runtime CLR = Common Language Runtime LightSwitch runtime "WinRT" "Core" runtime Win32 API aplikace Win32 API funkce Kernel (Native) funkce
22.10.15 vjj 29 Windows runtimes Windows 8.x/10 - a simplistic view Metro "Core" runtime
22.10.2015 vjj 30 Metro apps.net program dll: "Core" runtime hub Win32 API application w/fibres dll: CLR, WPF hub Win32 API application w/threads Subsystem DLLs: Kernel32.dll, User32.dll, GDI32.dll, Advapi32.dll, OLE32.dll SysCall Ntdll.dll Ntoskrnl.exe System service dispatcher lib. implementation Win32k.sys Windowing and graphics Win32, User32, GDI32 Executive Kernel lib. implementation Drivers Hal.dll Hardware Abstraction Layer (HAL) Graphic device drivers
.NET 22.10.2015 vjj 31
22.10.2015 vjj 33 tailored.net name origin: Microsoft's initiative to take over the Internet NGWS Next Generation Windows Services full.net 4.6 (4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0) WPF, XAML tailored Silverlight (.NET tailored for web) Scott Barnes (former.net Product Manager, disliked by Sinofsky): disaster that gave birth to the Windows 8?!?! Windows Phone (.NET tailored for smartphone) - smartphone market 30% -> 2% WinRT (.NET tailored for tablet) -> "Core" WinRT developers: that's not a.net at all (another runtime - apps are not "managed", they are Win32 API / COM) WinRT developers out of record: modified/rewritten Silverlight Scott Barnes: WPF and Silverlight unification?!?! purpose: HTML 5 a IE inconsistent changes in architecture throughout the entire process of development smaller currently than the Windows Phone one the enterprise level stuff is not covered no Console support, no ASP.NET integration, no Entity Framework support
.NET 22.10.2015 vjj 34
22.10.2015 vjj 36 desktop vs mobile Windows 3.1 Windows 95 Windows XP Vista / Windows 7 Windows Mobile Windows Phone Windows 8 Windows 10
22.10.2015 vjj 72 Windows 8 designed for tablets only depricated Retro UI
22.10.2015 vjj 73 Windows 8.1 designed for tablets only depricated Retro UI
22.10.2015 vjj 74 Windows 9 skipped
22.10.2015 vjj 75 Windows 10 designed for WinPhones? Retro UI
22.10.2015 vjj 76 big leap or hollow promises Windows 10 "our greatest enterprise platform ever" "it was such a substantial leap, that the company decided it would be best to skip over Windows 9" Terry Myerson, Microsoft's head of operating systems - on a press event in San Francisco, September 30, 2014 deteriorated retro 2D flat appearance - reduction in visual navigation poor mouse support "Core" (taylored) runtime with reduced multitasking
22.10.2015 vjj 79 Windowed Mobile Apps with the retro "Modern" style
22.10.2015 vjj 80 dilemma SW developer
22.10.2015 vjj 81 platform Windows 7 29 % Android 27 % ios 10 % Windows 8.1 7 % OS X 5.5 % Windows XP 5 % Windows 10 4.5 %
Win32 API 22.10.15 vjj 82
22.10.15 vjj 83.NET P/Invoke P/Invoke = Platform Invocation Services using System.Runtime.InteropServices; [DllImport("dwmapi.dll", PreserveSig = false)] public static extern void DwmEnableBlurBehindWindow ( IntPtr hwnd, DWM_BLURBEHIND pblurbehind );
22.10.15 vjj 84 pro konkrétní okno většina zpráv Win32 API - zprávy obecné WM_QUIT, PostQuitMessage (... GetMessage vrátí FALSE HWND_BROADCAST všem top-level oknům PostThreadMessage (... PostMessage (NULL,...
Uživatel (mouse, keyboard) 22.10.15 vjj 85
22.10.15 vjj 86 Uživatel (mouse, keyboard) hardware interrupt DRIVER
22.10.15 vjj 87 Uživatel (mouse, keyboard) hardware interrupt DRIVER System message queue
22.10.15 vjj 88 Uživatel (mouse, keyboard) Fronta zpráv hardware interrupt DRIVER System message queue RIT Raw Input Thread Fronta zpráv
22.10.15 vjj 89 fronta zpráv fronta zpráv poslaných pomocí SendMessage z jiných vláken (GetMessage takové zprávy nevrací, ale rovnou sama volá příslušné Windows procedury) fronta zpráv poslaných pomocí PostMessage příznak WM_QUIT fronta HW zpráv (od uživatele) WM_MOUSEMOVE, WM_LBUTTONDOWN,... max 1 kumulativní zpráva WM_PAINT WM_TIMER
22.10.15 vjj 90 stav fronty zpráv GetQueueStatus (QS_flag) ; QS_SENDMESSAGE QS_POSTMESSAGE QS_QUIT QS_INPUT ( = QS_MOUSE QS_KEY ) QS_PAINT QS_TIMER
22.10.15 vjj 91 zprávy ve frontě typedef struct { HWND hwnd ; // identifikace cílového okna UINT message ; // vlastní zpráva - celočíselná konstanta WPARAM wparam ; // význam parametru závisí na typu zprávy LPARAM lparam ; // dtto DWORD time ; // čas (milisek.) zařazení zprávy do fronty POINT pt ; // poloha (souřadnice) kursoru } MSG ;
22.10.15 vjj 92 Uživatel (mouse, keyboard) Fronta zpráv hardware interrupt DRIVER System message queue RIT Raw Input Thread Fronta zpráv
22.10.15 vjj 93 main (... ) { klasická struktura programu // inicializace // načtení vstupních dat // výpočet // výstup }
22.10.15 vjj 94 struktura Win32 API programu WinMain (... ) {... while (GetMessage ( &Msg,... ) ) DispatchMessage (&Msg,... ) ; } mywindowproc ( msg,... ) { switch (msg) { case WM_CREATE:... ; case WM_PAINT:... ; case WM_COMMAND:... ; case WM_CLOSE:... ; case WM_DESTROY:... ; } }
22.10.15 vjj 95 Výběr zpráv z fronty 1/2 while (GetMessage (&Msg, NULL, 0, 0)) { TranslateMessage (&Msg) ; DispatchMessage (&Msg) ; } GetMessage( &Msg, hwnd, MsgFilterMin, MsgFilterMax) ;
22.10.15 vjj 96 Výběr zpráv z fronty 2/2 PeekMessage (&Msg, hwnd, MsgFilterMin, MsgFilterMax, PM_...) ; PM_REMOVE PM_NOREMOVE (implementace GetMessage) PM_NOYIELD jen kvůli kompatibilitě
22.10.15 vjj 97 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER System message queue RIT Raw Input Thread Fronta zpráv
22.10.15 vjj 98 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread WindowProc Fronta zpráv
22.10.15 vjj 99 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv
22.10.15 vjj 100 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv
22.10.15 vjj 101 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv
22.10.15 vjj 102 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv
22.10.15 vjj 103 posílání zpráv asynchronní zpracování - zařazení zprávy do fronty bool PostMessage (HWND hwindow, UINT Message, WPARAM wparam, LPARAM lparam) ; hwindow = HWND_BROADCAST to all top-level windows (včetně invisible, disabled, pop-up) hwindow = 0 PostThreadMessage vlastnímu vláknu bool PostThreadMessage (DWORD idthread, UINT Message, WPARAM wparam, LPARAM lparam) ;
22.10.15 vjj 104 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv
22.10.15 vjj 105 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER PostMessage DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv
22.10.15 vjj 106 synchronní zpracování zprávy požadavek na synchronní zpracování zprávy - volání podprogramu LRESULT SendMessage (HWND hwindow, MSG Message, WPARAM wparam, LPARAM lparam) ; vlastní okno: cizí okno: přímé volání příslušné Windows procedury wait přidání zprávy na "začátek" fronty
22.10.15 vjj 107 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER PostMessage DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv SendMessage
22.10.15 vjj 108 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER PostMessage DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv SendMessage
22.10.15 vjj 109 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER PostMessage DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv SendMessage
22.10.15 vjj 110 struktura programu WinMain (... ) {... while (GetMessage ( &Msg,... ) ) DispatchMessage (&Msg,... ) ; } mywindowproc1 ( msg,... ) { zpracování zpráv pro první typ mých oken } mywindowproc2 ( msg,... ) { zpracování zpráv pro druhý typ mých oken }
22.10.15 vjj 111 Zpracování zpráv switch (msg) { case WM_CREATE : inicializace instance okna; return 0 ; case WM_PAINT : BeginPaint (...) ;... EndPaint (...) ; return 0 ; case WM_CLOSE : case WM_DESTROY : ověření úmyslu zavřít okno (skončit aplikaci) (programátor nevěří, že uživatel chce to, co si vybral - Sirius cybernetics) úklid; DestroyWindow (...) ; return 0 ; destrukce instance okna; pokud má skončit celá aplikace, tak i PostQuitMessage (0) ; return 0 ; default : return DefWindowProc (hwin, msg, wparam, lparam); }
22.10.15 vjj 112 DefWindowProc standardní zpracování většiny zpráv mnoho běžných událostí je zpracováváno postupně pomocí celé posloupnosti nových zpráv při programování vlastní reakce na zprávu je tudíž nutné znát její kontext a dodržovat určitá pravidla (protokol)
22.10.15 vjj 113 cheating vhodná místa: Systém - v kterékoliv implementaci volané funkce, např. PostMessage, SendMessage,... při výběru zprávy z fronty, za GetMessage, PeekMessage tj. před distribucí zprávy (DispatchMessage) před a po zavolání DefWindowProc po návratu z WinProc, tj. za DispatchMessage systém s možností provádět takové "zásahy" někdy počítá a pokud mu tuto možnost vezmete (např. díky neznalosti příslušného protokolu), může se to projevit např. nepředvídatelným chováním aplikace