Image Carousel in Silverlight

March 9th, 2010

Ein großes Hobby von mir sind Steuerelemente für Silverlight. Es gibt extrem viele tolle Beispiele an Tricks und Effekten in Silverlight. Doch leider sind diese sehr oft nur schwer übertragbar, da es sich dabei um Spaghetti-Code handelt oder hart-verdrahtete Konstanten verwendet werden.

Im heutige Beispiel erstelle ich ein Bilderkaroussel das man dynamisch anpassen kann, so wie man es von “echten” Steuerelementen gewohnt ist.

image

In Blend hat kann man nun beliebige Bilder einfügen, anpassen und sortieren.

image

Der Objektbaum wird dabei im Objects&Timeline-Bereich ordentlich dargestellt.

Der gesamte Sourcecode:

using System;
using System.ComponentModel;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace TheOliver.Controls
{
    public class ImageSpindle : Panel
    {
        Point _mousePoint;
        double _height;
        double _width;
        bool _isMouseOver;

        public ImageSpindle()
        {
            this.Loaded += (s, e) =>
                {
                    if (DesignerProperties.GetIsInDesignMode(this))
                    {
                        return;
                    }

                    this.MouseMove += (s1, e1) =>
                        {
                            _mousePoint = e1.GetPosition(this);
                        }; 

                    CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
                };

            this.MouseEnter += (s, e) =>
                {
                    _isMouseOver = true;
                };

            this.MouseLeave += (s, e) =>
                {
                    _isMouseOver = false;
                };
        }

        protected override Size MeasureOverride(Size availableSize)
        {
            _height = availableSize.Height;
            _width = availableSize.Width;

            var images = this.Children.OfType<Image>();
            int imageCount = images.Count();
            if (imageCount > 0)
            {
                double step = 360.0 / imageCount;
                double currentStep = 0;
                foreach (var image in images)
                {
                    UpdateImage(image, currentStep);
                    currentStep += step;
                }
            }
            return base.MeasureOverride(availableSize);
        }

        private Image UpdateImage(Image image, double step)
        {
            image.Height = ImageHeight;
            image.Width = ImageWidth;
            image.Margin = new Thickness(
                (_width - ImageWidth) / 2, (_height - ImageHeight) / 2,
                (_width - ImageWidth) / 2, (_height - ImageHeight) / 2);
            image.RenderTransformOrigin = new Point(0.5, 0.5);
            image.Stretch = ImageStretch;

            PlaneProjection pp = new PlaneProjection();
            pp.CenterOfRotationZ = SpindleCenterOfRotation;
            pp.RotationY = step;
            image.Projection = pp;

            return image;
        }

        void CompositionTarget_Rendering(object sender, EventArgs e)
        {
            if (StopWhenMouseLeft)
            {
                if (!_isMouseOver)
                {
                    return;
                }
            }

            if (double.IsNaN(_width) || _width == 0)
            {
                return;
            }

            foreach (var image in this.Children.OfType<Image>())
            {
                PlaneProjection pp = image.Projection as PlaneProjection;
                if (pp != null)
                {
                    pp.RotationY += ((_mousePoint.X - (_width / 2)) / _width) * 10;
                }
                image.Opacity = (_mousePoint.Y / _height) * 0.5 + 0.5;
            }
        }

        #region Properties

        public Stretch ImageStretch
        {
            get { return (Stretch)GetValue(ImageStretchProperty); }
            set { SetValue(ImageStretchProperty, value); }
        }

        public static readonly DependencyProperty ImageStretchProperty =
            DependencyProperty.Register(
                "ImageStretch",
                typeof(Stretch),
                typeof(ImageSpindle),
                new PropertyMetadata(Stretch.Uniform, OnValueChanged));

        public double ImageWidth
        {
            get { return (double)GetValue(ImageWidthProperty); }
            set { SetValue(ImageWidthProperty, value); }
        }

        public static readonly DependencyProperty ImageWidthProperty =
            DependencyProperty.Register(
                "ImageWidth",
                typeof(double),
                typeof(ImageSpindle),
                new PropertyMetadata(160.0, OnValueChanged));

        public double ImageHeight
        {
            get { return (double)GetValue(ImageHeightProperty); }
            set { SetValue(ImageHeightProperty, value); }
        }

        public static readonly DependencyProperty ImageHeightProperty =
            DependencyProperty.Register(
                "ImageHeight",
                typeof(double),
                typeof(ImageSpindle),
                new PropertyMetadata(120.0, OnValueChanged));

        public double SpindleCenterOfRotation
        {
            get { return (double)GetValue(SpindleCenterOfRotationProperty); }
            set { SetValue(SpindleCenterOfRotationProperty, value); }
        }

        public static readonly DependencyProperty SpindleCenterOfRotationProperty =
            DependencyProperty.Register(
                "SpindleCenterOfRotation",
                typeof(double),
                typeof(ImageSpindle),
                new PropertyMetadata(-160.0, OnValueChanged));

        private static void OnValueChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            ImageSpindle spindle = sender as ImageSpindle;
            spindle.InvalidateMeasure();
        }

        public bool StopWhenMouseLeft
        {
            get { return (bool)GetValue(StopWhenMouseLeftProperty); }
            set { SetValue(StopWhenMouseLeftProperty, value); }
        }

        public static readonly DependencyProperty StopWhenMouseLeftProperty =
            DependencyProperty.Register(
                "StopWhenMouseLeft",
                typeof(bool),
                typeof(ImageSpindle),
                new PropertyMetadata(true));

        #endregion

    }
}

Dieses und weitere Controls befinden sich in meiner Control-Bibliothek unter http://theolivercontrols.codeplex.com/ Viel Spaß

The-Oliver Developer, Expression, Info, Silverlight

Apps & Games für Windows Phone 7 Series: .NET, Silverlight, XNA

March 5th, 2010

Aus dem offiziellen Deutschen Windows Phone 7 Series Blog –>

Es sind nur noch wenige Tage bis zur MIX10, der Konferenz, auf der wir über die offizielle Entwicklerstory zu WP7S sprechen werden. Doch die Spekulationen kochen inzwischen immer höher, und ich erlebe das hier z.Zt. täglich auf der CeBIT – ca. 50% der Fragen drehen sich darum, wie & womit für die neuen Phones entwickelt werden kann (und das Interesse, das zu tun, ist riesig, was mich sehr freut).

Das Produktteam hat deshalb, um die Sache etwas zu beruhigen und die Erwartungen für Las Vegas richtig zu setzen, eine Art offizielle Aussage über Charlie Kindels Blog veröffentlicht. Hier ist die Essenz daraus: Softwareentwicklung für Windows Phone 7 Series beruht auf

  • SL.NET
  • Silverlight (!)
  • XNA (!)
  • maßgeschneiderten Tools dafür von Microsoft
  • Web-2.0-Mechanismen

Die Katze ist damit aus dem Sack: Silverlight als neue Oberflächentechnologie wird es auf einfache Art und Weise möglich machen, Apps zu bauen, die in Sachen User Experience dem restlichen WP7S-UI in nichts nachstehen. XNA wird für fantastische, auf einem Windows Phone bisher nicht dagewesene Games sorgen. Ich denke, das ist eine großartige Botschaft für alle, die von uns einen mutigen Neuanfang erwartet haben – wir haben ihn gemacht, in Entwicklerdingen genauso wie bei der Konzeption der Phones generell.

phones[1]

Mehr Details auf der MIX – und ab dann online und auf diversen Veranstaltungen auch hierzulande.

P.S.: Und übrigens – heute existierende Anwendungen werden auf WP7S nicht lauffähig sein, das lassen die fundamentalen Neuerungen einfach nicht zu. Es heißt also Ärmel hochkrempeln und portieren oder ganz neu starten – die neuen Möglichkeiten legen es nahe, und die Tools werden es einfach machen!

