Fejlesztői újdonságok Turóczy Attila Livesoft Kft. MCT, MCP, MCTS
Minimalizáld a változtatást! A fókusz legyen újra az alapokon! Fejlesztői produktivitás Legyen minden gyorsan elsajátítható! UXUX Felhasználói élmény mindenek felett!
Few Changes: Most software that runs on Windows Vista will run on Windows 7 - exceptions will be low level code (AV, Firewall, Imaging, etc). Hardware that runs Windows Vista well will run Windows 7 well. Windows 7 Few Changes: Focus on quality and reliability improvements Deep Changes: New models for security, drivers, deployment, and networking
Memory Reference set, Graphics Disk I/O Registry Reads, Indexer Power DVD Playback, Panel, Timers Speed Faster Boot, Device Ready Responsiveness Start menu, Taskbar Scale 256 cores Több Kevesebb
Microsoft Confidential
Aero Shake (Rázd meg, és láss) Aero Peek (Röntgen az asztalon) Snap (Fogd és dobd a sarokba) Taskbar (Minden egyben) Gadgets (Sok pici izé az asztalon)
Microsoft Confidential
Vista Bridge / Windows API Code Pack Win32 API Natív alkalmazások (C++) Kezelt alkalmazások (.NET-nyelvek) 3.5 (SP1)
Vista Bridge / Windows API Code Pack 3.5 (SP1) Win32 API Natív alkalmazások (C++) Kezelt alkalmazások (.NET-nyelvek)
ApplicationRestartRecoveryManager.RegisterForApplicationRestart( new RestartSettings("", RestartRestrictions.NotOnReboot));
ApplicationRestartRecoveryManager.RegisterForApplicationRestart( new RestartSettings("/recover", RestartRestrictions.NotOnReboot)); RecoveryData data = new RecoveryData(new RecoveryCallback(RecoveryProcedure), null); RecoverySettings settings = new RecoverySettings(data, 0); ApplicationRestartRecoveryManager.RegisterForApplicationRecovery (settings); private int RecoveryProcedure(object state) {... //Fájlba mentés, Serializálás, adatbázisba mentés ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(true); return 0; }
bool isCancel = ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress(); if (!isCancel) { Environment.Exit(2); }
ApplicationRestartRecoveryManager.UnregisterApplicationRestart(); ApplicationRestartRecoveryManager.UnregisterApplicationRecovery();
És mindezt INGYEN!
NetworkCollection networks = NetworkListManager.GetNetworks(NetworkConnectivityLevels.All)
explorerBrowser1.Navigate(ShellFolder.FromParsingName("C:\\Kepek")); Command Link
Microsoft Confidential
FutFut Nem fut Több ablak, fölötte az egér AktívAktív
if (TaskbarManager.IsPlatformSupported) { }
Microsoft Confidential
Icon myIcon = new System.Drawing.Icon("Images\\Globe.ico"); TaskbarManager.Instance.SetOverlayIcon(myIcon, "accessibilityText"); TaskbarManager.Instance.SetOverlayIcon(null, null);
Microsoft Confidential
TaskbarManager.Instance.SetProgressState(TaskbarProgressBarState.Normal); TaskbarManager.Instance.SetProgressValue(trackBar1.Value, 100); Error Normal NoProgress Indeterminate Pause
Microsoft Confidential
TaskbarManager.Instance.TabbedThumbnail.SetThumbnailClip( this.Handle, new Rectangle(pictureBox1.Location, pictureBox1.Size));
Microsoft Confidential WindowInteropHelper window = new WindowInteropHelper(this); IntPtr Handle = window.Handle;
Microsoft Confidential
Icon myIcon = new System.Drawing.Icon("Images\\Work.ico"); ThumbnailToolbarButton toolbarbtn = new ThumbnailToolbarButton(myIcon, "Work"); toolbarbtn.Click +=new EventHandler (toolbarbtn_Click); TaskbarManager.Instance.ThumbnailToolbars.AddButtons(this.Handle, toolbarbtn);
Microsoft Confidential
Célok (főnevek) Feladatok (igék) Ismert kategóriák Egyedi kategóriák Felhasználói feladatok Tálca-feladatok Rögzített kategória
Microsoft Confidential JumpList list = JumpList.CreateJumpList(); //Kategória készitése JumpListCustomCategory jcategory = new JumpListCustomCategory("App. Cat"); list.ClearAllUserTasks(); jcategory.AddJumpListItems(new list.AddCustomCategories(jcategory); //Task keszitese list.AddUserTasks(new JumpListLink(" "Devportal")); list.AddUserTasks(new JumpListSeparator()); list.Refresh();
Microsoft Confidential
TaskDialog tdialog = new TaskDialog(); TaskDialogStandardButtons buttons = TaskDialogStandardButtons.Ok | TaskDialogStandardButtons.No; tdialog.StandardButtons = buttons; tdialog.Icon = TaskDialogStandardIcon.Shield; tdialog.Caption = "Fejléc szövege - Windows 7"; tdialog.InstructionText = "Bevezető szöveg. A dialoguson ezt tehetjük meg..."; tdialog.Text = "FIGYELEM! Ide kerülnek a legfontosabb információk!"; tdialog.DetailsExpanded = true; tdialog.DetailsExpandedLabel = "További információk"; tdialog.DetailsExpandedText = "Az összes információ"; tdialog.ProgressBar = new TaskDialogProgressBar() { Maximum = 100, Minimum = 0, State = TaskDialogProgressBarState.Normal, Value = 40 }; tdialog.Show(); Microsoft Confidential
tdialog.OwnerWindowHandle = this.Handle;
Microsoft Confidential <assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version=" " processorArchitecture="*" publicKeyToken="6595b64144ccf1df" language="*" />
Microsoft Confidential
winlogon Create LUID with full token Create LUID with full token Create LUID with protected token Create LUID with protected token Processz készítsése védett tokennel explorer.exe Processz készítsése védett tokennel explorer.exe
Microsoft Confidential
OS Alkalmazások Nem aláírt alkalmazások Aláírt alkalmazások
Microsoft Confidential
Microsoft Confidential Add -> New Item -> Application Manifest file
Microsoft Confidential
Microsoft Confidential
ez Alig 1-2 sor kód
Előkonfigurált Win XP VHD image Teljeskörű USB támogatás Hogyan? – CPU – Win7 Pro and Ultimate / Enterprise – Virt. engine: Virtual PC Kompatibilitás hiánya többé nem kifogás!
a „Compatible with Windows 7” logo akár 30 Partner Point megszerzését jelenti! (Partner Program átalakulóban) Microsoft Partner Points lista az adott szakterületen/országban elérhető alkalmazásokról Kiemelt megjelenés a Windows 7 Compatibility Centerben saját weben, marketinganyagokban A „Compatible with Windows 7” logó használati joga hozzáférés az alkalmazásra vonatkozó hibabejelentésekhez Windows Error Reporting
Példák
Opcionális: a végleges alkalmazás egy licencelt példányának eljuttatása a Microsofthoz A sikeres tesztelés eredményének elküldése a Microsoftnak Annak elfogadása, hogy a Microsoft kommunikálhasson az alkalmazással kapcsolatban A jogi megállapodások aláírása A logóval kapcsolatos rendelkezéseknek való megfelelés ellenőrzése Az alkalmazás tesztelése a Toolkit használatával A Windows 7 Client Software Logo Toolkit letöltése és telepítése JAVASOLT: Regisztráció az ISV Application Compatibility webhelyen
WPF Turóczy Attila Livesoft Kft. MCT, MCP, MCTS
A WPF-es világban az események használata nagy mértékben megváltozott a tradicionális Windows Forms-os fejlesztéshez képest. RoutedEvents A WPF-ben bevezetésre került a RoutedEvents! A koncepció lényege az, hogy a kontrolok egymásba ágyazhatók, és így egy esemény hierarchia is létrejöhet. A tradicionális esemény kezelés is a WPF része maradt!
Window Grid ToolBar Button Mikor jó ez nekem?
A WPF-ben 3 esemény típus létezik Direct Event Klasszikus.NET-es eseménykezelés. Direktben csak az az eseménykezelő fut le ami létrehozta. Pl.:MouseLeave Bubbling Events Ebben az esetben először az az esemény kezelő fut le, amit kiváltottak, majd a Vizuális fában lépkedve felfelé a többi. Pl: MouseDown Tunneling Event A Bubbling esemény ellentéte. Itt először a vizuális fa legtetején lévő elemen kerül lekezelésre, és így halad lefele. A legutolsó elem az ami kiváltotta az eseményt. A Tunneling események nevei a P PP Preview szóval kezdődnek. A Tunneling események hamarabb fut le mint a Bubbling.
A Grid az egyik leggyakrabban használt elrendezés vezérlő a WPF világban. A Gridben definiálhatunk oszlopokat és sorokat, és ezekbe pozícionálhatjuk kontroljainkat. A Gridnél oszlop (ColumnDefinition) és sor (RowDefinition) definíciókat adhatunk meg. Kitölti a teljes rendelkezésre álló felületet, de a második sor mindig 2x akkora lesz mint az első sor.
Abszolút pozícióba helyezhetjük el a kontroljainkat. (Ahova leraktuk az ott is marad) Semmilyen elrendezés vezérlői logikával nem rendelkezik a Canvas, így ha nagyítjuk az ablak méretét a kontrolok ugyanott maradnak, ahova elhelyeztük őket, és a méretük sem változik. (Canvas.Top, Canvas.Buttom, Canvas.Right, Canvas.Left) Mivel egymást fedhetik a controlok Canvasnál, így a Zindex tulajdonsággal megmondhatjuk, hogy melyik kerül előrébb. Amelyik controlnak magasabb a Zindexe az kerül felülre. Button
StackPanel – Horizontal InkCanvas TextBlock
Microsoft Confidential if (ICanvas.Strokes.Count == 0) return; InkAnalyzer analyzer = new InkAnalyzer(this.Dispatcher); analyzer.AddStrokes(ICanvas.Strokes, 1033); AnalysisStatus status = analyzer.Analyze(); if(status.Successful) { txtResult.Text = analyzer.GetRecognizedString(); }
.NET add-in /SP1 Host Process 3.0 add-in 3.5 add-in 1.1 add-in.NET 1.1 CLR 2.0 – CLR 1.1
.NET add-in /SP1 Host Process 3.0 add-in 3.5 add-in CLR 2.0 – CLR 1.1 CLR 4.0 – CLR 2.0
.NET add-in /SP1 Host Process 3.0 add-in 3.5 add-in CLR 4.0 – CLR 2.0.NET add-in
Multitouch Turóczy Attila Livesoft Kft. MCT, MCP, MCTS
Azok a hardwarek Multitouch-osak, amelyek 2 vagy több pontot tudnak egyszerre érzékelni Elvárások: Felhasználók WOW faktor! Új szkenáriók a felhasználóknak. Természetes UX érzés! Ma már nem csak speciális kérésre szerezhetünk be MT hardwareket. Egyre nagyobb számban szerezhetünk be ilyen eszközöket.
Mely alkalmazásoknál lehet előny a multi-touch? Tartalom nézegető (kép nézegető, könyv olvasó stb) Média alkalmazások Szórakoztató alkalmazások Mobil alkalmazások
El kell döntenünk mennyire támogatjuk az alkalmazásunkban a touch lehetőséget Good – Alapvető támogatás Better – Gesztikuláció támogatás, Touch- friendly felület Best – Touchra optimalizált felület
Általános ajánlások Nagy UI felületek (gombok) Üres területek Kerüljük az átfedéseket Gesztikulációs ajánlások Használjuk a már általános elfogadott gesztikulációkat A gesztikulációknak természetesnek kell lennie
A hardware megkapja a felhasználói inputot Adatok a drivertől Az OS WM_GESTURE üzenetet generáls Üzenet elküldése az alkalmazásnak HWND Az alkalmazás frissíti a UI-t az üzenet alapján
Translate
Zoom és Forgatás
Multi-Touch Controls Multi-Touch API Surface Multi-Touch Controls & API Surface Multi-Touch Controls & API Multi-Touch API Multi-Touch API and Controls
Native Windows SDK.NET 4 WPF Silverlight Silverlight3 Gesztikuláció Manipulation keresztül Touch adatok Manipuláció Inercia.NET 3.5 Multitouch library
public static readonly RoutedEvent TouchDownEvent; public static readonly RoutedEvent TouchEnterEvent; public static readonly RoutedEvent TouchLeaveEvent; public static readonly RoutedEvent TouchMoveEvent; public static readonly RoutedEvent TouchUpEvent; Macerás Munka
private void Image_ManipulationStarting(object sender, ManipulationStartingEventArgs e) { e.ManipulationContainer = LayoutRoot; }
Canvas RenderTranform
var selectedElement = e.Source as FrameworkElement; if (selectedElement != null) { ManipulationDelta deltaManip = e.DeltaManipulation; Matrix matrix = ((MatrixTransform)selectedElement.RenderTransform).Matrix; Point center = new Point(selectedElement.ActualWidth / 2, selectedElement.ActualWidth / 2); center = matrix.Transform(center); matrix.ScaleAt(deltaManip.Scale.X, deltaManip.Scale.Y, center.X, center.Y); matrix.RotateAt(deltaManip.Rotation, center.X, center.Y); matrix.Translate(deltaManip.Translation.X, deltaManip.Translation.Y); selectedElement.RenderTransform = new MatrixTransform(matrix); }
Sensor API Turóczy Attila Livesoft Kft. MCT, MCP, MCTS
1988: Compaq SLT/ : Sony VAIO Mi az ami változott? 400x CPU teljesitmény növekedés 400x CPU teljesitmény növekedés 1700x lemez terület növekedés 1700x lemez terület növekedés 5000x több RAM (Már nem elég mindenre 640K) 5000x több RAM (Már nem elég mindenre 640K) Mi az ami nem változott? GPS interfész: COM port GPS interfész: COM port Egyébb szenzorok integrálása Egyébb szenzorok integrálása
Használat szenzor nélkül (40%) Használat szenzorral (100%) Brightness beállitása a napfényhez mérter
Microsoft Confidential
SensorManager.SensorsChanged += new SensorsChangedEventHandler(SensorManager_SensorsChanged); SensorList alsList = SensorManager.GetSensorsByTypeId (); this.currentSensor = new Guid("b4133ea3-c a6e3-10bfaf50299f"); AmbientLightSensor sensor = SensorManager.GetSensorBySensorId (this.currentSensor); lblSensor.Text = "SensorId = " + sensor.SensorId.ToString(); float current = sensor.CurrentLuminousIntensity.Intensity; prgSensorProgress.Value = Math.Min((int)current, prgSensorProgress.Maximum); sensor.AutoUpdateDataReport = true; sensor.DataReportChanged += new DataReportChangedEventHandler(DataReportChange);
© 2009 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.
© 2008 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.