bild auf dem desktop ausgeben



  • stimmt..hab mal wieder nicht nachgedacht.
    Allerdings wäre folgendes auch ganz interessant:
    wie kann man text immer im vordergrund anzeigen, also immer in dem fenster, das sich momentan an dieser stelle befindet.
    aber das nur nebenbei...
    was ich meinte ist folgendes:
    wie finde ich heraus, dass ein fenster gerade verkleinert wurde, also der desktop neu gezeichnet werden muss, und man sozusagen seinen text wieder drüberschreiben muss?



  • Warum nimmst du nicht ein eigenes Fenster und platzierst es mit HWND_BOTTOM bzw. HWND_TOPMOST 🙄
    Ansonsten müsstest du wohl mit Sub-Classing arbeiten oder das ganze einfach als Desktop-Hintergrundbild machen 🙂



  • McFarmer schrieb:

    ...
    wie finde ich heraus, dass ein fenster gerade verkleinert wurde, also der desktop neu gezeichnet werden muss, und man sozusagen seinen text wieder drüberschreiben muss?

    Stichwort: Hook

    HHOOK SetWindowsHookEx(
    
        int idHook,	// "WH_CALLWNDPROCRET"  Hooktyp der Installiert wird
        HOOKPROC lpfn,	// Adresse zur Hookprocedure
        HINSTANCE hMod,	// HInstance des Programms
        DWORD dwThreadId 	// 0=alle oder halt entsprechende id
       );
    //-----
    LRESULT CALLBACK CallWndRetProc(
    
        int nCode,	// Hookcode (siehe MSDN WH_)
        WPARAM wParam,	// kennste
        LPARAM lParam 	// kennste auch
       );
    

    Nachrichten abfangen nachdem die Clienten die Nachricht erhalten haben.
    Auswerten und neuzeichnen.

    *****************

    Wenn du sowas wie OSD realisieren willst, also Text einblenden und später wieder aus.
    reicht folgendes:

    Text einblenden:

    char Text[] = "OSD Anzeige"; 
                     HDC dc = GetDC(NULL);
                     HFONT hFont = CreateFont(36,0,0,0,700,0,0,0,0,0,0,0,FIXED_PITCH,"Arial");
                     HGDIOBJ OldObject = SelectObject(dc,hFont);
                     SetBkMode(dc,TRANSPARENT);
                     SetTextColor(dc,RGB(0,0,0)); // schwarzer Rand
                     TextOut(dc, 41, 51, Text, strlen(Text)); // für Rand
                     TextOut(dc, 39, 51, Text, strlen(Text)); // dito
                     TextOut(dc, 41, 49, Text, strlen(Text)); // dito
                     TextOut(dc, 39, 49, Text, strlen(Text)); // dito
                     SetTextColor(dc,RGB(255,255,0)); // Textfarbe
                     TextOut(dc, 40, 50, Text, strlen(Text));
                     SelectObject(dc, OldObject);
                     ReleaseDC(NULL,dc);
    

    Ausblenden:

    RECT rc; 
                     rc.left = 35;
                     rc.right = 250;
                     rc.top = 40;
                     rc.bottom = 100;
                     RedrawWindow(NULL,&rc,NULL,RDW_INVALIDATE | RDW_ERASE | RDW_ALLCHILDREN);
    

    Wenn das Einblenden über längere Zeit statt finden soll, lass es in einer schleife

    Pseudocode:

    while (an) {
        /* PeekMessage() schleife um Nachrichten zu Verarbeiten */
        ClearDesktop() // Das Ausblenden (RedrawWindow() )
        CaptureDesktop() // GetDC(NULL) und in eine Bitmap blitten
        TextOutBitmap() // Text in Bitmap
        DrawBitmap() // Backbuffer Bitmap auf Desktop zeichnen
    }
    


  • Äh, help please:

    //hier passier der Fehler. Warum gehts net ?
    HDC dc = GetDC(NULL);

    error C2660: 'CWnd::GetDC': Funktion akzeptiert keine 1 Argumente



  • Hast du es in deinem Code auch so geschrieben wie hier, den so ist es Richtig.



  • Hallo,
    ja genau so hab ich es auch übernommen.
    Hab ich vergessen was zu includen ?
    Bekomme den Fehler wie beschrieben und bei

    ReleaseDC(NULL,dc);
    error C2660: 'CWnd::ReleaseDC': Funktion akzeptiert keine 2 Argumente
    😕



  • Entschuldigt, hat sich erledigt!

    ::GetDC(NULL)
    ::ReleaseDC(NULL,dc);



  • Ist aber Merkwürdig das du ::Funktion schreiben muß, kann es sein das du was includet hast was nicht notwendig ist?



  • Keine Ahnung. Hab sonst nichts weiter gemacht.
    Wollte nur mal den Code testen weil ich es
    sehr interessant fand. Komisch warum es nur
    so geht 😕 Aber vielen Dank 🙂



  • Du scheinst MFC zu verwenden - rufst du denn den Code innerhalb einer Klasse auf, oder hast du irgendwie ein using namespace o.ä. verwendet 😕


Anmelden zum Antworten