The-Oliver Deutsch, Windows Phone 7 Series

Live von der CeBIT

March 4th, 2010

Die CeBIT läuft gerade und wir sind mit dabei. Auf dem Microsoft Stand bildet das MSDN/TechNet-Kino quasi das Herz von Microsoft Deutschland Smile

Im Entwicklerkino herscht unglaublich viel Betrieb. Frau Merkel war auch schon da. Wirklich.

Wer es nicht glauben will, guckt bitte selbst … und zwar hier.

The-Oliver Deutsch, Developer

TechTalk März 2010: SharePoint 2010 – und warum Sie das als Software-Entwickler interessieren sollte

February 26th, 2010

Nicht erst mit seiner neuesten Version hat sich der Office SharePoint Server im Webbereich als äußerst flexibles Allround-Werkzeug etabliert und ist entsprechend weit verbreitet. Trotzdem pflegen nicht wenige Entwickler ihre Vorurteile gegenüber der Anwendung, etwa: SharePoint ist eh nur ein System zum Verwalten von Listen!

Dass die Realität weit von dem entfernt ist, zeigt Ihnen MSDN im Rahmen der kostenlosen TechTalk-Roadshow,  die im März wieder in fünf Städten Station macht. MSDN-Experte Tom Wendel gibt dabei  einen umfassenden Einblick in den Funktionsumfang des neuen SharePoint 2010 und zeigt aus Entwicklersicht, wo überall Sie bei der Anwendung selbst  Hand anlegen können, um dem SharePoint zu vollem Potential zu verhelfen.

Daten/Locations:

  • 22. März 2010, Köln
  • 23. März 2010, Hamburg
  • 24. März 2010, Karlsruhe
  • 29. März 2010, Berlin
  • 30. März 2010, München

Details und Anmeldung unter: http://www.microsoft.com/germany/msdn/techtalk/aktuell2/default.mspx

The-Oliver Deutsch, Developer

Twitter-Exodus. Oder warum folgt mir 1apo?

February 16th, 2010

Liebe Twitter-Spammer,

image

wer 2422 Tweets schreibt und 1751 Leuten folgt, mir “followed” und glaubt, das ich ihm auch folge, der hat sich doch nicht mehr alle in seinem Apothekerkästchen, oder?

2422 Tweets

Nehmen wir mal an, man benötigt pro Tweet mit Tippen und Senden 1 Minute. Dann hat man ungefähr 40 Stunden seinen Lebens mit Nachrichten wie “Optimisten haben seltener Schnupfen” vergeudet. Macht knapp zwei Tage (4 Stunden schlaf pro Tag mal abgezogen) Lebenszeit.

1479 Followers

Jetzt frag ich mich nur, welche 1479 Leute sich für so jemanden interessieren? Jemand der sie mit wichtigen Informationen überschüttet wie: “Bauchfett ist ungesund – aber warum?”. Okay wahrscheinlich haben es 1479 Leute noch nicht mitgekriegt, aber ja “Fett ist ungesund”. Warum sollte ich sonst ständig auf der Trettmühle rumrennen oder versuche auf einem Brett den Berg runter zu rutschen (oft sogar erfolgreich)? Ja Fett ist ein guter Grund dies zu tun-

Following 1751 People

Wer 1751 Leuten folgt, also wirklich folgt, der muss doch im Schnitt mindestens 10 Sekunden pro Follower pro Tag und dessen Nachrichten aufbringen, oder? Nur mal ganz grob geschätzt. Macht also 1751* 10 Sekunden = ungefähr 292 Minuten pro Tag. Sorry, wer so lange vor dem Computer sitzt, nur um zu Twittern, der kann doch gar nichts zu sagen haben und verdient folgendes:

image

Warum folgst du mir 1apo?

Habe ich ausversehen einmal Apotheke getwittert und du hast danach gesucht? Interessierst Du dich für Oliver, den Evangelisten, der gerne und viel über Technologien spricht? Interessierst Du dich für Oliver den Menschen, der versucht auf einem Brett den Berg runterzurutschen? Wenn ja, lass uns mal ein Bier trinken gehen und nicht über Twitter kommunizieren.

Meine Meinung
TheOliver

The-Oliver Smalltalk

Windows Phone 7 Series

February 16th, 2010

Wunschzettel für Weihnachten kann man nicht früh genug schreiben.

The-Oliver Info

Windows Phone 7 Series

February 16th, 2010

Wunschzettel für Weihnachten kann man nicht früh genug schreiben.

The-Oliver Windows Phone 7 Series

Development and Design: Now on Windows Phone 7

February 15th, 2010

Jetzt wird es richtig spannend.

“Conferences just don’t get any better than this-announcing Windows Phone 7

Join us at MIX10 and be among the first to learn how to build applications and games for Windows Phone 7. We’ll introduce you to the development platform, show you how to work with the Windows Phone 7 development tools, and give you a tour of the Windows Phone Marketplace. All MIX10 attendees will receive access to the Windows Phone 7 development tools and have access to a dedicated track on the Windows Phone 7 platform that runs throughout the event.

MIX10 attendees will get exclusive free developer support for the Windows Phone 7 development tools. Don’t miss this unique opportunity to be among the first to learn about Windows Phone 7.

REGISTER NOW FOR MIX10

The ONLY way to learn about Windows Phone 7 is to register now for MIX10-we’ve even extended the special discount on registration through February 21st-you have less than a week to take advantage of this $200 discount.

Don’t wait! This is absolutely your last chance to receive this discount. “

Ich bin dort, wer noch?

TheOliver

The-Oliver Designer, Developer, Info, Windows Phone 7 Series

Windows Phone 7 Series

February 15th, 2010

windowsphone7seriesVor wenigen Minuten wurde der Weltöffentlichkeit zum ersten mal “Windows Phone 7 Series” vorgestellt: Microsofts neue mobile Plattform der nächsten Generation. Integrierte Benutzerkonzepte, aggregierte Informationen aus unterschiedlichen Quellen, einfach zusammengefasst und bedienbar für den Benutzer.

Die offizielle Homepage, inklusive eines sehr guten Simulators, heißt: http://www.windowsphone7series.com/

Den offiziellen deutschen Blog zu diesem Thema findet man ab sofort hier: http://blogs.msdn.com/windowsphone/ 

Weitere Informationen über die Entwicklerstory wird es auf der MIX’10 in Las Vegas im März und parallel hier in diesem Blog geben.

Es wird extrem spannend. Ich freu mich.

TheOliver

The-Oliver Developer, Info, Windows Phone 7 Series

MSDN TV – Neue Folge online

February 15th, 2010

Gleich zwei heiße Top-Themen präsentiert die aktuelle Ausgabe von msdn tv: wir gehen der Frage nach, was Windows 7 und Bob Dylan gemeinsam haben und präsentieren Mitglieder der Microsoft-Community, die erstmals vor der Kamera auspacken. Aber der Reihe nach: im Interview mit Moderator Jan Schenk informiert diesmal MSDN-Experte und Windows-Entwickler Oliver Scheer unter trickreicher Zuhilfenahme sogenannter CueCards über einige interessante Features von Windows 7 und über Ressourcen, die jeder Developer kennen sollte. Beispiel: das Windows API Code Pack.

In den Kurznachrichten gibt’s Infos zum Windows 7 Developer Center, zur neuesten Version der Microsoft-Vortragssammlung Webcast DVD Edition 2009, zur frisch gelaunchten Übersicht über die deutschsprachigen Microsoft Social Media Angebote auf dem Web-Portal „Community Guide“, zum Imagine Cup Wettbewerb 2010 und einem wichtigen Termin, den Verwender des Release Candidate von Windows 7 beachten sollten.

