Text auf Desktop schreiben



  • Hallo,

    ich habe gerade das hier ausprobiert:
    http://www.c-plusplus.net/forum/viewtopic.php?t=39044

    Funktioniert, aber ich muss diese 2 Dinge anders machen:
    1. Der Text muss Transparent sein. Es darf keinen weißen Hintergrund haben.
    2. Der Text muss auf den Desktop geschrieben werden. Wenn z.B. Outlook offen ist, darf es in Outlook nicht sichtbar sein. Es muss quasi aussehen, wie wenn man einen Text in das Hintergrundbild geschrieben hat.

    Jemand eine Idee, wie ich das mache?

    mfg
    trequ



  • trequ schrieb:

    Der Text muss Transparent sein. Es darf keinen weißen Hintergrund haben.

    Das geht so

    pDC.SetBkMode(TRANSPARENT);
    pDC.TextOut(rec.Height()/2,rec.Width()/2," Test ");
    

    trequ schrieb:

    Der Text muss auf den Desktop geschrieben werden. Wenn z.B. Outlook offen ist, darf es in Outlook nicht sichtbar sein. Es muss quasi aussehen, wie wenn man einen Text in das Hintergrundbild geschrieben hat.

    Jemand eine Idee, wie ich das mache?

    Der Text wird auf dem Desktop geschrieben und kann nicht "überlappt" werden,
    da du ja den DC des Desktops holst.

    Gruß
    :: NoName ::



  • Hallo,

    :: NoName :: schrieb:

    trequ schrieb:

    Der Text muss Transparent sein. Es darf keinen weißen Hintergrund haben.

    Das geht so

    pDC.SetBkMode(TRANSPARENT);
    pDC.TextOut(rec.Height()/2,rec.Width()/2," Test ");
    

    Danke! Das funktioniert schon mal wunderbar. Sogar die Farbe kann ich setzen.
    Irgend eine Idee, wie man die Textfarbe abhängig von der Hintergrundfarbe macht?
    Hintergrund = Weiß -> Text = Schwarz
    Hintergrund = Schwarz -> Text = Weiß
    usw...?

    :: NoName :: schrieb:

    trequ schrieb:

    Der Text muss auf den Desktop geschrieben werden. Wenn z.B. Outlook offen ist, darf es in Outlook nicht sichtbar sein. Es muss quasi aussehen, wie wenn man einen Text in das Hintergrundbild geschrieben hat.

    Jemand eine Idee, wie ich das mache?

    Der Text wird auf dem Desktop geschrieben und kann nicht "überlappt" werden,
    da du ja den DC des Desktops holst.

    Gruß
    :: NoName ::

    Ich glaube du hast mich falsch verstanden.
    Wenn ich das Programm Outlook starte und anschließend mein Programm anweise, jetzt etwas auf den Desktop zu schreiben, wird es über Outlook geschrieben.
    Es soll aber "hinter" Outlook erscheinen, damit outlook nicht verdeckt wird.

    mein Code sieht so aus:

    void CMyTestDlg::OnButton() 
    {
    CWnd *pWnd;   // Zeiger auf ein CWnd Objekt 
    CRect rec;    // CRect objekt 
    pWnd = GetDesktopWindow();   // ich hole mir das Dektopfenster 
    pWnd->GetWindowRect(rec);  // hole mir die Aktuelle Auflösung 
    CDC pDC;  // Gerätekontext 
    pDC.m_hDC = ::GetDC(NULL);  // API Aufruf mit dem ich mir das 
                                // Desktop Handle hole. 
    pDC.SetBkMode(TRANSPARENT);
    
    pDC.SetTextColor(RGB(255,255,0));
    pDC.TextOut(2,5," Test 1");
    
    pDC.SetTextColor(RGB(255,100,255));
    pDC.TextOut(50,12," Test 2");
    
    pDC.SetTextColor(RGB(150,2,80));
    pDC.TextOut(90,3," Test 3");	
    }
    


  • Hallo,

    mir fällt gerade was anderes auf:

    Kann man nicht auch ein Fenster "Transparent" machen?

    Das Endergebniss soll etwa so aussehen, wie die Wetter-Info auf diesem Foto:
    http://images.mandrakesoft.com/img/screenshots/mdk100-scr1.jpg
    (Ich weiß, Linux und Windows ist ein Unterschied...)

    mfg
    trequ



  • Hi @all!

    Das ist das erste mal, das ich Code von diesem Forum ausprobiere.
    Bin fortgeschrittener Anfänger, vielleicht kann mir pls jemand helfen.

    Bei obenstehen Code (Text auf Desktop)

    erhalte ich beim kompilieren folgenden Error:
    *error C2440: '=' : 'HWND' kann nicht in 'CWnd ' konvertiert werden

    das bezieht sich auf folgende Zeile:

    pWnd = GetDesktopWindow();   // ich hole mir das Dektopfenster
    

    Kann ich das irgendwie typcasten, oder anders beheben?

    Danke
    lg
    Mike



  • Konnte es selber finden 😉

    Lösung:

    pWnd = CWnd::GetDesktopWindow();
    


  • soweit so gut, das ganze funktioniert ABER:

    1. Der Text bleibt nicht stehen! (wenn man ein Fenster darüber schiebt und dann wieder minimiert ist er wieder weg).

    2. Es dauert eine Zeitlang bis der Text am Desktop steht.

    3. Wie oben schon erwähnt, wird der Text auch über offene Fenster geschrieben (wenn eines offen ist)

    Jemand eine Idee wie man die 3 Probleme lösen könnte?

    Danke
    lg
    Mike



  • trequ schrieb:

    Danke! Das funktioniert schon mal wunderbar. Sogar die Farbe kann ich setzen.
    Irgend eine Idee, wie man die Textfarbe abhängig von der Hintergrundfarbe macht?
    Hintergrund = Weiß -> Text = Schwarz
    Hintergrund = Schwarz -> Text = Weiß
    usw...?

    Ich würde spontan sagen, du musst eine inverse Brush für die Textfüllung setzen. Schau mal in die MSDN.



  • SunB schrieb:

    1. Der Text bleibt nicht stehen! (wenn man ein Fenster darüber schiebt und dann wieder minimiert ist er wieder weg).

    Das liegt daran, dass du den Text immer wieder neu Zeichnen musst...
    Such mal im Board nach Hinweisen.

    SunB schrieb:

    2. Es dauert eine Zeitlang bis der Text am Desktop steht.

    Hmm, hab den Code getestet und bei mir geht es blitzschnell...

    Gruß
    :: NoName ::



  • ad 1. ich werd noch mal suchen ,) (irgendwelche hinweise nach was ich genau suche *ggg* ?)

    ad 2.
    Ich hab eine Konsolenanwendung mit MFC, es dauert ein wenig bis der Text erscheint, keine Ahnung an was das genau liegt.

    thx 4 answer 😉
    Mike



  • Zu 1: Hmm, da du ja eine Konsolenanwendung benutzt, wird es ein wenig
    schwieriger alles immer neu zu zeichnen. Mit neu zeichnen meine ich das
    du den Code, zum schreiben auf dem Desktop, zum Bsp.: jede Sekunde
    aufrufst, damit der Text immer wieder neu geschrieben wird...

    Gruß
    :: NoName ::



  • Hallo,

    ich will im Prinzip nur eine Nachricht auf den Desktop schreiben, wie es z.B. die Logitech Software macht, wenn man auf einen Sonder-Knopf der Tastatur drückt.

    Wie ich den Text transparent auf den Desktop kriege, habe ich bereits rausgefunden.
    Wie ich die Schriftfarbe setze auch.

    Aber wie kriege ich nach x Sekunden den Text wieder weg?
    Mit Leerzeichen überschreiben funktioniert nicht...

    Danke für die Info.

    mfg
    trequ



  • trequ schrieb:

    Aber wie kriege ich nach x Sekunden den Text wieder weg?

    Vielleicht könntest du einfach mit UpdateWindow() oder Invalidate() etc. Das window wo der Text ist aktualisieren. Dann verschwindet der Text, da er ja nicht neu gezeichnet wird...

    Gruß
    :: NoName ::



  • ok, das neu schreiben ist mir klar, kann man ja zum Test in einer Schleife machen. Leider steht der Text dann immer am aktuellen Fenster und nicht direkt auf dem Desktop (hintergrund).
    (jemand dafür noch eine IDee?)

    danke
    lg
    Mike



  • SunB schrieb:

    ok, das neu schreiben ist mir klar, kann man ja zum Test in einer Schleife machen

    In eine Schleife würde ich das nicht machen, es wäre möglich das der Text anfängt zu 'flimmern' ...

    Gruß
    :: NoName ::



  • wenn nicht in einer Schleife, wie dann? (sorry bin anfänger)



  • Hmm, evtl: so

    Du schreibst dir eine eigene Funktion

    int WriteText()
    {
    CWnd *pWnd;   // Zeiger auf ein CWnd Objekt 
    CRect rec;    // CRect objekt 
    pWnd = CWnd::GetDesktopWindow();   // ich hole mir das Dektopfenster 
    pWnd->GetWindowRect(rec);  // hole mir die Aktuelle Auflösung 
    CDC pDC;  // Gerätekontext 
    pDC.m_hDC = ::GetDC(NULL);  // API Aufruf mit dem ich mir das 
                                // Desktop Handle hole. 
    pDC.TextOut(rec.Height()/2,rec.Width()/2,"hallo Chris"); 
      // und schließlich schreibe ich den Text mit dem Dc  
    	return WriteText(); 
    }
    

    Und später natürlich aufrufen

    Gruß
    :: NoName ::



  • Verstehe ich das richtig, dass druch das return WriteText() sich die funktion immer wieder selbst aufruft? und somit im Prinzip durchgehend läuft?

    Mike



  • SunB schrieb:

    Verstehe ich das richtig, dass druch das return WriteText() sich die funktion immer wieder selbst aufruft? und somit im Prinzip durchgehend läuft?

    Ja ...

    Gruß
    :: NoName ::



  • :: NoName :: schrieb:

    SunB schrieb:

    Verstehe ich das richtig, dass druch das return WriteText() sich die funktion immer wieder selbst aufruft? und somit im Prinzip durchgehend läuft?

    Ja ...

    Gruß
    :: NoName ::

    Danke 😉
    lg
    Mike



  • sollte es nicht

    pDC.m_hDC = ::GetDC(pWnd->m_hWnd);

    anstatt pDC.m_hDC = ::GetDC(NULL); heißen?

    mit NULL kriegt man doch keinen Handle zurück oder versteh ich da was falsch?

    lg
    Mike


Anmelden zum Antworten