7. April 2011

How do I change the mouse cursor to a hourglass?

... in a dotnet Form?


Das ist die leichte Frage ;)


this.Cursor = Cursors.WaitCursor;

To change it back to normal after the application has stopped loading:


this.Cursor = Cursors.Default;

As IntelliSense points out, you can change the mouse cursor to various shapes (crosshair, hand, help, etc.).




... gut, wie gesagt, das war leicht ;)
Aber wie sieht das Ganze aus, wenn man das aus einer statischen Methode machen möchte oder eben außerhalb eines .net control containers?



Cursor.Current = Cursors.WaitCursor; 
Cursor.Current = Cursors.Default;

(wie üblich in VC++ .net werden aus . einfach :: )


oder alternativ:

Application.UseWaitCursor = true;
// Do stuff
Application.UseWaitCursor = false;

... okay, das war jetzt auch nicht viel schwerer xD

Ich hoffe, wenigstens iiiiirgendwem damit geholfen zu haben
und sei es bloß mir selbst, wenn ich das wieder mal vergessen sollte und nachschlagen möchte ^^


happy coding
incredible Leitman

4. April 2011

gemanagte Referenzen in einer nicht gemanagten Klasse speichern


Wenn man C++ CLI und normales C++ in einem Projekt zusammen einsetzt, tauchen früher oder später scheinbar unlösbare Probleme auf. Bei einem Videoplayer den wir zur Zeit programmieren, war es nun soweit.
Um den Programmcode etwas zu entschlacken und den darunter liegenden Algorithmus zur Erstellung eines DirectShow Aufnahmegraphen wieder sichtbar zu machen, wurde es endlich Zeit eine Referenz auf ein gemanagtes Objekt in einer nativen Klasse zu speichern.
Im WPF-Frontend (C#) stellt der Nutzer ein, von welcher Kamera er aufnehmen will und in welches Format das geschehen soll. Diese Konfiguration wird an das Backend (C++) übergeben, in dem schließlich der Aufnahmegraph aufgebaut wird. Dabei kann es sehr viele unterschiedliche Kombination der Konfigurationsparameter geben. Die Art der Kamera (DV, USB, …), die Audioquelle, TimeShift (darüber werde ich bei Gelegenheit auch noch einen Blog-Eintrag schreiben => das war meine Diplomarbeit!) und noch einige mehr spielen hierbei eine Rolle.
Der Aufbau des Aufnahmegraphen erfolgte in einer großen Klasse mit etlichen Funktionen, und immer wieder wurde als Parameter dieser Funktionen ein Parameter vom Typ ICaptureConfiguration^ übergeben. Also habe ich das ganze aufgeflochten und in mehrere Klassen verteilt. Eine abstrakte Basisklasse mit statischen Hilfsfunktionen und einem Interface mit den wichtigsten Methoden, welche dann durch die Detail-Klassen abgedeckt sein müssen. Und um nicht ständig die Konfiguration als Parameter übergeben zu müssen, wird dieser Kontraktur als Member gespeichert.
Doch oh Schreck, was ist das: “Der Typ ICaptureConfiguration^ kann nicht als Membervariable einer nicht C++ CLI Klasse verwendet werden!” Ist ja eigentlich auch logisch, wie soll sonst der Speichermanager der CLR mitbekommen, wann die Referenz nicht mehr gebraucht wird und er das Objekt wieder freigeben kann. Oder noch schlimmer, wenn der Speichermanager des Objekt in seinem Speicher an eine andere Adresse schiebt um Platz zu schaffen, wäre die Referenz plötzlich ungültig! Es gibt nun nur zwei Möglichkeiten: entweder alles auf C++ CLI umstellen, was mindesten 100 Tage oder mehr dauern würde oder aber doch einen Weg finden, die Referenz zu speichern.
Dank google, der MSDN und anderen Seiten ist es mir zum Glück schließlich doch gelungen die Referenz zu speichern. Genau dafür gibt es nämlich das Template gcroot. Es sorgt dafür, dass die zugewiesene Referenz immer erreichbar ist. Da man solch eine Referenz immer mit delete wieder freigeben müsste, ist es besser man nutzt auto_gcroot. Das wird nämlich wie alle Wrapper dieser Art automatisch freigegeben. Im Code sieht das ganze dann in etwa so aus:
#include 
#using 

using namespace System;
...

class CCaptureMgrBase
{
    CCaptureMgrBase(ICaptureConfiguration^ captureConfig)
    {
        m_captureConfig = captureConfig;
    }
    ...
    msclr::auto_gcroot m_captureConfig;
}
Mit –> kann man nun ganz normal auf die Referenz zugreifen und Funktionen aufrufen.
Eine kleine Anmerkung habe ich allerdings noch. Man kann m_captureConfig nicht mehr einfach so an eine Funktion übergeben, welche ein ICaptureConfiguration^ als Parameter erwarte! Dafür muss man nunm_captureConfig.get() aufrufen.
class CCaptureMgrBase
{
    ...
    void Render()
    {
        // geht nicht:
        CCaptureMgrBase::Helper(m_captureConfig);

        // so ist es richtig
        CCaptureMgrBase::Helper(m_captureConfig.get());
    }

    static void Helper(ICaptureConfiguration^ captureConfig) { ... }
}

Beitrag "gestohlen" mit freundlicher Unterstützung vom CPlusSharp Blog

Vielen Dank, mit freundlichen Grüßen
Euer incredible Leitman

3. April 2011

Direktlinks auf zeitliche Positionen in YouTube-Videos

Vor Längerem wurde ein lang ersehntes und sinnvolles Feature auf der Video-Plattform YouTube gelaunched: es ist nun eine direkte Verlinkung einer Stelle in einem Video möglich. Wenn sich also beispielsweise bei 5 Minuten und 29 Sekunden eines 8-minütigen Videos eine Stelle befindet, die sich gut eignet, um eine Aussage zu unterstreichen, dann kann direkt auf diesen Punkt verlinkt werden.

Bloß ich merke mir das leider nie, deswegen erstelle ich nun hier diesen lang veralteten, weitaus verspäteten Post:
Das Ganze sieht so aus, hier der normale Link zum YouTube-Video:
und so kann man direkt zur Minute 0 und Sekunde 40 springen:
also einfach an den normalen YouTube-Link ein “#t=” und dann die Zeit in Minuten und Sekunden anhängen (z.B. “2m29“). Bei 0 Minuten war das “0m” bis vor einiger Zeit nicht notwendig, derzeit ist dies allerdings nicht mehr so.
Das gefällt mir sehr gut, da so ohne lästiges Geschnipsel oder etwaige Urheberrechts-Probleme gezielt Zitate aus Videos verwendet werden können. Viel Spaß beim Direkt-Linken ;)
Blog-Beitrag zum Thema im YouTube-Blog (english)