Schließlich bedanken sich noch drei Gewinner des Expression Studio Gewinnspiels vom Herbst letzten Jahres per Video für die übersandten Preise. Ach so – wegen Bob Dylan: Die Vorlage zum CueCard-Video stammt aus dem Jahr 1965 und ist hier anzuschauen.

The-Oliver Developer, Info

99,5 % Kostenlos = MSDN

February 12th, 2010

MSDN – das Microsoft Developer Network – unterstützt Entwickler mit einem reichhaltigen Angebot von Online- und Offline-Services und liefert mit seinem umfangreichen Know-how-Fundus effiziente Hilfe, wenn es um Fragen der Anwendungsprogrammierung auf Basis von Microsoft-Produkten und -Technologien geht. Angefangen beim .NET Framework, den verschiedenen .NET-Sprachen und der Entwicklungsumgebung Visual Studio, über Windows und Webprogrammierung, bis hin zur Entwicklung für mobile Plattformen bietet Ihnen MSDN Online genug Treibstoff, um Ihre Probleme und Fragen hinter sich zu lassen und Ihre Ziele schnell zu erreichen. Natürlich auch zu neuen Themen und Technologien wie Windows 7, Cloud Computing, Silverlight oder Multicore-Programmierung. Lesen Sie auch gerne, was die deutschsprachige Wikipedia über uns schreibt: MSDN auf Wikipedia
Mit MSDN Online möchten wir Ihnen unter der Internetadresse www.msdn-online.de grundsätzlich eine umfangreiche Grundversorgung anbieten. Dort, wo wir Ihnen einen extra Service oder die Extraportion Know-how anbieten, bemühen wir uns dies natürlich kostenfrei für Sie zu realisieren. So sind 99.5% aller unserer Online-Angebote kostenfrei nutzbar.

Mehr Infos: http://msdn-online.de/willkommen

The-Oliver Developer, Info

Visual Studio 2010 Release Candidate für alle

February 11th, 2010

Der Release Candidate (RC) von Visual Studio 2010, die letzte Vorabversion vor der Produktveröffentlichung am 12. April 2010, steht nun allen Interessierten in den kommenden Editionen als öffentlicher Download zur Verfügung. Zum Wochenbeginn hatten bereits Inhaber einer MSDN Subscription exklusiven Zugriff auf die – gegenüber der früheren Vorabversion Beta 2 dank umfassenden Kundenfeedbacks immens beschleunigte – Entwicklungsumgebung gehabt. Die ausschließlich englischsprachig verfügbaren Vorabversionen verfügen weiterhin über eine „Go Live“-Lizenz, die den produktiven Einsatz bereits heute erlaubt. Zeitgleich zu Visual Studio 2010 hat auch das grundlegende .NET Framework 4, in den Visual Studio 2010-Installationen bereits enthalten, den RC-Status erreicht und ist von MSDN Online auch separat herunterladbar.
Download: Visual Studio 2010 (RC) und .NET Framework (RC)
Visual Studio General Manager Jason Zander bittet die geneigten Tester der Release Candidates ein weiteres Mal um ihr wertvolles Feedback und stellt in einem Channel 9-Interview die jüngste Entstehungsgeschichte der Release Candidates vor.
Tagesaktuelle Nachrichten rund um Visual Studio finden Sie auch im Visual Studio Developer Center auf MSDN. Im MSDN Forum zu Visual Studio können Sie sich mit der Community austauschen und in der MSDN Mediathek finden Sie zahlreiche weitere Multimediainhalte zu Visual Studio 2010: MSDN Mediathek

Verwandte Links:

MSDN Library zu Visual Studio 2010

The-Oliver Developer, Visual Studio

Windows 7 – Multitouch

February 4th, 2010

Microsoft Surface

Heute habe ich mir für das Video des Tages Unterstützung von unserem User Experience-Evangelisten Clemens Lutsch geholt. Er ist ein Experte auf dem Gebiet der neuartigen Benutzeroberflächen. Er befasst sich seit der ersten Stunde mit Microsoft Surface, einem Tisch, der über eine Oberfläche bzw. eine Tischplatte verfügt, mit der man sämtliche Interaktionen steuern kann. Die gesamte Interaktion wird über grafische Elemente, Bluetooth-fähige Geräte oder aber mit den Händen vorgenommen. Spannend dabei ist, dass man gleichzeitig mit nahezu beliebig vielen Händen und Fingern mit dem Tisch interagieren kann. Ein einfaches Beispiel ist die zeitgleiche Betrachtung von Bildern durch verschiedene Benutzer. Jeder kann Bilder auf dem Tisch ansehen, heranziehen, vergrößern, drehen und sortieren. Im Prinzip fast genauso, wie man es von herkömmlichen Fotoabenden mit Familie und Freunden gewohnt ist. Aber haben sie schon mal versucht ein klassisches Foto auf dem Tisch zu vergrößern, um die Details genauer zu betrachten? Ja, so etwas funktioniert nur mit dem Surface.

surface

Ganz ehrlich, der Surface ist wegen der integrierten Hardware und der enorm wuchtigen Tischplatte, nicht ganz preiswert und derzeit nur über Microsoft direkt zu beziehen – beim Multimedia-Fachhändler um die Ecke steht er also noch nicht zur Verfügung. Allerdings kann ich jedem empfehlen, mal in den O2-Flagship-Store in Köln zu gehen, dort haben Partner von Microsoft eine Lösung für O2 erstellt, die echt „Wow“ ist.

Was hat Surface mit Windows 7 gemeinsam?

Während der Entwicklung von Windows 7 hat man sehr eng mit dem Surface-Team zusammengearbeitet und dieses Know-How in das neue Betriebssystem einfliessen lassen. Das große Geheimnis von Surface ist eigentlich, dass das darunterliegende Betriebssystem „nur“ Windows Vista Business ist, angereichert mit einigen Kameras für die Erkennung der Finger, Hände oder sonstigen Eingabegeräte. Zusätzlich gibt es noch diverse Treiber für die Eingabe sowie Software, die die Oberfläche von Surface ausmacht. Diese Software ist, etwas einfach formuliert, nur WPF (Windows Presentation Foundation) mit speziellen Steuerelementen. Für den „normalen“ Entwickler heißt das, er kann eigentlich sofort für Surface programmieren. Die Entwicklungswerkzeuge sind die gleichen, wie für Silverlight und WPF, nämlich Expression Studio und/oder Visual Studio.

In Windows 7 ist die Möglichkeit eingeflossen, den Computer über den Bildschirm mit Hilfe von Fingern zu steuern. Es gibt bereits eine Vielzahl von Computern und Notebooks, die sich mit einem Finger steuern lassen. Darüber hinaus gibt es derzeit schon eine überschaubare Anzahl von Computern, die sich schon mit zwei oder mehreren Fingern gleichzeitig steuern lassen. Wieviele gleichzeitige Eingaben unterstützt werden, ist von der Display-Hardware und damit vom Hersteller direkt abhängig.

Was hat man unter Windows 7 von Multitouch?

Eine nette Anekdote zum Thema Multitouch: Die Steuerelemente auf der Taskleiste sind wesentlich größer geworden. Der Grund dafür liegt in der natürlichen Beschaffenheit von menschlichen Fingern. Haben SIe schon einmal probiert, die kleinen Symbole der Windows Vista- oder Windows XP-Oberfläche in der Taskleiste mit dem Finger präzise zu treffen? Selbst mit einem Stift (von Tablet PCs) ist das eher ein Geschicklichkeitsspiel als ein präzises Arbeiten. Jetzt lassen sich die neuen Steuerelemente auch einfach mit dem Finger treffen und steuern.

