Thumbnails | Windows API Code Pack

    • C#
    • .NET (FX) 3.0–3.5

    Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Erotix.

      Thumbnails | Windows API Code Pack

      Hi,

      hier direkt ein weiteres Tutorial zum "Windows API Code Pack". Ich werde in diesem mal genauer auf Thumbnails
      eingehen. Im Tutorial werde ich C# verwenden, es gibt online allerdings Converter, sodass dieses Tutorial auch in
      Visual Basic nutzbar ist (oh Wunder). Los gehts.

      1. Was ist das Windows API Code Pack?
      Das Windows API Code Pack (ich nenne es jetzt einfach mal "Code Pack") stellt neue Funktionen bereit, die Entwickler in ihre Programme einbinden können.
      Diese Funktionen sind nur im Code Pack enthalten und nicht im normalen .NET Framework zu finden. Der Download ist hier
      code.msdn.microsoft.com/WindowsAPICodePack
      verfügbar und enthält auch Beispiele von Microsoft, ich werde die kompilierten und notwendigen Dateien aber in den Anhang packen :)

      2. Thumbnails
      Ein Thumbnail ist die Vorschau, die beim Hover über ein TaskbarIcon normalerweise das Fenster anzeigt.

      Ich werde hier darauf eingehen, wie man eigene Buttons einfügt, den angezeigten Ausschnitt festlegt und
      die Preview komplett überschreibt.

      3. Vorbereitung
      Zuerst setzen wir mehrere Verweise, die benötigt werden, und zwar auf Microsoft.WindowsAPICodePack.dll, Microsoft.WindowsAPICodePack.Shell.dll,
      PresentationCore.dll und WindowsBase.dll. Danach importieren wir die nötigen Namespaces, hier sind auch zwei weitere Namespaces angeführt, die die Arbeit
      meiner Meinung nach erleichtern werden.

      C#-Quellcode

      1. using Microsoft.WindowsAPICodePack.Taskbar;
      2. using Microsoft.WindowsAPICodePack.Shell;
      3. using System.IO;
      4. using System.Reflection;


      4. Thumbnail-Buttons
      Ein Thumbnail-Button ist ein kleiner Button unterhalb der Vorschau des Fensters. Als Beispiel werde ich hier erneut Skype verwenden:

      Die Buttons sind normale Buttons, es werden keine Umwege benötigt, um direkt Befehle ans Programm zu senden (d.h. sie haben ein Click-Event).

      Zuerst deklarieren wir einen neuen ThumbnailToolBarButton. Der Konstruktor erfordert ein Icon und einen String, das Icon wird angezeigt, der
      String stellt den ToolTip dar.

      C#-Quellcode

      1. ThumbnailToolBarButton thumbnailButton = new ThumbnailToolBarButton(new Icon("box.ico", 16, 16), "Show MessageBox");


      Danach fügen wir den Button zur ThumbnailToolBar hinzu.

      C#-Quellcode

      1. TaskbarManager.Instance.ThumbnailToolBars.AddButtons(this.Handle, thumbnailButton);

      Zu beachten ist, dass man hier nur einmal Controls hinzufügen kann, weshalb die Funktion ein ParamsArray akzeptiert,
      das bis zu 7 ThumbnailToolBarButtons einbinden kann. Ein einmal eingefügter Button kann ohne den Restart des Programms
      nicht mehr entfernt werden. Es besteht zwar die Möglichkeit, ihn unsichtbar zu machen, allerdings bleibt dann eine
      leere Bar unterhalb der ThumbnailPreview zu sehen.

      Um dem ThumbnailToolBarButton nun seine Funktion zu geben, behandeln wir ganz einfach das Click-Event.

      C#-Quellcode

      1. thumbnailButton.Click += new EventHandler<ThumbnailButtonClickedEventArgs>(handleClick);

      C#-Quellcode

      1. void handleClick(object sender, ThumbnailButtonClickedEventArgs e)
      2. {
      3. MessageBox.Show("ThumbnailButton Example");
      4. }


      Fertig ist es:


      5. Thumbnail-Preview-Clip

      Es besteht ebenfalls die Möglichkeit, den im Preview angezeigten Bereich einzuschränken bzw. selbst zu zeichnen (dazu später mehr).
      Hier erstmal die erste Möglichkeit, also das Einschränken des anzuzeigenden Bereiches.


      Zuerst erstellen wir ein neues Rectangle, um den Bereich festzulegen.

      C#-Quellcode

      1. Point clipPoint = new Point(0, 0);
      2. Size clipSize = new System.Drawing.Size(100, 100);
      3. Rectangle clipRectangle = new Rectangle(clipPoint, clipSize);


      Dann setzen wir den Ausschnitt als Tumbnail. Man könnte das Ganze prinzipiell auch als Einzeiler schreiben.

      C#-Quellcode

      1. TaskbarManager.Instance.TabbedThumbnail.SetThumbnailClip(this.Handle, clipRectangle);


      6. Thumbnail-Custom-Preview

      Anstatt den anzuzeigenden Bereich einzugrenzen, gibt es auch die Möglichkeit, das Preview teilweise oder komplett zu
      überschreiben.

      Hierzu deklarieren wir ein neues Thumbnail und setzen es als Preview.

      C#-Quellcode

      1. TabbedThumbnail customPreview = new TabbedThumbnail(this.Handle, this.Handle);
      2. TaskbarManager.Instance.TabbedThumbnail.AddThumbnailPreview(customPreview);


      Danach müssen wir noch das TabbedThumbnailBitmapRequested-Event behandeln, in dem wir das neue
      Bild als Bitmap bereitstellen müssen. Ich nutze hierfür eine anonyme Methode, ein einfacher Handler tut es aber auch.
      Die Bitmap generiere ich in einer Funktion namens getBitmap.

      C#-Quellcode

      1. customPreview.TabbedThumbnailBitmapRequested += (o, ec) =>
      2. {
      3. customPreview.SetImage(getBitmap());
      4. };

      C#-Quellcode

      1. private Bitmap getBitmap()
      2. {
      3. Bitmap bitmap = new Bitmap(this.ClientSize.Width, this.ClientSize.Height);
      4. Graphics g = System.Drawing.Graphics.FromImage(bitmap);
      5. g.FillRectangle(Brushes.White, new Rectangle(new Point(0, 0), new Size(bitmap.Width, bitmap.Height)));
      6. g.DrawString("NO.", new Font("Arial", 40), Brushes.Black, new PointF(bitmap.Width / 2 - (g.MeasureString("NO.", new Font("Arial", 40)).Width / 2), bitmap.Height / 2 - (g.MeasureString("NO.", new Font("Arial", 40)).Height / 2)));
      7. return bitmap;
      8. }

      Die oben zu sehende Rechnung werde ich jetzt hier nicht weiter erläutern, sie berechnet den Punkt, an dem der Text gesetzt werden muss, um zentriert dargestellt zu werden.

      Das Ergebnis sollte so aussehen:



      Soviel zu Thumbnails.
      Vielen Dank fürs lesen :)

      Grüße,
      Nikx
      Dateien
      "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

      Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
      Sehr schön gemacht! Ist ganz einfach nachzuvollziehen, bis auf eine Kleinigkeit: Unter .Net kann ich irgendwie nicht auf das Click-Event des Thumbnail-Buttons zugreifen. Der Rest funktioniert!
      Alle Angaben sind ohne Gewähr, jedoch mit Pistole. Glücksspiel, Drogen und leckeres Essen können süchtig machen.

      43232069737420636f6f6c21
      Hab gerade eben einen Beitrag abgeschickt und bemerkt, dass ich das falsche Event behandelt habe.
      Hier also noch mal. Du benötigst eine Sub mit den entsprechenden Argumenten und musst dann nur noch
      per AddHandler dem ThumbnailButtonClicked-Event diese Sub zuweisen. @masterm

      VB.NET-Quellcode

      1. Private Sub ThumbnailButtonClicked(ByVal sender As Object, ByVal e As ThumbnailButtonClickedEventArgs)
      2. 'Mach Sachen
      3. End Sub


      VB.NET-Quellcode

      1. AddHandler thumbnailButton.Click, AddressOf ThumbnailButtonClicked


      Viel Spaß damit :)

      Grüße
      "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

      Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Nikx“ ()

      Moin Moin Leute,

      Ich greif das Thema mal erneut auf da ich ein Problem habe aber vieleicht liegt es auch an Windows 10.

      Ich habe mir die Microsoft.WindowsAPICodePack gedownloaden und verweis Hinzugefügt so weit so gut.

      so schaut mein Code derzeit aus:

      VB.NET-Quellcode

      1. Imports Microsoft.WindowsAPICodePack.Taskbar
      2. Public Class Form1
      3. Private WithEvents TB1 As ThumbnailToolBarButton = New ThumbnailToolBarButton(New Icon("D:\Projects\Radio\Radio\bin\Release\Bild-Datein\play_icon.ico"), "Tooltip Text")
      4. Private WithEvents TB2 As ThumbnailToolBarButton = New ThumbnailToolBarButton(New Icon("D:\Projects\Radio\Radio\bin\Release\Bild-Datein\play_icon.ico"), "Tooltip Text")
      5. Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
      6. If TaskbarManager.IsPlatformSupported = True Then
      7. Dim TBM As TaskbarManager = TaskbarManager.Instance
      8. TBM.ThumbnailToolBars.AddButtons(Me.Handle, TB1, TB2)
      9. End If
      10. End Sub
      11. End Class​


      Allerdings bekomme ich bei TBM.ThumbnailToolBars.AddButtons(Me.Handle, TB1, TB2)
      ein Problem er sagt mir denn Fehler:

      Fehler BC30652 Es ist ein Verweis auf die Assembly "PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" erforderlich, die den Typ "UIElement" enthält. Fügen Sie dem Projekt einen Verweis hinzu.


      Kann mir eventuell einer Weiterhelfen ?
      Vielen Dank.
      Den selben Fehler?
      "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

      Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
      Wenn der Fehler immernoch ist, dass kein Verweis auf PresentationCore besteht, dann überprüf bitte noch mal deine Verweise.

      Grüße
      "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

      Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
      Dieses Tutorial ist uralt - seit .NET 4.0 sind entsprechende Klassen zur Steuerung der Win7+-Taskbar direkt im Framework enthalten:

      msdn.microsoft.com/en-us/libra…dows.shell(v=vs.100).aspx

      Und die Fehlermeldung ist doch ziemlich eindeutig: Das WinAPICodePack erwartet eine .NET 3.0-Assembly, die du in .NET 4+ natürlich nicht findest.
      | Keine Fragen per PN oder Skype.
      @SeriTools Die Nutzung von .NET 4 mit dem Api Code Pack stellt eigentlich kein Problem dar. Woher nimmst du die Info?

      Grüße
      "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

      Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!