• T-22: Neue Dialoge

    Gastposting von Oliver Scheer, Developer Evangelist - Windows, Silverlight und UI-Technologien bei der Microsoft Deutschland GmbH.

    DSCF0103Nur noch 22 Tage bis zum Windows 7 Launch.

    Heute befassen wir uns mit einem nicht ganz so neuen, aber trotzdem recht spannenden Thema. Die folgenden Funktionalitäten gibt bereits in Windows Vista, wo sie allerdings nahezu unentdeckt geblieben sind: die anpassbaren Dialoge. Mit dem Windows SDK wird schon seit einer Weile eine kleine Beispielbibliothek vertrieben, die den Zugriff auf die neuen Dialog-Funktionen ermöglichte – die Windows Vista Bridge für Managed Code.

    Der Gedanke der Vista Bridge wurde im Windows API Code Pack (Link) weitergeführt und über noch übersichtlichere Klassen zur Verfügung gestellt.

    Warum stellt Windows eigentlich neue Standarddialoge zur Verfügung bzw. erweitert diese?

    Das ist sehr einfach erklärt: Der Benutzer soll nicht durch unzählige, unterschiedlich aussehende Dialoge irritiert werden. Jeder Benutzer gewöhnt sich an ein gewisses Aussehen und eine gewisse Funktionsweise von Anwendungen, ebenso verhält es sich bei den Dialogen. Wenn der User bestimmte Symbole sieht, assoziiert er damit eine gewisse Informationsart. Zwar kann jeder Entwickler beliebige Dialoge erstellen und damit seinen Benutzer informieren (bzw. verwirren), aber ich bitte sie, für normale Meldungen einfach die „gebräuchlichen“ Dialoge zu verwenden. Dadurch hat der Benutzer einen gewissen Wiedererkennungseffekt und damit eine leichtere Bedienung.

    Was wird benötigt, um auf die Dialoge zuzugreifen?

    Es reicht, wenn man sich aus dem Windows API Code Pack die Core-Bibliothek einbindet. Diese enthält den Namensraum „TaskDialog“ und beinhaltet sämtliche Funktionalitäten rund um den Standarddialog.

    Die einfachste Form, einen Dialog zu öffnen und das Ergebnis abzufragen, ist:

    TaskDialog td = new TaskDialog();
    td.Caption = "Hallo Welt";
    td.Text = "Windows 7 ist super";
    td.Show();

    Das Ergebnis:

    clip_image002

    Damit wird allerdings noch nicht abgefragt, welche Schaltfläche gedrückt wurde. Ist in diesem Beispiel auch nicht nötig, da nur die OK-Schaltfläche zu sehen ist.

    Möchte man den Benutzer ordentlich fragen, ob er die Anwendung wirklich beenden will, und ihn darauf hinweisen, dass die Änderungen an seinen Daten nicht gespeichert werden, sollte der Quellcode folgend aussehen:

    TaskDialog td = new TaskDialog();
    td.Icon = TaskDialogStandardIcon.Information;
    td.StandardButtons =
    TaskDialogStandardButtons.Yes |
    TaskDialogStandardButtons.No;
    td.Caption = "Frage";
    td.InstructionText = "Wollen sie die Anwendung wirklich beenden?";
    td.Text = "Änderungen werden nicht gespeichert";
    if (td.Show() == TaskDialogResult.Yes)
    {
    // Anwendungen beenden
    }

    Das Ergebnis:

    clip_image004

    Die Methode Show() liefert zurück, welche Schaltfläche gedrückt wurde. Dadurch erhält man ein einfaches Feedback der Benutzereingabe.

    Welche Konfigurationsmöglichkeiten bietet der „neue“ Standard-Dialog?

    Symbole sagen mehr als 1000 Worte. Wenn ein Benutzer ein rotes Ausrufezeichen sieht, sollte er ahnen können, dass etwas nicht in Ordnung ist. An der Ampel im Straßenverkehr ist dies ähnlich oder fahren sie bei Rot einfach los? Ich hoffe nicht.

    Welche Schaltflächen können verwendet werden?

    clip_image006

    Achtung: Dieser Dialog ist nur ein Beispiel für die unterschiedlichen Buttons. Nicht alles, was möglich ist, sollte auch gemacht werden. Oder wüssten sie jetzt, welcher Button sie zum Ziel führt? Auf eine Schaltfläche „Vielleicht“ wurde bewusst verzichtet.

    Wem diese Auswahl an Buttons nicht genügt, kann auch eigene Buttons einfügen. Einziger Nachteil bei angepassten Schaltflächen ist, dass sie für eine Internationalisierung selber sorgen müssen. Im Gegensatz zu den Standard-Schaltflächen werden diese nicht automatisch in anderen Sprachen dargestellt.

    Administratorrechte anfordern

    Wichtige Systemänderungen dürfen nur von Personen durchgeführt werden, die administrative Rechte haben. Dadurch wird vermieden, dass Benutzer willkürlich ihr System verändern können und damit die Stabilität und Sicherheit des Systems gefährden.

    clip_image008

    Aufgaben, die solche Rechte benötigen, sollten auch auf der Oberfläche als solches gekennzeichnet sein. Windows weist auf alle administrativen Funktionen durch ein „Schutzschild“ hin. Verwenden sie dieses bitte auch, damit ein gewisser Wiedererkennungseffekt erhalten bleibt. Die Implementierung des Schildes ist sehr einfach:

    tdElevation = new TaskDialog();
    tdElevation.Cancelable = true;
    tdElevation.InstructionText = "Elevated task example";
    TaskDialogCommandLink adminTaskButton = new TaskDialogCommandLink("adminTaskButton", "Adming stuff", "Run some admin tasks");
    adminTaskButton.ShowElevationIcon = true;
    adminTaskButton.Click += new EventHandler(adminTaskButton_Click);
    adminTaskButton.Default = true;
    tdElevation.Controls.Add(adminTaskButton);
    tdElevation.Show();

    Wenn man schon Fehler macht, dann bitte mit Stil

    Keiner macht sie gern, aber ab und an kommen sie dann doch vor, und sie sind ja auch menschlich: Fehler. Aber aus Fehlern lernt man schließlich am meisten. Bitten sie doch einfach ihre Benutzer, ihnen die Fehlermeldungen und Feedback zurückzuschicken. Die Fehlermeldung kann ihnen dabei helfen, ihre Anwendung weiter zu verbessern.

    Der folgende Dialog ist die Luxusvariante einer Fehlermeldung. Diese wirkt auf jeden Fall besser, als ein reiner Programmabsturz.

    clip_image010

    Der Code für die Implementierung sieht wie folgt aus:

    tdError = new TaskDialog();
    tdError.DetailsExpanded = false;
    tdError.Cancelable = true;
    tdError.Icon = TaskDialogStandardIcon.Error;

    tdError.Caption = "Error Sample 1";

    tdError.InstructionText = "An unexpected error occured. Please send feedback now!";
    tdError.Text = "Error message goes here…";
    tdError.DetailsExpandedLabel = "Hide details";

    tdError.DetailsCollapsedLabel = "Show details";
    tdError.DetailsExpandedText = "Stack trace goes here…";
    tdError.FooterCheckBoxChecked = true;
    tdError.FooterCheckBoxText = "Don’t ask me again";
    tdError.ExpansionMode = TaskDialogExpandedDetailsLocation.ExpandFooter;
    TaskDialogCommandLink sendButton = new TaskDialogCommandLink("sendButton", "Send Feedback\nI’m in a giving mood");
    sendButton.Click += new EventHandler(sendButton_Click);
    TaskDialogCommandLink dontSendButton = new TaskDialogCommandLink("dontSendButton", "No Thanks\nI don’t feel like being helpful");
    dontSendButton.Click += new EventHandler(dontSendButton_Click);
    tdError.Controls.Add(sendButton);
    tdError.Controls.Add(dontSendButton);
    tdError.Show();

    Diverse Studien haben ergeben, dass vor dem Bildschirm wartende Benutzer, diein dieser Zeit unterhalten werden, die Zeit als wesentlich kürzer empfinden, als ohne Unterhaltung. Daher mein Tipp: Unterhalten sie den Benutzer mit „Fortschrittsbalken“! Dadurch weiß er, dass die Anwendung noch läuft, aber gerade beschäftigt ist.

    clip_image012

    Das Video des Tages

    Get Microsoft Silverlight

  • Microsoft Security Essentials ist fertig!

    Microsoft Security Essentials

    Da Sicherheitsbedrohungen für heutige PCs immer weiter zunehmen, arbeitet Microsoft aktiv daran, PC-Anwender zu schützen, um ihnen eine sichere und produktive Windows-Umgebung bereitstellen zu können. Zusätzlich zu den Vorteilen der Sicherheitsfunktionen, die für die eigenen Produkte entwickelt und in diese integriert wurden, empfiehlt Microsoft Endkunden einen Echtzeit-Anti-Malware-Schutz, um ihre PCs vor neuen und zukünftigen Bedrohungen zu schützen.

    Es stehen heute viele qualitativ hochwertige Sicherheitsprodukte zur Auswahl (sowohl kostenfrei, als auch im Abonnement); dennoch halten Kosten- und Leistungsgründe viele Anwender davon ab, eine aktuelle Sicherheitssoftware zum Schutz ihrer PCs zu verwenden.

    Um der Nachfrage von Kunden nach einem qualitativ hochwertigen Anti-Malware-Schutz zu genügen, der einfach erhältlich ist und die Systemleistung nicht ausbremst, stellen wir Microsoft Security Essentials vor – eine kostenlose Anti-Malware-Lösung, welche den Kunden einen qualitativ hochwertigen Schutz unter anderem vor Viren, Spyware, Rootkits und Trojanern bietet.

    Microsoft Security Essentials ist für Anwender einer Original-Version von Windows verfügbar und so entwickelt, dass es den gängigen Anforderungen von Kunden nach einem Sicherheitsprodukt mit folgenden Eigenschaften genügt:

    • Hochwertiger Schutz
    • Einfach zu benutzen
    • Unauffällige Leistungsanforderungen

    Da Microsoft Security Essentials direkt von Microsoft kommt, können Anwender sicher sein, dass es sich um eine rechtmäßige, nicht fehlerhafte Sicherheits-Software handelt, die wiederum bewirken könnte, dass ein PC mit Malware infiziert wird. Laut dem aktuellen Security Intelligence Report Version 6 (SIR v6) befindet sich diese, so genannte Rogue-Software, weltweit auf dem Vormarsch.

    Geografische Verbreitung von Malware, Juli - Dezember 2008

    Hochwertiger Anti-Malware-Schutz

    Mit immer häufiger auftretenden und schwerwiegenderen Malware-Angriffen sowie der Zunahme fehlerhafter Sicherheitssoftware wird ein hochwertiger Anti-Malware-Schutz von einer vertrauenswürdigen Quelle zum Muss für PC-Anwender von heute. Mit Microsoft Security Essentials können Endkunden sicher sein, dass ihre PCs vor Viren, Spyware und anderer schädlicher Software geschützt sind. Diesen Schutz liefert dieselbe Kerntechnologie, die die Basis für andere weltweit anerkannte Sicherheitsprodukte – wie zum Beispiel Forefront - von Microsoft ist und die von Microsofts professionellem Sicherheits-Reaktionscenter gestützt wird.

    Sicherheitsfunktionen in Microsoft Security Essentials umfassen:

    • Echtzeit-Schutz. Microsoft Security Essentials verwendet einen Echtzeit-Schutz, um Bedrohungen abzuwehren, bevor diese zu einem Problem werden können.
    • Dynamischer Signatur-Service. Zusätzlich zu den Vorteilen eines täglichen Signatur-Downloads bietet Microsoft Security Essentials die Fähigkeit, verdächtige Dateien mit neu identifizierter Malware nahezu in Echtzeit über den dynamischen Signatur-Service abzugleichen. Aktionen unbekannter Quellen, beispielsweise unerwartete Netzwerkverbindungen, die privilegierte Teile des Systems modifizieren oder bösartige Inhalte downloaden könnten, lösen eine Anfrage für ein Update über den dynamische Signatur-Service aus.
    • Rootkit-Schutz. Microsoft Security Essentials umfasst eine Reihe von neuen und verbesserten Technolgien, um eine zusätzliche Verteidigunglinie gegen Rootkits und andere aggressive Bedrohungen zu liefern. Diese Technologien umfassen eine Live-Überwachung des Kernel-Verhaltens, um die Integrität der Kernelstruktur zu gewährleisten, Unterstützung von direkter Datei-System-Syntaxanalyse, um im Dateisystem versteckte schädliche Programme und Dateien ausfindig zu machen und zu entfernen. Hinzu kommt eine verbesserte Live-Entfernung von Rootkits, die dynamisch einen neuen Kernel-Mode-Treiber als Teil des Reinigungsprozesses lädt, so dass auch weiterentwickeltere Rootkits erfolgreich entfernt werden können.

    Einfach herunterladen, einfach verwenden

    Während es heute bereits zahlreiche Sicherheitslösungen im Markt gibt, ist das Modell eines bezahlten Abonnements für die Sicherheit von Verbrauchern nicht in Einklang mit ihren Anforderungen zu bringen. Dazu gehören insbesondere Anwender in sich entwickelnden Märkten, wo Kosten, eingeschränkte Zahlungsmöglichkeiten (beispielsweise per Kreditkarte) und Hardwarebeschränkungen den Einsatz einer umfassenden Sicherheitslösung oftmals verhindern. Um den Forderungen nach einem hochwertigen Schutz ohne den Umstand jährlicher Abonnementerneuerungen oder Kosten und Zahlungsbarrieren nachzukommen, macht Microsoft Microsoft Security Essentials verfügbar. Damit hat auch der Verbraucher die Möglichkeit, mit den neuesten technischen Verbesserungen hinsichtlich der Sicherheit auf dem Laufenden zu bleiben:

    • Kostenfrei erhältlich. Weil Microsoft Security Essentials kostenlos verfügbar ist, sind weder ein langwieriger Registrierungsprozess noch die Übermittlung von Rechnungsdaten erforderlich.
    • Direkter Download. Microsoft Security Essentials ist einfach online direkt bei Microsoft erhältlich. Kunden können so sicher sein, dass sie einen hochwertigen Anti-Malware-Schutz aus einer vertrauenswürdigen Quelle erhalten.
    • Keine Registrierung, Testversion oder Erneuerungen notwendig. Endkunden können durch Testversionen und jährliche Erneuerungen verwirrt sein: In vielen Fällen glauben sie, dass sie über einen aktuellen Anti-Viren-Schutz verfügen, haben aber in Wirklichkeit keinen. Mit Microsoft Security Essentials können Kunden die Software einfach herunterladen, ohne einen komplizierten Registrierungsprozess, und bleiben auch ohne umständliche jährliche Erneuerungen stets geschützt.
    • Immer auf dem aktuellen Stand. Microsoft Security Essentials wird automatisch aktualisiert, um sicherzustellen, dass Signaturen, die Anti-Malware-Enginge und die Anwendungen immer auf dem neuesten Stand sind. Neue Malware-Signaturen werden täglich heruntergeladen und neue Signaturen nahezu in Echtzeit über den dynamischen Signatur-Service verteilt, sobald ein verdächtiges Verhalten bemerkt wird.
    • Ein-Klick-Lösung. Es gibt keine Unsicherheit mehr, ob ein PC eventuell durch zusätzlichen Benutzereingriff geschützt werden muss. Wenn ein Problem die Aufmerksamkeit des Benutzers erfordert, erscheint eine Handlungsaufforderung mit einer entsprechende Schaltfläche und einer vorgeschlagenen Aktion – Anwender können so das Problem einfach mit einem Klick lösen.

    Schutz im Hintergrund

    Microsoft Security Essentials ist so entwickelt, dass es unauffällig und effizient im Hintergrund läuft. Anwender können daher ihren PC mit Windows weiterhin so nutzen, wie sie möchten – ohne sich Gedanken um Unterbrechungen, Pop-up-Fenster oder eine eingeschränkte Systemleistung machen zu müssen. Um PCs ohne Überlastung der Systemressourcen zu schützen, bietet Microsoft Security Essentials folgende Vorteile:

    • Schlankes Design. Weil sich Microsoft Security Essentials auf den Anti-Malware-Kern fokussiert, benötigt es nicht den großen Umfang von gängigen Sicherheitspaketen und verfügt daher über eine kleinere Download-Größe.
    • CPU-Throttling. CPU-Throttling stellt sicher, dass das System des Anwenders schnell auf typische Anwenderaktionen reagieren kann. Dazu gehören Aktionen wie Öffnen von Dateien oder Browserfenstern, Starten von Programmen, Bearbeiten von Dokumenten, Speichern von Dateien etc.
    • Scannen in Leerlaufzeiten. Scans und Updates laufen dann, wenn sich der PC im Leerlauf befindet und als Thread mit geringer Priorität.
    • Cleveres Cachen und aktiver Speicheraustausch. Signaturen, die nicht genutzt werden, nehmen keinen Platz im verfügbaren Speicher ein. Damit ist Microsoft Security Essentials auch sehr gut für ältere PCs und aktuelle Geräte mit geringerer Hardwareausstattung geeignet.

    Microsoft Security Essentials Systemanforderungen

    • Betriebssystem (32bit & 64bit)
      • Windows XP SP2
      • Windows XP SP3
      • Windows Vista
      • Windows 7
    • Windows XP:
      • Prozessor mit einer Taktrate von 500 MHz oder mehr
      • 256 MB Arbeitsspeicher oder mehr
    • Windows Vista und Windows 7:
      • Prozessor mit einer Taktrate von 1,0 GHz oder mehr
      • 1 GB Arbeitsspeicher oder mehr
    • Grafikkarte/Monitor: 800x600 oder höher
    • Festplattenspeicher: 140 MB verfügbaren Festplattenspeicher
    • Eine Internetverbindung wird für die Installation sowie das Herunterladen der aktuellen Viren- und Spyware-Definitionen von Microsoft Security Essentials benötigt.
  • T-23: Suchen mit der Windows Shell

    Gastposting von Oliver Scheer, Developer Evangelist - Windows, Silverlight und UI-Technologien bei der Microsoft Deutschland GmbH.

    23_2Nur noch 23 Tage bis zum Launch von Windows 7.

    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.

    Das Video des Tages

    Get Microsoft Silverlight

  • T-24: Die Multifunktionsleiste

    Gastposting von Oliver Scheer, Developer Evangelist - Windows, Silverlight und UI-Technologien bei der Microsoft Deutschland GmbH.

    24_0Nur noch 24 Tage bis zum Windows 7 Launch.

    Heute befassen wir uns mit einem alten Bekannten: der Multifunktionsleiste. 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).

  • T-25: Multitouch für den Endbenutzer

    Gastposting von Oliver Scheer, Developer Evangelist - Windows, Silverlight und UI-Technologien bei der Microsoft Deutschland GmbH.

    25_1Noch 25 Tage bis zum Launch von Windows 7.

    Heute dreht sich alles um die Multitouch-Fähigkeiten unter Windows 7.

    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

    Das Video des Tages heute mit Clemens Lutsch (UXE = User Experience Evangelist)

    Get Microsoft Silverlight