Anwendungen, die die Basisfunktionen aus dem Betriebssystem unterstützen, wie z.B. das Vergrößern und Verkleinern, sind bereits sehr gut für Mutlitouch ausgelegt. Durch das auseinanderziehen zweier Fingern kann man beliebige Dokumente, die diese Funktion unterstützen, vergrößern oder verkleinern. Hinzu kommt die Fähigkeit der Anwendungen, natürliches Feedback zu geben, gelangt man z.B. an das Ende eines Dokumentes, so „bounced“ dieses (Bouncen heißt so viel wie „kurz über das Ziel hinausfahren und wieder zurückzukommen“). Damit erhält der Benutzer tatsächlich das Gefühl von „Ich bin am Ende des Dokumentes angekommen“. Aber auch die Docking-Funktionen von Windows sind hervoragend auf Multitouch eingestellt: bewegt man ein Fenster mit dem Finger an eine Bildschirmseite, so dockt es dort automatisch an.

Eine andere Anekdote ist, dass sich die Open Source Gemeinde um einen Browser damit rühmt, jetzt auch Multitouch unter Windows 7 zu unterstützen. Leider haben die Kollegen nicht mitbekommen, dass das ein fester Bestandteil von Windows 7 ist und sofort „ohne Code“ von jeder Anwendung automatisch verwendet werden kann.

Es gibt bereits eine Vielzahl von Anwendungen, die Multitouch direkt verwenden. Microsoft selbst liefert ein Beispielpaket aus, das Multitouch Pack, das aus einigen Spielen, Visualisierungsdemonstrationen und Surface Globe besteht. So kann man mit dem Surface Globe sehr leicht die Welt mit den eigenen Fingern erkunden.

image

Anwender ohne ein Multitouch-fähiges Gerät müssen aber nicht zurückstecken, die Anwendungen lassen sich zumindest starten und größtenteils auch mit der Maus steuern, wenn auch nicht ganz so komfortabel.

image

Wie kann man nun eigene Multitouch-fähigen Anwendungen entwickeln?

Auf MSDN-Online gibt es dazu einen sehr guten Webcast.

In diesem Webcast zeigt Ihnen Dariusz Parys, wie Sie Anwendungen für Windows 7 multi-touch-fähig machen. Unter anderem erfahren Sie, wie man einen Emulator installiert, um Multi-Touch zu simulieren, welche Gesten standardmäßig in Windows 7 unterstützt werden und wie man eine WPF-Anwendung um Multi-Touch-Funktionalität erweitert.

Link zum Webcast

Weitere technische Dokumentation zur Multitouch-API gibt es hier:

Yochay Kriaty – Multitouch-Funktionen in Windows 7

The-Oliver Deutsch, Developer, Windows

Windows 7 – Eigene Explorer basierende Anwendungen entwickeln

February 4th, 2010

Heute kommen die Fans des Windows Explorer voll auf ihre Kosten. Er verfügt im Prinzip über alle wichtigen Funktionen, die man für die Navigation durch Ordner, Netze, Dateien, Bibliotheken und Suchen benötigt. Der Windows Explorer ist das Ergebnis jahrelanger Entwicklungsarbeit und spiegelt dabei die Implementierung vieler Bedürfnisse des Standardbenutzers wieder. Wer dennoch Funktionen braucht, die nicht enthalten sind, oder diese gerne auf andere Art und Weise implementieren möchte, darf dies gerne tun.

Die Funktionen des Windows Explorer stehen jedem Entwickler frei zur Verfügung. Dank des Windows API Code Packs lässt sich der Explorer in Windows Forms- oder Windows Presentation Foundation-Anwendungen integrieren.

Die Funktionen und die Visualisierung steht in Form von Steuerelementen direkt in Visual Studio zur Verfügung. Der Name der Steuerelemente ist sowohl in Windows Forms als auch in WPF ExplorerBrowser.

clip_image002

Die Konfiguration ist ebenfalls sehr leicht über das Eigenschaften-Fenster möglich.

Zwei Referenzimplementierungen sind direkt im Windows API Code Pack enthalten. Sie demonstrieren einfach und kompakt die volle Leistungsfähigkeit und sehen dabei sehr technisch aus. Meine Bitte an Sie, bitte bauen sie so etwas nicht, sondern machen sie es dem Benutzer leicht. J

clip_image004

Die WPF-Variante zum Testen der ExplorerBrowser-Funktionen.

clip_image006

Die Windows Forms-Variante zum Testen.

The-Oliver Deutsch, Developer, Windows

Windows 7 – Suchen über die Windows Shell

February 4th, 2010

Ein altes Sprichwort sagt: „Wer suchet, der findet.“. Warum lassen wir nicht unsere eigenen Anwendungen suchen? Windows 7 liefert die notwendige Search API dafür mit.

Um die Search API aus .NET-Code ansprechen zu können, ist wirklich nicht viel nötig. Man muss lediglich das Windows API Code Pack einbinden und schon kann in wenigen Zeilen der eigene Suchclient entwickelt werden.

Was man sucht und vor allem wo man sucht, ist jedem Entwickler selbst überlassen. Die Qualität der Suche hängt aber wesentlich von diversen Kriterien ab: So ist es ziemlich sinnlos nach Liedern ihrer Lieblingsband im System-Ordner von Windows zu suchen. Und Bilder vom letzten Firmenfest werden sie nicht in ihren Musikordnern finden. Es sei denn, sie haben eine sehr interessanten Organisationsstil.

Aus gutem Grund bietet die API daher auch die nötigen Konfigurationswerkzeuge für die Suche an. In welchen Typen von Ordner soll gesucht werden? Was für Daten suchen wir? Sollen alle Suchbegriffe oder zumindest ein Suchbegriff im Dokument gefunden werden? Handelt es sich um aktuelle Daten oder vor langer Zeit angelegte Dokumente?

Eine eigene Suchanwendung ist sehr schnell implementiert. Dafür sind lediglich zwei Bibliotheken aus dem Windows API Code Pack notwendig:

image

Die Methode zum Suchen:

private void StartSearch(string searchText)
{
// Erzeuge Suchbedingungen
SearchCondition searchCondition =
GetSearchCondition(searchText);
// Datum als weiteres Suchkriterium hinzufügen
SearchCondition dateCondition =
SearchConditionFactory.CreateLeafCondition(
SystemProperties.System.Title,
searchText,
SearchConditionOperation.ValueContains);
// Zusammensetzen der Suchbedingungen
SearchCondition finalSearchCondition =
SearchConditionFactory.CreateAndOrCondition(
SearchConditionType.Or,
false,
searchCondition,
dateCondition);

// Erzeuge einen ShellSearchFolder
ShellSearchFolder searchFolder;
if (ShellLibrary.IsPlatformSupported)
{
searchFolder = new ShellSearchFolder(
finalSearchCondition,
(ShellContainer)KnownFolders.DocumentsLibrary,
(ShellContainer)KnownFolders.PicturesLibrary,
(ShellContainer)KnownFolders.VideosLibrary);
}
else
{
searchFolder = new ShellSearchFolder(
finalSearchCondition,
(ShellContainer)KnownFolders.Documents,
(ShellContainer)KnownFolders.Pictures,
(ShellContainer)KnownFolders.Videos);
}

// DataList die die Ergebnisse anzeigt
_result.ItemsSource = searchFolder;
}

Die Methode GetSearchCondition ist folgendermaßen implementiert:

