úvod 17.10.2017 vjj 1
17.10.2017 vjj 2 programování algoritmus program -> operační systém API funkce služby OS GUI UI/UX : program -> uživatel
17.10.2017 vjj 3 programování program -> operační systém API funkce služby OS GUI UI/UX : program -> uživatel
17.10.2017 vjj 4 dva důvody pro GUI appearance fashion design Aero visual navigation convenience undemanding on user's memory skeuomorphic vs. flat
17.10.2017 vjj 6 GUI komunikace s uživatelem ale komu je vaše aplikace vlastně určena?
17.10.2017 vjj 7 Programování pro Windows nové vs. staré konzument vs. profesionál
17.10.2017 vjj 8 Windows programming contemporary vs hereditary simple user vs demanding user
17.10.2017 vjj 9 Windows programming phone/tablet vs desktop
17.10.2017 vjj 10 Windows programming Tiles vs Windows the question of taste, fashion, vogue, usability
UI 17.10.2017 vjj 11
17.10.2017 vjj 12 Windows programming 2012 vs 2000 vs 1990
17.10.2017 vjj 13 Windows programming Metro vs.net vs Win32 API
17.10.2017 vjj 14 Windows programming Metro vs.net + Win32 API.NET WPF XAML
17.10.2017 vjj 15 Windows programming simplified vs unlimited Silverlight LightSwitch Windows Phone Windows 8.x/10 UWP WPF + Win32
17.10.2017 vjj 16 Windows programming simplified vs unlimited restricted strengthen Microsoft GUI security privacy full vulnarable administrator
Windows 10 vs Windows 7 17.10.2017 vjj 17
17.10.2017 vjj 18 hodnocení OS funkčnost, implementace vs UI / UX
17.10.2017 vjj 19 hodnocení OS funkčnost, implementace + UI / UX
17.10.2017 vjj 24 programming Windows 8 ke kořenům UWP
17.10.17 vjj 25 Windows 8 Steven Sinofsky - former President of the Windows and Windows Live Division HTML 5 JavaScript WinRT Runtime (new Windows native runtime)
17.10.17 vjj 26 Windows 8 Steven Sinofsky - former President of the Windows and Windows Live Division HTML 5 JavaScript C# XAML WinRT Runtime (new Windows native runtime)
17.10.17 vjj 27 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)
17.10.17 vjj 28 Windows 8 C# XAML HTML 5 JavaScript C++ WinRT Runtime COM DirectX Win32 API
17.10.17 vjj 29 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" "OneCore" UWP runtime Win32 API aplikace Win32 API funkce (in DLLs, stubs to Kernel functions) Kernel (Native) funkce
17.10.17 vjj 30 Windows runtimes Windows 8.x/10 - a simplistic view Metro UWP "Core" runtime
17.10.2017 vjj 31 Metro apps.net program dll: "OneCore" 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 17.10.2017 vjj 32
17.10.2017 vjj 34 tailored.net name origin: Microsoft's initiative to take over the Internet NGWS Next Generation Windows Services full.net 4.7 (4.6.2, 4.6.1, 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, UWP 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
.NET 17.10.2017 vjj 35
17.10.2017 vjj 37 desktop vs mobile Windows 3.1 Windows 95 Windows XP Vista / Windows 7 Windows Mobile Windows Phone Windows 8 Windows 10
17.10.2017 vjj 73 Windows 8 designed for tablets only depricated Retro UI
17.10.2017 vjj 74 Windows 8.1 designed for tablets only depricated Retro UI
17.10.2017 vjj 75 Windows 9 skipped
17.10.2017 vjj 76 Windows 10 designed for WinPhones - depricated? Retro UI
17.10.2017 vjj 77 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+keyboard support "Core" (taylored) runtime with reduced multitasking
17.10.2017 vjj 81 dilemma SW developer
17.10.2017 vjj 82 platform Android 40 % Windows 36 % ios 13 % OS X 5 % Linux 0.75 % http://gs.statcounter.com/ https://netmarketshare.com/ desktop: Windows 91%
17.10.17 vjj 84 Win32 API system.net runtime OneCore runtime
17.10.2017 vjj 85 Windows OneCore Windows OneCore is a platform for any device phone, tablet, desktop, or IoT. Windows 10 provides a set of API and DDI interfaces that are common to multiple editions of Windows 10. This set of interfaces is called OneCore. With OneCore, you can also be assured that drivers and apps that are created using OneCore interfaces will run on multiple devices.
17.10.17 vjj 86.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 );
17.10.17 vjj 87 pro konkrétní okno většina zpráv pro konkrétní vlákno PostThreadMessage (... PostMessage (NULL,... Win32 API - zprávy pro konkrétní proces WM_QUIT, PostQuitMessage (... GetMessage vrátí FALSE obecné HWND_BROADCAST všem top-level oknům
Uživatel (mouse, keyboard) 17.10.17 vjj 88
17.10.17 vjj 89 Uživatel (mouse, keyboard) hardware interrupt DRIVER
17.10.17 vjj 90 Uživatel (mouse, keyboard) hardware interrupt DRIVER System message queue
17.10.17 vjj 91 Uživatel (mouse, keyboard) Fronta zpráv hardware interrupt DRIVER System message queue RIT Raw Input Thread Fronta zpráv
17.10.2017 vjj 92 fronta zpráv každé forgroundové vlákno (alespoň jednou vytvořilo nové okno) funkce tohoto vlákna musí (!) umět vybírat zprávy z fronty (nikdo jiný to za ní neudělá) a zajistit jejich zpracování (?)
17.10.17 vjj 93 fronta zpráv fronta zpráv poslaných pomocí SendMessage z jiných vláken (GetMessage takové zprávy nevrací, ale rovnou, tj. ještě před návratem, 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
17.10.17 vjj 94 stav fronty zpráv GetQueueStatus (QS_flag) ; QS_SENDMESSAGE QS_POSTMESSAGE QS_QUIT QS_INPUT ( = QS_MOUSE QS_KEY ) QS_PAINT QS_TIMER
17.10.17 vjj 95 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 ;
17.10.17 vjj 96 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER System message queue RIT Raw Input Thread Fronta zpráv
17.10.17 vjj 97 main (... ) { klasická struktura programu // inicializace // načtení vstupních dat // výpočet // výstup }
17.10.17 vjj 98 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:... ; } }
17.10.17 vjj 99 Výběr zpráv z fronty 1/2 while (GetMessage (&Msg, NULL, 0, 0)) { TranslateMessage (&Msg) ; DispatchMessage (&Msg) ; } GetMessage( &Msg, hwnd, MsgFilterMin, MsgFilterMax) ;
17.10.17 vjj 100 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ě
17.10.17 vjj 101 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread Fronta zpráv
17.10.17 vjj 102 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread WindowProc Fronta zpráv
17.10.17 vjj 103 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv
17.10.17 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
17.10.17 vjj 105 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv
17.10.17 vjj 106 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc Fronta zpráv
17.10.17 vjj 107 posílání zpráv 1/2 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) ;
17.10.17 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
17.10.17 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
17.10.17 vjj 110 posílání zpráv 2/2 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
17.10.17 vjj 111 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
17.10.17 vjj 112 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER PostMessage DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc WindowProc Fronta zpráv SendMessage
17.10.17 vjj 113 Uživatel (mouse, keyboard) Fronta zpráv GetMessage hardware interrupt DRIVER PostMessage DispatchMessage System message queue RIT Raw Input Thread WindowProc WindowProc WindowProc Fronta zpráv SendMessage
17.10.2017 vjj 115 Windows messages 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
17.10.17 vjj 116 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 }
17.10.17 vjj 117 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, viz výtah fy 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); }
17.10.17 vjj 118 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 zaslaných většinou stejnému oknu při programování vlastní reakce na zprávu je tudíž nutné znát její kontext a dodržovat určitá pravidla (protokol)
17.10.17 vjj 119 cheating vhodná místa: Systém - v kterékoliv implementaci volané API 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 svoje vlastní "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