Text auf Transparenten Fenster



  • Hi, ich habe ein Transparentes Fenster erstellt klappt auch alles wunderbar 🙂
    Jetzt soll auf den Fenster ein Text erscheinen den man auch sehen soll .... was leider nicht klapt hab normal mit DrawText probiert geht aber nicht der text erscheint garnicht erst wenn das Fenster das Style WS_EX_TRANSPARENT bekommt ohne das funzt es wunderbar.

    Hat jemand also eine idee wie ich auf einen Transparenten Fenster einen Text ausgeben kann????

    mfg



  • So.. ich hab das mal probiert.. auf dem Fenster hab ich nicht geschafft.. aber man kann ja einfach auf den Bildschirm zeichnen :D... hier der Code:

    // winapi_test: main.cpp
    #include <windows.h>
    
    // ------------------------------------------------------------------------------------------- //
    
    LRESULT CALLBACK MainProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam);
    
    // ------------------------------------------------------------------------------------------- //
    
    #define MY_TIMER 5000
    
    // ------------------------------------------------------------------------------------------- //
    
    HINSTANCE hInst;
    HWND hMainWnd;
    HWND hMainLbl;
    
    // ------------------------------------------------------------------------------------------- //
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    {
        hInst = hInstance;
    
        WNDCLASSEX main;
        main.cbSize = sizeof(main);
        main.cbClsExtra = 0;
        main.cbWndExtra = 0;
        main.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
        main.hCursor = LoadCursor(0,IDC_ARROW);
        main.hIcon = LoadIcon(0,IDI_APPLICATION);
        main.hIconSm = LoadIcon(0,IDI_APPLICATION);
        main.hInstance = hInst;
        main.lpfnWndProc = MainProc;
        main.lpszClassName = "test_wnd";
        main.lpszMenuName = 0;
        main.style = CS_HREDRAW | CS_VREDRAW;
    
        RegisterClassEx(&main);
        hMainWnd = CreateWindowEx(WS_EX_TRANSPARENT,"test_wnd","Transparenter Test",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,200,200,0,0,hInst,0);
        ShowWindow(hMainWnd,SW_SHOW);
        UpdateWindow(hMainWnd);
    
        SetTimer(hMainWnd,MY_TIMER,200,0);
    
        MSG msgMain;
        while(GetMessage(&msgMain,0,0,0))
        {
            TranslateMessage(&msgMain);
            DispatchMessage(&msgMain);
        }
    
        return msgMain.wParam;
    }
    
    // ------------------------------------------------------------------------------------------- //
    
    LRESULT CALLBACK MainProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
    {
        switch(nMsg)
        {
    
        case WM_TIMER:
            {
                switch(wParam)
                {
    
                case MY_TIMER:
                    {
                        HDC hDC = CreateDC("DISPLAY",0,0,0);
    
                        TextOut(hDC,300,300,"TEST!!!",strlen("TEST!!!"));
    
                        DeleteDC(hDC);
                    } break;
    
                }
                return 0;
            }
    
        case WM_DESTROY:
            {
                KillTimer(hMainWnd,MY_TIMER);
                PostQuitMessage(0);
                return 0;
            } break;
    
        }
    
        return DefWindowProc(hWnd,nMsg,wParam,lParam);
    }
    


  • AHH *KNUUUTSCH* 😉 boar ich könnt ahh goil hehe auf die idee bin ich garnich gekommen grml heheh

    thx thx funzt gut 🙂



  • Kein Problem :D. Da ist man gleich gut drauf, wenn man im Forum auch mal jemandem helfen kann, und nicht immer nur den Unwissenden spielen muss :)...



  • HEHE jo 🙂

    ma sehen ob du mir diesma auch helfen kannst 😉 also das klappt ja alles wunderbar bisher allerdings soll der text nach 2 sec wieder verschwinden das mit den Timer is ja kein problem allerdings wie bekomme ich den Text wieder vom Bildschirm ohne mit einen Fenster drüber zu gehen???
    Gibs da auch sone einfache funktion um einen Text der mit TextOut gezeichnet wurde wieder zu entfernen??

    Dann noch ne allegemein Frage, ist der Text den ich so male IMMER im vordergrund?? also auch wenn ich z.b. ein spiel spiele??? hatte noch keine zeit das zu testen 🙂

    mfg



  • Hmm... zu deiner zweiten Frage: Ich glaub schon.. aber du wirst ihn beim Spiele spielen schätz ich mal nicht sehen... weil die Framerate eines Spieles als 5/fps. Dann könnte man natürlich den Timer schneller machen... Wie man den Text wieder wegmacht... gute Frage :D... ich probier's gleich mal aus! 🙂

    cu 🕶



  • // winapi_test: main.cpp
    #include <windows.h>
    
    // ------------------------------------------------------------------------------------------- //
    
    LRESULT CALLBACK MainProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam);
    
    // ------------------------------------------------------------------------------------------- //
    
    #define MY_TIMER 5000
    
    // ------------------------------------------------------------------------------------------- //
    
    HINSTANCE hInst;
    HWND hMainWnd;
    HWND hMainLbl;
    
    int timer_count = 0;
    
    // ------------------------------------------------------------------------------------------- //
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    {
        hInst = hInstance;
    
        WNDCLASSEX main;
        main.cbSize = sizeof(main);
        main.cbClsExtra = 0;
        main.cbWndExtra = 0;
        main.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
        main.hCursor = LoadCursor(0,IDC_ARROW);
        main.hIcon = LoadIcon(0,IDI_APPLICATION);
        main.hIconSm = LoadIcon(0,IDI_APPLICATION);
        main.hInstance = hInst;
        main.lpfnWndProc = MainProc;
        main.lpszClassName = "test_wnd";
        main.lpszMenuName = 0;
        main.style = CS_HREDRAW | CS_VREDRAW;
    
        RegisterClassEx(&main);
        hMainWnd = CreateWindowEx(WS_EX_TRANSPARENT,"test_wnd","Transparenter Test",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,200,200,0,0,hInst,0);
        ShowWindow(hMainWnd,SW_HIDE);
        UpdateWindow(hMainWnd);
    
        SetTimer(hMainWnd,MY_TIMER,200,0);
    
        MSG msgMain;
        while(GetMessage(&msgMain,0,0,0))
        {
            TranslateMessage(&msgMain);
            DispatchMessage(&msgMain);
        }
    
        return msgMain.wParam;
    }
    
    // ------------------------------------------------------------------------------------------- //
    
    LRESULT CALLBACK MainProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
    {
        switch(nMsg)
        {
    
        case WM_TIMER:
            {
                switch(wParam)
                {
    
                case MY_TIMER:
                    {
                        timer_count++;
                        if(timer_count <= 10)
                        {
                            HDC hDC = CreateDC("DISPLAY",0,0,0);
    
                            TextOut(hDC,300,300,"TEST!!!",strlen("TEST!!!"));
    
                            DeleteDC(hDC);
                        }
                        else
                        {
                            KillTimer(hMainWnd,MY_TIMER);
                            ShowWindow(hMainWnd,SW_SHOW);
                            MoveWindow(hMainWnd,290,290,200,200,TRUE);
                            ShowWindow(hMainWnd,SW_HIDE);
                            exit(0);
                        }
                    } break;
    
                }
                return 0;
            }
    
        case WM_DESTROY:
            {
                KillTimer(hMainWnd,MY_TIMER);
                PostQuitMessage(0);
                return 0;
            } break;
    
        }
    
        return DefWindowProc(hWnd,nMsg,wParam,lParam);
    }
    

    So... ich hab's gleich noch mit SW_HIDE gemacht, so wird das Programm auch nicht mehr in der Taskleiste angezeigt... zum Löschen des Textes mach ich das Fenster einfach kurz sichtbar, schiebe es auf den Text und verstecke es sofort wieder. Dumme Methode, aber es funktioniert :D!

    cu 🕶



  • Man das geht ja schnell mit dir *G* 🙂

    ich teste das mal mit den spiel hehe dann muss ich das ja echt mitn timer machen *G* naja was solls

    binma gespannt ob du das schaffst hehe *hoff*



  • Ja, war rein zufällig mal online... bin das ja nur so 28 Stunden am Tag ;)...



  • hehe lol 😉

    na kommst auch net weiter??? *fg* ich auch net 😞 grml is doch ein sch**** hehe



  • Was? Meinst du das der Text auch in Spielen angezeigt wird? Wart... ich kann's ja mal probieren... *amcoderumfuhrwerk* 😃



  • OK.. hier ist der Code und er funktioniert sogar :):

    // winapi_test: main.cpp
    #include <windows.h>
    
    // ------------------------------------------------------------------------------------------- //
    
    LRESULT CALLBACK MainProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam);
    
    // ------------------------------------------------------------------------------------------- //
    
    #define MY_TIMER 5000
    
    // ------------------------------------------------------------------------------------------- //
    
    HINSTANCE hInst;
    HWND hMainWnd;
    
    int timer_count = 0;
    
    // ------------------------------------------------------------------------------------------- //
    
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
    {
        hInst = hInstance;
    
        WNDCLASSEX main;
        main.cbSize = sizeof(main);
        main.cbClsExtra = 0;
        main.cbWndExtra = 0;
        main.hbrBackground = (HBRUSH) GetStockObject(LTGRAY_BRUSH);
        main.hCursor = LoadCursor(0,IDC_ARROW);
        main.hIcon = LoadIcon(0,IDI_APPLICATION);
        main.hIconSm = LoadIcon(0,IDI_APPLICATION);
        main.hInstance = hInst;
        main.lpfnWndProc = MainProc;
        main.lpszClassName = "test_wnd";
        main.lpszMenuName = 0;
        main.style = CS_HREDRAW | CS_VREDRAW;
    
        RegisterClassEx(&main);
        hMainWnd = CreateWindowEx(WS_EX_TRANSPARENT,"test_wnd","Transparenter Test",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,200,200,0,0,hInst,0);
        ShowWindow(hMainWnd,SW_HIDE);
        UpdateWindow(hMainWnd);
    
        SetTimer(hMainWnd,MY_TIMER,200,0);
    
        MSG msgMain;
        while(GetMessage(&msgMain,0,0,0))
        {
            TranslateMessage(&msgMain);
            DispatchMessage(&msgMain);
        }
    
        return msgMain.wParam;
    }
    
    // ------------------------------------------------------------------------------------------- //
    
    LRESULT CALLBACK MainProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
    {
        switch(nMsg)
        {
    
        case WM_TIMER:
            {
                switch(wParam)
                {
    
                case MY_TIMER:
                    {
                        timer_count++;
                        if(timer_count <= 10)
                        {
                            if(GetForegroundWindow() != hMainWnd)
                            {
                                ShowWindow(GetForegroundWindow(),SW_SHOWMINIMIZED);
                            }
    
                            HDC hDC = CreateDC("DISPLAY",0,0,0);
    
                            TextOut(hDC,300,300,"TEST!!!",strlen("TEST!!!"));
    
                            DeleteDC(hDC);
                        }
                        else
                        {
                            KillTimer(hMainWnd,MY_TIMER);
                            ShowWindow(hMainWnd,SW_SHOW);
                            MoveWindow(hMainWnd,290,290,200,200,TRUE);
                            ShowWindow(hMainWnd,SW_HIDE);
                            exit(0);
                        }
                    } break;
    
                }
                return 0;
            }
    
        case WM_DESTROY:
            {
                KillTimer(hMainWnd,MY_TIMER);
                PostQuitMessage(0);
                return 0;
            } break;
    
        }
    
        return DefWindowProc(hWnd,nMsg,wParam,lParam);
    }
    

    Hat sich eigentlich nicht viel geändert, nur jetzt lässt das Programm in den 2 Sekunden, in denen der Text angezeigt wird, kein anderes Programm in den Vordergrund!

    cu 🙂



  • LoooL du malst einfach ein fenster üben den Text 😉 *G* verkraftet das ein spiel oder springt der gleich zurück in windows???

    will ich nich hoffen *G* ich probier das ma 🙂

    ansonsten schonma thx 🙂

    gibs da nich ne möglichkeit windows zusagen den "display" neu zu zeichnen???? das gleiche macht er ja auch wenn man ein fenster drüber legt 🙂



  • Ich hab's schon mit Spiel probiert... das Spiel wird einfach minimiert! Das war einfach die beste Lösung, die ich gefunden habe.

    cu 😃



  • Rofl neee nich so schön 😉 man soll ja weiter spielen können hehe
    habs ma probiert ohne minimieren der text erscheint einmal und das wars egal was für einen timer ich nehme 1min oder 0.0000000ns 😉

    na was solls dann muss eben die game engine dran glauben und das machen 😃

    ich such noch immer nach einer eleganten lösung um den text vom display zu bekommen ohne ein was drüber zu legen hehe
    ich hoffe das is überhaubt möglich 🙂

    cya



  • Keine Ahnung... da muss glaub ich mal'n Profi her :D!

    Das mit dem Spiel war bei mir auch so... deshalb hab ich's ja auch minimieren lassen :)!

    cu 🕶



  • Genau her mit den profis 🙂

    *loool* ich weiss ja nich, aber wenn da irgendeiner am spielen is und plötzlich minimiert sich alles ;P nene

    Die software von logitech macht sowas ähnliches ich glaub sogar das gleiche kp wie die den text wieder wegbekommen.



  • Ja... CMatt -King- wir flehen euch an! 😉



  • Ja genau bitte bitte helft mir oder uns 🙂

    Es gibt doch für Fenster die funktion InvalidateRect() die das fenster dazu veranlasst sich neu zuzeichnen (WM_PAINT sendet) gibt es sowas ähnliches nicht auch fürs "Display" ??????!!!!?!!



  • Kenn mich zwar noch nicht wirklich gut aus mit der WINAPI und bin mit Sicherheit auch kein Profi *lol*, aber meiner Ansicht nach führt das zu nichts... lieber nochmal darüber nachdenken wie man text auf einem transparenten fenster anzeigt... das sollte sicher irgendwie gehen (der einfachste weg is nicht immer der beste)
    So, genug fachgesimpelt, geholfen hats wahrscheinlich sowieso nicht, dazu hätt ich euch den Code liefern müsssen.. naja mal sehen was die Library dazu zu sagen hat 🙂


Anmelden zum Antworten