private SearchCondition GetSearchCondition(string searchText)
{
// Einzelne Suchbegriffe aus dem Textbilden
string[] words = searchText.Split(’ ‘);
// Das Suchergebnis ist erstmal leer
SearchCondition combinedPropertyCondition = null;
// Für jedes Word im Suchtext eine Suchbedingung erzeugen
foreach (string word in words)
{
// Erste Suchbedingung –> Suche nach Dateinamen
SearchCondition propertyCondition1 =
SearchConditionFactory.CreateLeafCondition(
SystemProperties.System.FileName,
word,
SearchConditionOperation.ValueContains);
// Zweite Suchbedingung –> Suche nache Keywords/Tags in Datei
SearchCondition propertyCondition2 =
SearchConditionFactory.CreateLeafCondition(
SystemProperties.System.Keywords,
word,
SearchConditionOperation.ValueContains);
// Wir wollen eine Oder-Bedingung für Tags oder Dateiname
SearchCondition tmpCombinedCondition =
SearchConditionFactory.CreateAndOrCondition(
SearchConditionType.Or,
false,
propertyCondition1,
propertyCondition2);

// Falls es bereits eine Suchbedingung gibt,

// verknüpfe die neue und die alten mit AND
if (combinedPropertyCondition != null)
{
combinedPropertyCondition =
SearchConditionFactory.CreateAndOrCondition(
SearchConditionType.And,
false,
combinedPropertyCondition,
tmpCombinedCondition);
}
else
{
combinedPropertyCondition = tmpCombinedCondition;
}
}
return combinedPropertyCondition;
}

Die Suche an sich wird über die Klasse ShellSearchFolder ausgeführt. Die Definition der Suchanfrage erfolgt über die SearchConditions. Welche Ordner durchsucht werden sollen, wird mit Hilfe von „KnownFolders“, so genannten bekannten Ordner definiert.

searchFolder = new ShellSearchFolder(
finalSearchCondition,
(ShellContainer)KnownFolders.DocumentsLibrary,
(ShellContainer)KnownFolders.PicturesLibrary,
(ShellContainer)KnownFolders.VideosLibrary);

Das Suchergebnis kann man nun visualisieren wie man möchte. Ich habe mich in diesem Beispiel auf eine einfache Liste beschränkt. Im Windows API Code Pack steht dazu eine vollwertige WPF-Visualisierung zur Verfügung.

The-Oliver Deutsch, Developer, Windows

Windows 7 – Restart- und Recovery-API

February 4th, 2010

Meine Programme stürzen nicht ab! Nein ganz bestimmt nicht! Versprochen! Großes Indianer-Ehrenwort!

Aber falls es doch mal passiert, dass eine Anwendung „abstürzt“, bzw. einfach nicht das tut, was man von ihr erwartet, dann kann man das jetzt stilvoll und mit einem automatischen Neustart der Anwendung geschehen lassen. Hierbei hilft die Restart-And-Recovery-API, die bereits in Windows Vista eingeführt und nun in Windows 7 erweitert wurde.

Jeder von uns war bestimmt schon einmal in der Situation, dass er lange an einem Dokument gearbeitet hat bis die Anwendung plötzlich einfach abgestürzt ist. Die Anwendung reagiert einfach nicht mehr und alle Daten sind verloren. Vielleicht haben sie es auch schon einmal gesehen, dass einige Anwendungen nach einem Absturz anbieten, direkt wieder neu zu starten. Und im Startvorgang werden dann die verloren geglaubten Daten wiederhergestellt. Benutzer solcher Anwendungen können sich glücklich schätzen.

clip_image002

Die Anwendung läuft noch ….

clip_image004

Ups, die Anwendung funktioniert nicht mehr.

clip_image006

Und startet sich von selbst neu.

clip_image008

Eine quasi sich selbst regenerierende Anwendung kann jeder mit Hilfe der Restart-And-Recovery-API erstellen. Es sind nur wenige Schritte dazu notwendig:

Schritt 1: Registrieren der Anwendung für einen Restart

private void RegisterForRestart()
{
ApplicationRestartRecoveryManager.RegisterForApplicationRestart(
new RestartSettings("/restart",
RestartRestrictions.NotOnReboot | RestartRestrictions.NotOnPatch));
}

Schritt 2: Registrieren der Anwendung für die Wiederherstellung von Daten

private void RegisterForRecovery()
{
RecoveryData data = new RecoveryData(new RecoveryCallback(RecoveryProcedure), null);
RecoverySettings settings = new RecoverySettings(data, 0);
ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(settings);
}

Schritt 3: Implementieren der Recovery-Methode

private int RecoveryProcedure(object state)
{
PingSystem();

File.WriteAllText(RecoveryFile, string.Format("{1}{0}{2}{0}{3}", DataSeparatorString, CurrentFile.Filename, CurrentFile.IsDirty, CurrentFile.Contents));

Debug.WriteLine("File path: " + RecoveryFile);
Debug.WriteLine("File exists: " + File.Exists(RecoveryFile));
Debug.WriteLine("Application shutting down…");

ApplicationRestartRecoveryManager.ApplicationRecoveryFinished(true);
return 0;
}

Schritt 4: Prüfen, ob der Benutzer den Restart abgebrochen hat

private void PingSystem()
{
// Find out if the user canceled recovery.
bool isCanceled = ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress();

if (isCanceled)
{
Console.WriteLine("Recovery has been canceled by user.");
Environment.Exit(2);
}

}

Schritt 5: Daten beim Neustart wiederherstellen

private void RecoverLastSession(string command)
{
if (!File.Exists(RecoveryFile))
{
MessageBox.Show(this, string.Format("Recovery file {0} does not exist", RecoveryFile));
internalLoad = true;
textBox1.Text = "Could not recover the data. Recovery data file does not exist";
internalLoad = false;
UpdateAppTitle();
return;
}

// Perform application state restoration actions here.
string contents = File.ReadAllText(RecoveryFile);
CurrentFile.Filename = contents.Remove(contents.IndexOf(Form1.DataSeparatorString));
contents = contents.Remove(0, contents.IndexOf(Form1.DataSeparatorString) +
Form1.DataSeparatorString.Length);
CurrentFile.IsDirty = contents.Remove(contents.IndexOf(Form1.DataSeparatorString)) == "True" ? true : false;
contents = contents.Remove(0, contents.IndexOf(Form1.DataSeparatorString) + Form1.DataSeparatorString.Length);
CurrentFile.Contents = contents;

// Load our textbox
textBox1.Text = CurrentFile.Contents;

// Update the title
UpdateAppTitle();

// Reset our variable so next title updates we don’t show the "recovered" text
recovered = false;
}

Schritt 0: Die eigentliche Anwendung

public Form1()
{
Debug.WriteLine("ARR: Demo started");
InitializeComponent();
UpdateAppTitle();
RegisterForRestart();
RegisterForRecovery();

if (System.Environment.GetCommandLineArgs().Length > 1 && System.Environment.GetCommandLineArgs()[1] == "/restart")
{
RecoverLastSession(System.Environment.GetCommandLineArgs()[1]);
}
}

Das vollständige Codebeispiel befindet sich im Windows API Code Pack.

The-Oliver Deutsch, Developer, Windows

Windows 7 – Entwickeln mit und für Sensoren

February 4th, 2010

Was ist die Windows 7 Sensor API?

Die Windows 7 Sensor API ist eine neue Programmierschnittstelle für die Steuerung von Sensoren. Bei Sensoren kann es sich um interne und externe Erweiterungen des PCs handeln, die dem Computer Informationen über „äußere“ Zustände vermitteln. Die häufigsten Einsatzszenarien sind derzeit die Erkennung der Umgebungshelligkeit, der Beschleunigung des PCs selbst oder des angeschlossenen Sensors. Darüber hinaus kann man Software-Sensoren erstellen, die bestimmte Werte ermitteln und an die API übergeben und damit unseren Anwendungen bereitstellen.

Was kann man tun, wenn man keine Sensoren installiert hat?

Man muss sich nicht unbedingt einen neuen Rechner mit Sensorhardware kaufen, denn es gibt durchaus Alternativen. Das Windows 7 SDK bringt zum Beispiel einen Sensor für Licht mit. Es handelt es sich um einen Lichtsensor-Emulator, den der User über einen einfachen Schieberegler steuern kann.

