úvod
22.10.2015
vjj
1
programování • algoritmus • interakce programu a operačního systému • UI - interakce programu a uživatele
22.10.2015
vjj
2
programování pro Windows • • interakce programu a operačního systému • UI - interakce programu a uživatele
22.10.2015
vjj
3
dva důvody pro GUI • appearance design Aero
• visual navigation convenience undemanding on user's memory skeuomorphic vs. flat
22.10.2015
vjj
4
GUI komunikace s uživatelem ale komu je vaše aplikace vlastně určena?
22.10.2015
vjj
6
Programování pro Windows nové vs. staré konzument
22.10.2015
vs.
vjj
profesionál
8
Windows programming phone/tablet vs desktop
22.10.2015
vjj
9
Windows programming Tiles vs Windows the question of taste, fashion, vogue, usability
22.10.2015
vjj
10
Windows programming 2012 vs 2000 vs 1990
22.10.2015
vjj
11
Windows programming Metro vs .NET vs Win32 API
22.10.2015
vjj
12
Windows programming Metro vs .NET + Win32 API .NET WPF XAML
22.10.2015
vjj
13
Windows programming simplified vs unlimited LightSwitch
WPF + Win32
Windows Phone Windows 8.x/10
22.10.2015
vjj
14
Windows programming simplified vs unlimited GUI restricted
full security
strengthen 22.10.2015
vulnarable vjj
15
Windows 10
22.10.2015
vs
vjj
Windows 7
16
hodnocení OS funkčnost, implementace
vs UI / UX
22.10.2015
vjj
17
UI
22.10.2015
vjj
18
hodnocení OS funkčnost, implementace
+ UI / UX
22.10.2015
vjj
19
Metro
22.10.2015
vs
Win32 API
vjj
20
Steve vs. Soma •
Somaseghar: bez Win32 API to NEJDE • •
•
příklad (WPF + API CodePack): Aero Blur
Sinofsky:
• •
•
příklad (WPF): Kruhové okno
nechci žádné Win32 API, takže zrušíme
Aero
jakákoliv okna, nejen kruhová
a mimo to
• •
strukturovanou navigaci (kaskádní konfigurovatelné Start Menu)
• •
modifikovatelný OS, volitelné UI
22.10.2015
vizuální navigaci !!!!! (a rovnou celé oddělení User Experience, protože protestovali) (složité) konfigurování • příklad: Metro vjj
22
Windows innards
22.10.2015
vjj
23
•
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
24
•
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
25
•
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
26
Windows 8 C# XAML
HTML 5 JavaScript
C++
WinRT Runtime
COM DirectX Win32 API
22.10.15
vjj
27
Windows runtimes C, C++, ASM
Visual Basic
MFC
Borland Pascal for Windows -> Delphi
DLLs:
VB runtime
MFC (AFX) runtime
Pascal/ Delphi runtime
C#
Visual Basic .NET
F#
CLR = Common Language Runtime
VS visual editor
Metro
LightSwitch runtime
"WinRT" "Core" runtime
Win32 API aplikace
Win32 API funkce Kernel (Native) funkce 22.10.15
vjj
28
•
Windows runtimes Windows 8.x/10 - a simplistic view
Metro
"Core" runtime
22.10.15
vjj
29
Metro apps
.NET program
dll: "Core" runtime
dll: CLR, WPF
hub Win32 API application w/fibres
hub Win32 API application w/threads
Subsystem DLLs:
Kernel32.dll,
User32.dll,
GDI32.dll,
Advapi32.dll,
OLE32.dll
Ntdll.dll
SysCall Ntoskrnl.exe
Win32k.sys Windowing and graphics
System service dispatcher Win32, User32, GDI32
lib. implementation Executive Drivers
22.10.2015
lib. implementation
Kernel Hal.dll Hardware Abstraction Layer (HAL) vjj
Graphic device drivers
30
.NET
22.10.2015
vjj
31
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)
•
Windows Phone (.NET tailored for smartphone) - smartphone market 30% -> 2% WinRT (.NET tailored for tablet) -> "Core"
• • • • • •
22.10.2015
Scott Barnes (former .NET Product Manager, disliked by Sinofsky): disaster that gave birth to the Windows 8 ?!?!
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…
vjj
33
.NET
22.10.2015
vjj
34
desktop
vs
mobile
•
Windows 3.1
•
•
Windows 95
•
•
Windows XP
•
Windows Mobile
•
Vista / Windows 7
•
Windows Phone
•
•
Windows 8
•
•
Windows 10
22.10.2015
vjj
36
Windows 8 designed for tablets only depricated Retro UI
22.10.2015
vjj
72
Windows 8.1 designed for tablets only depricated Retro UI
22.10.2015
vjj
73
Windows 9 skipped
22.10.2015
vjj
74
Windows 10 designed for WinPhones ? Retro UI
22.10.2015
vjj
75
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
76
Windowed Mobile Apps with the retro "Modern" style
22.10.2015
vjj
79
dilemma SW developer
22.10.2015
vjj
80
platform • Windows 7 • Android • iOS • Windows 8.1 • OS X • Windows XP • Windows 10
22.10.2015
29 % 27 % 10 % 7% 5.5 %
5% 4.5 %
vjj
81
Win32 API
22.10.15
vjj
82
.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
83
Win32 API - zprávy • pro konkrétní okno •
většina zpráv
• obecné
22.10.15
•
WM_QUIT , PostQuitMessage ( ... GetMessage vrátí FALSE
•
HWND_BROADCAST všem top-level oknům
•
PostThreadMessage ( ... PostMessage (NULL, ...
vjj
84
Uživatel (mouse, keyboard)
22.10.15
vjj
85
Uživatel (mouse, keyboard) hardware interrupt DRIVER
22.10.15
vjj
86
Uživatel (mouse, keyboard) hardware interrupt DRIVER
System message queue
22.10.15
vjj
87
Uživatel (mouse, keyboard)
Fronta zpráv
hardware interrupt DRIVER
System message queue RIT Raw Input Thread
Fronta zpráv 22.10.15
vjj
88
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
89
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
90
zprávy ve frontě • •
typedef struct { HWND
hwnd ; // identifikace cílového
okna UINT
message ;
WPARAM wParam ; LPARAM lParam ;
// vlastní zpráva - celočíselná konstanta // význam parametru závisí na typu zprávy // dtto
• DWORD time ; // čas (milisek.) zařazení zprávy do fronty POINT pt ; // poloha (souřadnice) kursoru } MSG ; 22.10.15
vjj
91
Uživatel (mouse, keyboard)
Fronta zpráv
hardware interrupt DRIVER
System message queue RIT Raw Input Thread
Fronta zpráv 22.10.15
vjj
92
klasická struktura programu •
• 22.10.15
main ( ... ) { •
// inicializace
•
// načtení vstupních dat
•
// výpočet
•
// výstup
} vjj
93
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
... ... ... ... ...
; ; ; ; ;
}
} 94
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
95
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
96
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
97
Uživatel (mouse, keyboard)
Fronta zpráv
hardware interrupt
GetMessage
DispatchMessage
DRIVER
System message queue WindowProc
RIT Raw Input Thread
Fronta zpráv 22.10.15
vjj
98
Uživatel (mouse, keyboard)
Fronta zpráv
hardware interrupt
GetMessage
DispatchMessage
DRIVER
System message queue RIT Raw Input Thread
WindowProc
WindowProc
Fronta zpráv 22.10.15
vjj
99
Uživatel (mouse, keyboard)
Fronta zpráv
hardware interrupt
GetMessage
DispatchMessage
DRIVER
System message queue RIT Raw Input Thread
WindowProc
WindowProc
Fronta zpráv 22.10.15
vjj
100
Uživatel (mouse, keyboard)
Fronta zpráv
hardware interrupt
GetMessage
DispatchMessage
DRIVER
System message queue RIT Raw Input Thread
WindowProc
WindowProc
Fronta zpráv 22.10.15
vjj
101
Uživatel (mouse, keyboard)
Fronta zpráv
hardware interrupt
GetMessage
DispatchMessage
DRIVER
System message queue RIT Raw Input Thread
WindowProc
WindowProc
Fronta zpráv 22.10.15
vjj
102
posílání zpráv •
asynchronní zpracování - zařazení zprávy do fronty
•
bool PostMessage (HWND hWindow, UINT Message, WPARAM wParam, LPARAM lParam) ;
• •
•
22.10.15
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) ; vjj
103
Uživatel (mouse, keyboard)
Fronta zpráv
hardware interrupt
GetMessage
DispatchMessage
DRIVER
System message queue RIT Raw Input Thread
WindowProc
WindowProc
Fronta zpráv 22.10.15
vjj
104
Uživatel (mouse, keyboard) hardware interrupt DRIVER
Fronta zpráv
GetMessage
PostMessage
DispatchMessage
WindowProc
WindowProc
System message queue RIT Raw Input Thread
Fronta zpráv 22.10.15
vjj
105
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) ;
22.10.15
•
vlastní okno: přímé volání příslušné Windows procedury
•
cizí okno:
wait přidání zprávy na "začátek" fronty vjj
106
Uživatel (mouse, keyboard)
Fronta zpráv
GetMessage
hardware interrupt
PostMessage
DispatchMessage
WindowProc
WindowProc
DRIVER
System message queue RIT Raw Input Thread
SendMessage Fronta zpráv 22.10.15
vjj
107
Uživatel (mouse, keyboard)
Fronta zpráv
GetMessage
hardware interrupt
PostMessage
DispatchMessage
WindowProc
WindowProc
DRIVER
System message queue RIT Raw Input Thread
SendMessage Fronta zpráv 22.10.15
vjj
108
Uživatel (mouse, keyboard)
Fronta zpráv
GetMessage
hardware interrupt
PostMessage
DispatchMessage
WindowProc
WindowProc
DRIVER
System message queue RIT Raw Input Thread
SendMessage Fronta zpráv 22.10.15
vjj
109
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
110
Zpracování zpráv switch (msg)
{
case WM_CREATE :
inicializace instance okna; return 0 ;
case WM_PAINT :
BeginPaint (...) ; ... EndPaint (...) ; return 0 ;
case WM_CLOSE :
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 ;
case WM_DESTROY :
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
} 111
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
112
cheating •
vhodná místa:
• •
• •
•
22.10.15
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 vjj
113