Um den Treiber dafür erfolgreich im System zu installieren, muss man wie folgt vorgehen:

  1. Eine Kommandozeile mit administrativen Rechten starten (cmd.exe mit „Run as“-Option)
  2. Wechseln in den Windows SDK Bin-Ordner
  3. Eingabe von pnputil -a VirtualLightSensorDriver.inf
  4. Bei einer Nachfrage, ob der Treiber wirklich installiert werden soll, mit Ja antworten
  5. Warten bis die Meldung erscheint, dass der Treiber erfolgreich installiert wurde

Ausführen des virtuellen Lichtsensors

  1. Starten der Anwendung “VirtualLightSensor.exe” aus dem Windows SDK Bin-Ordner
  2. Bestätigen, dass der Sensor gestartet werden soll
  3. Einen Moment lang wird die Meldung „Waiting“ angezeigt. Der virtuelle Lichtssensor wird in diesem Moment als „Gerät“ installiert. Anschließend kann der Schieberegler verwendet werden, um die Lichtstärke in Lux zu simulieren

clip_image002

Programmieren mit Sensor API

Die Funktionen, um auf die Sensoren im Computer zugreifen zu können, sind über die SensorManager-Klasse erreichbar. Sie ist Bestandteil des Windows API Code Pack und kann über die darin enthaltene Bibliothek „Sensors“ eingebunden werden.

Um generell erkennen zu können, ob sich an den Sensoren etwas ändert (Aktivierung und Deaktivierung), reicht das Ereignis SensorsChanged. Um zu erkennen, welche Sensoren im System enthalten sind, kann die Methode GetAllSensors verwendet werden. Diese liefert alle Sensoren zurück, die im System derzeit aktiv sind. Jedes zurückgelieferte Objekt ist von der Klasse Sensor abgeleitet.

private void InitSensors()
{
SensorManager.SensorsChanged += new SensorsChangedEventHandler(SensorManager_SensorsChanged);

foreach (var sensor in SensorManager.GetAllSensors())
{
sensor.DataReportChanged += new DataReportChangedEventHandler(sensor_DataReportChanged);
sensor.StateChanged += new StateChangedEventHandler(sensor_StateChanged);
Debug.WriteLine(sensor.FriendlyName);
}
}

Um mit einem Lichtsensor zu arbeiten, kann man den AmbientLightSensor verwenden. Dieser verfügt über die Eigenschaft CurrentLuminousIntensity, welche die Intensität in Lux zurückliefert. Darüber kann erkannt werden, ob das aktuelle Umgebungslicht hell oder dunkel ist. Das macht besonders dann Sinn, wenn man in wechselnden Umgebungen arbeitet, wie z.B. im ICE (Tunnel, Sonnenlicht, Bahnhof, usw.). Einige Notebookhersteller haben dafür schon Sensoren im Rechner eingebaut und regeln so die Helligkeit des Bildschirms.

SensorList<AmbientLightSensor> alsList = SensorManager.GetSensorsByTypeId<AmbientLightSensor>( );
int ambientLightSensors = 0;

foreach( AmbientLightSensor sensor in alsList )
{
// set intial progress bar value
sensor.TryUpdateData( );
float current = sensor.CurrentLuminousIntensity.Intensity;
pb.Value = Math.Min( (int)current, maxIntensity );

// Set up automatc data report handling.
sensor.AutoUpdateDataReport = true;
sensor.DataReportChanged += new DataReportChangedEventHandler( DataReportChanged );
ambientLightSensors++;
}

if( ambientLightSensors == 0 )
{
// No Sensor found
}
}
catch( SensorPlatformException exc)
{
// This exception will also be hit in the Shown message handler.
}

Das Ereignis DataReportChanged wird immer dann ausgelöst, wenn sich am Sensor etwas verändert. Das geschieht asynchron als Hintergrundprozess und muss daher bei Interaktion mit dem UI-Thread wieder mit diesem synchronisiert werden. Die Umsetzung lässt sich sehr einfach mit der folgenden Ereignisbehandlung realisieren:

void DataReportChanged( Sensor sender, EventArgs e )
{
AmbientLightSensor als = sender as AmbientLightSensor;
BeginInvoke( new MethodInvoker( delegate
{
float current = als.CurrentLuminousIntensity.Intensity;
} ) );
}

Arbeiten mit Bewegungs- bzw. Beschleunigungssensoren

Inzwischen gibt es auch immer mehr Hardware mit so genannten Bewegungssensoren. Diese erkennen Beschleunigung in den drei Bewegungsachsen. Dadurch ergeben sich ganz neue Möglichkeiten der Steuerung.

Ich selbst habe ein externes Sensorboard der Firma Freescale zu Testzwecken an meinem Rechner. Damit verfügt man quasi über einen Joystick, der eine dreidimensionale Steuerung erlaubt.

Um diesen Sensor anzusprechen, benötigt nicht viel mehr Code als für Lichtsensoren.

Das Auslesen der Daten geschieht ebenfalls im DataReportChanged-Ereignis der SensorManager-Klasse:

void sensor_DataReportChanged(Sensor sender, EventArgs e)
{
Debug.WriteLine(sender.FriendlyName);
if (sender is Accelerometer3D)
{
Dispatcher.BeginInvoke(new Action(delegate
{
Accelerometer3D accel = sender as Accelerometer3D;
MoveBall(accel.CurrentAcceleration[AccelerationAxis.X],
accel.CurrentAcceleration[AccelerationAxis.Y],
accel.CurrentAcceleration[AccelerationAxis.Z]);
}));
}
}

Die Methode MoveBall macht nichts anderes als einen Ball um die übergebenen X-,Y- und Z-Koordinaten zu verschieben.

Ein schönes Beispiel ist im Windows API Code Pack enthalten. Dieses visualisiert die aktuelle Beschleunigung des Sensors in X-,Y- und Z-Richtung.

clip_image004

The-Oliver Deutsch, Developer, Windows

Windows 7 – Entwicklerresourcen

February 4th, 2010

Heute möchte ich eine kleine Zusammenfassung für Entwickler bereit stellen – für jeden der schnell und kompakt eine Übersicht über die vielen kostenfreien Angebote von Microsoft haben möchte.

Die folgenden Webseiten bieten kostenfreie Downloads oder Inhalte an, die von jedem genutzt werden dürfen, die sich gerne mit der Windows-Programmierung und im Besonderen mit Windows 7 befassen möchten.

MSDN Online –Microsoft Developer Network

Was kann man bei MSDN Online finden? Im Prinzip ist die Antwort einfach formuliert: Alles! Im Detail heißt das, dass es dort alles zu unseren Programmiersprachen (Visual Basic, Visual C++, Visual C#), unseren Werkzeugen für Entwickler (Visual Studio, Visual Studio Express, Visual Studio Team System) und unseren Betriebssystemen (Windows Client, Windows Server, Windows Mobile, Windows Embedded) zu finden gibt.

Neben Webcasts und Videos, die von Experten auf ihren Gebieten erstellt wurden, finden sich dort auch viele technische Artikel und Downloads. Man kann sich auf MSDN Online aber auch für Newsletter (http://www.microsoft.com/germany/msdn/flash/default.mspx) und RSS-Feeds (http://msdn.microsoft.com/de-de/bb821267.aspx) registrieren, die in regelmäßigen Abständen über aktuelle Themen informieren.

Außerdem findet man dort seit kurzem das sehr spannende und amüsante MSDN TV. Link: http://www.microsoft.com/germany/msdn/msdntv/default.mspx

Wer mehr über die MSDN Subscription erfahren möchte, ist dort ebenfalls hervorragend aufgehoben. Kurz formuliert handelt es sich dabei um ein Abonnement für sämtliche aktuellen und kommenden Microsoft-Produkte und -Technologien, die man uneingeschränkt als Entwickler für sich verwenden kann.
Link: http://msdn.microsoft.com/de-de/subscriptions/default.aspx

Link: http://www.msdn-online.de

Windows 7 Software Development Kit

Beim Microsoft® Windows® SDK handelt es sich um einen Satz von Tools, Codebeispielen, Dokumentationen, Compilern, Headern und Bibliotheken, mit denen Entwickler Anwendungen erstellen können, die unter Microsoft Windows-Betriebssystemen mit systemeigenen (Win32) oder verwalteten (.NET Framework) Programmiermodellen ausgeführt werden.

In den meisten Fällen sollten Sie die neueste Windows SDK-Version verwenden, die mehrere Windows-Betriebssysteme und .NET Framework-Versionen unterstützt

Link: http://msdn.microsoft.com/de-de/windows/bb980924.aspx

Blog des Windows SDK Teams: http://blogs.msdn.com/windowssdk/

Windows API Code Pack for Microsoft .NET Framework

Das Windows API Code Pack for Microsoft .NET Framework bietet eine Quellcodebibliothek an, die es ermöglicht, die neuen Windows 7 Funktionen in .NET-Anwendungen zu verwenden.

Link: http://code.msdn.microsoft.com/WindowsAPICodePack

Windows 7 Training Kit

Das Windows 7 Training Kit beinhaltet Präsentationen, Hands-on-labs und Demos, die dafür entwickelt wurden, die neuen Funktionen von Windows 7 verwenden zu können.

Link: http://www.microsoft.com/downloads/details.aspx?FamilyID=1C333F06-FADB-4D93-9C80-402621C600E7&displaylang=en

Gibt es weitere Quellen habe und die ich vergessen habe? Her damit

The-Oliver Developer, Windows

Windows 7 – Neun Dinge die jeder Entwickler über Windows 7 wissen sollte

February 4th, 2010

1. Windows 7 beinhaltet das .NET Framework 3.5 SP1

Das .NET Framework 3.5 SP1 ist in Windows 7 enthalten. Das sind gute Nachrichten:

  • Softwareverteilung: Für eine Clientanwendung heißt dies bei der Softwareverteilung, dass das .NET Framework schon auf Windows 7 Computern vorhanden ist und nicht zusätzlich installiert werden muss
  • Kompatibilität: Da Windows 7 mit dem .NET Framework 3.5 SP1 bereitgestellt wird, kann man sicher sein, dass sehr viele Integrationstests durchgeführt wurden, um das Funktionieren der .NET Runtime und Bibliotheken mit dem OS zu gewährleisten.

2. Visual Studio 2008 funktioniert problemlos mit Windows 7

Ich benutze Visual Studio 2008 zusammen mit Windows 7 auf meinen Notebook und meinem Entwicklungsdesktop und habe keinerlei Probleme. Wie gewohnt, kann man mit Visual Studio 2008 noch .NET 2.0, .NET 3.0 und .NET 3.5 SP1 Anwendungen für andere OS-Versionen, z.B. Windows XP oder Windows Vista, erstellen.

3. Man kann Anwendungen schreiben, die unter Windows XP bis Windows 7 laufen …

und die Features des Gast-Betriebssystems nutzen. Es gibt eine Beispielanwendung „PhotoView“, die demonstriert, wie man eine .NET-Anwendung schreibt, die von XP bis Windows 7 lauffähig ist und die Features der einzelnen Gast-Betriebssysteme optimal ausnutzt. Den Sourcecode und eine Beschreibung der Anwendung gibt’s unter –> http://code.msdn.microsoft.com/XP2Win7.

4. Man kann heute .NET-Anwendungen schreiben, welche die coolen Features von Windows 7 nutzen

In meinen letzten Blogeintrag habe ich die Windows 7 API Code Packs vorgestellt, mit denen man schon heute über Managed Code auf diese Features zugreifen kann –> http://blogs.msdn.com/mtcmuc/archive/2009/08/13/windows-7-codepack-v1-0-released.aspx.

Eine Reihe von weiteren Beispielen, wie man für Windows 7 entwickelt, gibt es auch im Microsoft Windows SDK for Windows 7 and .NET Framework 3.5 SP1 –> http://www.microsoft.com/downloads/details.aspx?FamilyID=c17ba869-9671-4330-a63e-1fd44e0e2505&displaylang=en

5. Powershell ist Bestandteil von Windows 7

Für komplexe administrative Scripts und der Verwendung von Powershell aus Anwendungen haraus ist die Powershell V2.0 Bestandteil von Windows 7.

6. Es gibt einen ausführlichen Windows 7 UX Guide

Als PDF-Download gibt es einen User Interface Design Guide zu Themen wie Bildschirmauflösungen, DPIs, Windows Sizing, Controlausrichtung und Control Spacing, u.v.a.m. –> http://download.microsoft.com/download/e/1/9/e191fd8c-bce8-4dba-a9d5-2d4e3f3ec1d3/ux%20guide.pdf

7. Freie Kapitel aus Windows 7-Büchern

Es gibt einige kostenfreie Kapitel aus den Büchern "Windows 7 Inside Out", "Windows 7 Resource Kit" und "Windows 7 for Developers" zum Download –> http://www.microsoft.com/learning/en/us/offers/windows-7-chapters-thankyou.aspx

8. Windows 7 Trainingskit für Entwickler

Wie in meinem Blogeintrag http://blogs.msdn.com/mtcmuc/archive/2009/07/08/schnelleinstieg-in-die-windows-7-entwicklung-mit-dem-windows-7-trainingskit.aspx berichtet, gibt es ein Windows 7 Training Kit für Entwickler. Dieses Kit liegt nun in Version 1.0.1 vor und kann unter –->
http://www.microsoft.com/downloads/thankyou.aspx?familyId=1c333f06-fadb-4d93-9c80-402621c600e7&displayLang=en heruntergeladen werden.

9. Deutsche Windows 7 Developer Tipps

Auf http://msdn.microsoft.com/de-de/windows/dd433113.aspx gibt es viele neue Artikel, HowTo Guides, die erste Schritte auf dem neuen Betriebssystem, aber auch komplexere Windows 7-Programmierthemen ansprechen.

The-Oliver Developer, Windows

Windows 7 – Multifunktionsleiste/Ribbon

February 4th, 2010

Die Multifunktionsleiste wurde neu in Windows 7 integriert und entspricht nahezu der Multifunktionsleiste von Office 2007. Nahezu bedeutet dabei, dass sie konsequent weiterentwickelt wurde.

Windows 7 und die Multifunktionsleiste

Die Multifunktionsleiste ist in einige Klassiker eingeflossen: Paint und WordPad. Schade ist, dass sie es nicht auch in Notepad geschafft hat.

image

image

Die Multifunktionsleiste ist ebenso in Windows Live Movie Maker integriert worden. Dieser läuft auch unter Windows Vista und zeigt, dass die Multifunktionsleiste auch auf Vista verfügbar sein wird.

Entwickeln mit der Multifunktionsleiste

Windows 7 führt ein neues natives API für Multifunktionsleisten-basierte Oberflächen ein. Dieses API ist COM-basiert. Das API wird in Zukunft auch für Windows Vista verfügbar sein und nahezu den gleichen Funktionsumfang wie die Office 2007-Multifunktionsleiste haben.

Um als Entwickler die Multifunktionsleiste verwenden zu können, benötigt man das Windows 7 SDK (Link). Im SDK finden Sie unter anderem die Header-Datei (UIRibbon.h), die den Zugriff auf die Multifunktionsleiste bietet.

Die Programmierung der Multifunktionsleiste teilt sich in zwei Bereiche auf: Im Deklarationsteil werden die verschiedenen Elemente, wie z.B. Tabreiter, Gruppierungen oder Kommandos, deklariert und ihr Aussehen beschrieben. Diese Beschreibung kann mit XAML (Extensible Markup Language) geschrieben werden. Die Ausführung der Kommandos und das Wechseln in verschiedene Zustände wird über C++-Code beschrieben, der die Darstellung mit der Anwendungslogik verknüpft, der eigentlichen Anwendungslogik.

image

Dadurch erhält man eine starke Separation in Model, Sicht und Controller, die den Code und das Markup entkoppelt. Die gesamte C++-API dazu ist sehr kompakt gehalten. Sie ist auf Kommandos fokussiert und nicht auf Steuerelemente oder Darstellungsdetails.

Welche Steuerelemente bringt die Multifunktionsleiste mit

Die Multifunktionsleiste verfügt über ein sehr großes Repertoire an Steuerelementen, die wir bereits aus Paint, WordPad und dem Windows Live Movie Maker her kennen.

image

Eine Funktion die nicht direkt in der Multifunktionsleiste integriert ist, sondern an beliebigen Stellen in der Anwendung verwendet werden kann, ist das erweiterte Kontextmenü. In WordPad erscheint dies leicht transparent, wenn man einen Text markiert. Darüber kann man dann zum Beispiel den selektierten Text formatieren. Diese Funktion erspart dem Benutzer, größere Strecken mit der Maus zurückzulegen und somit seinen aktuellen Fokus (den Text) zu verlassen.

image

image

image

image

image

image

image

image

image

image

image

image

image

image

image

Markup der Multifunktionsleiste

Der Markup-Code für die Multifunktionsleiste unterteilt sich in zwei Bereiche: Command-Sektion und Views-Sektion.

Die Command-Sektion beinhaltet die einzelnen Command-Elemente: einen Referenznamen, ein Label, eine eindeutige ID, ein Bild (BMP) und einen Tooltip.

<?xmlversion="1.0" encoding="utf-8"?>
<Applicationxmlns=’http://schemas.microsoft.com/windows/2009/Scenic/Intent’>
<Application.Commands>
<CommandName=’Home’ LabelTitle=’Home’/>
<CommandName=’HomePage’ LabelTitle=’HomePage’>
<Command.LargeImages>
<ImageSource=’res/HomePageHH.bmp’/>
</Command.LargeImages>
</Command>
</Application.Commands>

Die Views-Sektion legt die Organisation der Kommandos in Tabs, Gruppen, Quick Access-Toolbar und Anwendungsmenü fest. Sie bestimmt außerdem, welches Steuerelement für welches Kommando verantwortlich ist.

<Application.Views>
<Ribbon>
<Ribbon.Tabs>
<Tab CommandName=’Home’>
<Group CommandName=’GoHomePage’ SizeDefinition=’OneButton’>
<Button CommandName=’HomePage’/>
</Group>
</Tab>
</Ribbon.Tabs>
</Ribbon>
</Application.Views>
</Application>

Die Multifunktionsleiste unterstützt zwei Arten von “Sichten”: die Multifunktionsleisten-Sicht und die kontextuelle UI-Sicht. Die kontextuelle UI-Sicht bietet ein reicheres Kontextsystem als bisherige Kontextmenüs.

Da es sich bei der Multifunktionsleiste um eine native API handelt, muss aus der XAML-Datei erst einmal eine native Ressource erstellt werden. Dies geschieht mit einem Tool aus dem Windows SDK: UICC.exe. Dieses generiert aus der XAML-Datei eine Ressource, die man wiederum in seine Anwendung einbinden kann und dadurch die Multifunktionsleiste als nativen Code vorliegen hat.

UICC.exe konvertiert XAML in ein binäroptimiertes Format und erstellt eine .rc-Datei, welche den binären “blob” mit den verwendeten Ressourcen enthält. Man sollte einen benutzerdefinierten Build-Step für die Erstellung der .rc-Datei mittels UICC.exe in sein Projekt einbauen, damit dieses automatisch während des Erstellens geschieht. Eine .h-Datei, die die #defines für die diversen Command-IDs enthält, wird ebenfalls generiert.

Anwendungsmodi

Durch Anwendugsmodi lässt sich die Darstellung von Elementen an den aktuellen Anwendungszustand koppeln, denn nicht immer soll alles sichtbar sein. In Microsoft Paint wird z.B. der Text-Tab nur angezeigt wenn man Text bearbeitet. Ansonsten wird diese Funktion nicht benötigt. Im Markup-Code definiert man die Anwendungsmodi, in denen die Elemente sichtbar sein sollen. Der Anwendungsmodus wird auf untergeordnete Steuerelemente automatisch vererbt.

<Button CommandName=’Paste’ ApplicationModes=’1,3′/>

Im Code kann man den Modus durch die Funktion IUIFrameworkSetModes ändern.

Die API-Interfaces im Überblick

  • IUIFramework – initialisiert Multifunktionsleiste, lädt Markup-Resourcen, Get und Set für Command-Eigenschaften oder State, Set Application Modes.
  • IUIApplication–Ermittelt User Command-Handler für jedes Command, welches im Markup definiert wurde. Benachrichtigt über View-State-Änderungen.
  • IUICommandHandler –Behandelt Commands und Property-Updates (z.B. Aktivieren und Deaktivieren eines Commands, basierend auf der aktuellen Sicht) .

Codebeispiel: Initialisierung

IUIFramework* g_pFramework = NULL;
::CoCreateInstance(CLSID_UIMultifunktionsleisteFramework, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&g_pFramework));
CComObject<CApplication> *pApp = NULL;
CComObject<CApplication>::CreateInstance(&pApp);
CComPtr<IUIApplication> spApp(pApp);
g_pFramework->Initialize(hWindowFrame, spApp);
g_pFramework->LoadUI(GetModuleHandle(NULL), L"APPLICATION_Multifunktionsleiste");

Codebeispiel: Behandeln von Ereignissen

class CApplication :
public CComObjectRootEx<CComMultiThreadModel>,
public IUIApplication,
public IUICommandHandler
{
public:
BEGIN_COM_MAP(CApplication)
COM_INTERFACE_ENTRY(IUIApplication)
COM_INTERFACE_ENTRY(IUICommandHandler)
END_COM_MAP()

STDMETHOD(OnSichtChanged)(UINT32 nSichtID,
__in UI_SichtTYPE typeID, __in IUnknown* pSicht,
UI_SichtVERB verb, INT32 uReasonCode)
{ return E_NOTIMPL; }
STDMETHOD(OnCreateUICommand)(UINT32 nCmdID,
__in UI_COMMANDTYPE typeID,
__deref_outIUICommandHandler** ppCmdHndlr)
{ return QueryInterface(IID_PPV_ARGS(ppCmdHndlr)); }
STDMETHOD(OnDestroyUICommand)(UINT32 commandId,
__in UI_COMMANDTYPE typeID,
__in_optIUICommandHandler* pCommandHandler)
{ return E_NOTIMPL; }
STDMETHODIMP Execute(UINT nCmdID,
UI_EXECUTIONVERB verb,
__in_opt const PROPERTYKEY* key,
__in_opt const PROPVARIANT* ppropvarValue,
__in_optIUISimplePropertySet* pCmdExecProps)
{
if (verb == UI_EXECUTIONVERB_EXECUTE
&& nCmdID == HomePage)
MessageBox(NULL, L"Clicked on HomePagebtn”, L"HomePage Button Execute“, MB_OK);
return S_OK;
}
STDMETHODIMP UpdateProperty(UINT nCmdID,
__in REFPROPERTYKEY key,
__in_opt const PROPVARIANT* ppropvarCurrentValue,
__out PROPVARIANT* ppropvarNewValue)
{
if (key == UI_PKEY_Enabled &&
nCmdID == HomePage && m_bPressed)
{
return UIInitPropertyFromBoolean(
UI_PKEY_Enabled, FALSE, ppropvarNewValue);
}
return E_NOTIMPL;
}

Ein vollständiges Beispiel befindet sich im Windows 7 SDK (Link).

The-Oliver Deutsch, Developer, Windows