Text anzeigen - TextOut ?



  • supersass1 schrieb:

    cool danke, keine Fehlermeldung mehr.

    Allerdings erhalte ich folgendes MessageBox:

    war3.exe - Abbild fehlerhaft
    Die Anwendung oder DLL c:\injwc3.dll ist keine gültige Windows-Datei....

    Kann man das ausschalten?!

    und, es wird kein Text in Warcraft angezeigt 😞

    wer/was gibt dir diese message box aus? warcraft?
    bist du sicher, dass die Datei C:\injwc3.dll existiert?
    Hast du sie als dynamische link library auch kompiliert?

    Und wie gesagt: wenn es funktioniert siehst du auch erst text wenn du in einem spiel bist.



  • wow, es klappt. Lag am Compiler, den von CodeBlocks hat keine vernünftige DLL Kompilierung, im Prinzip gar keine.

    Kannst du mir vielleicht mal deine injwc3.dll schicken?
    Weil wie gesagt, ich habe nur diese "Billig" Version, und muss immer den OK Button klicken.

    p.s. ich seh grad, kann man hier gar keine Dateien anhängen?



  • Ich sehe wenig sinn darin, dir meine dll-datei zu schicken, da du nur im 2-sekunden intervall "nachricht xx" siehst.
    Lade dir doch das Visual Studio Express runter - das ist kostenlos und hat diese nervige Meldung nicht.
    Wenn du trotzdem meine Dll haben willst: http://rapidshare.com/files/26124524/injwc3.dll.html .
    Ich sprech dich auch mal in TFT an, wenn du on bist.
    @CodeFinder: Jo das hab ich auch gelesen, ich wüsste aber auch gerne wieso 😛 😃 . Also es funktioniert ... 😃



  • ja hast eigentlich Recht 😉
    Okay, wegen Express werd ich machen. Dankeschön 🙂



  • geh mal in wc3 on, ich whisper dich an.
    Oder du mich: SilverSIut ist mein Nick.



  • bin ich



  • @supersass1:
    Was hat man eigentlich davon wenn man sich einen String anzeigen lässt ? Ev. ist TextOut () nach wie vor die bessere Lösung.

    @Black Shadow:
    Bau doch in die "void PrintThread(void *p)" noch eine GetMessage () - Schleife. Dann kannst Du mit dem Thread "kommunizieren". 🙂



  • @merker:

    ich verstehe dich. aber was bringt mit ein Text-Anzeige mittels TextOut() die flackert, und fast kaum lesbar ist. Zumidnest nicht angenehm?!

    Ich weiß ja nicht was es noch für Möglichkeiten gibt..



  • Das Flackern lässt sich nicht verhindern weil das Fenster ständig neu gezeichnet wird. Reicht es nicht aus wenn der Text auf Tastendruck kurz eingeblendet wird ?
    Dann stört das Flackern nicht so sehr :

    HWND hWnd = FindWindow (0,...);
    ...
    while (1) {
    
     if ( GetAsyncKeyState (0x42) & 0x8000 ) { break; } // VK_B (programmende)
     if ( GetAsyncKeyState (0x41) & 0x8000 ) {          // VK_A (text einblenden)
    
      LONG cnt = 0;
    
      while ( 1 ) {
       HDC hDC =
       GetWindowDC  (hWnd);
       SetBkMode    (hDC,TRANSPARENT);
       SetTextColor (hDC,RGB(0xFF,0x00,0xFF));
       TextOut      (hDC,50,50,szText,sizeof(szText)-1);
       ReleaseDC    (hWnd,hDC);
    
       cnt += 1; if ( cnt > 100000 ) { break; }         // anpassen an cpu-geschwindigkeit
      }
    
     }
     Sleep (10);
    }
    


  • okay, das wäre eine Möglichkeit. Ich hab mal so überlegt, es muss auch gar nicht die ganze Zeit angezeigt werden.

    Danke schon mal für all' eure Beiträge.

    Noch eine Frage:
    Wie erfahr ich die Bildschimrauflösung, unter der ein Programm läuft? Oder geht das jetzt schon eher in Richtung DirectX? Falls ja, kann mir da wer Lehrmaterial empfehlen?!

    mit freundlichen grüßen 😃



  • Also, es gibt ein Programm für wc3 (banlist-tool) das lässt einen Text Flackerfrei anzeigen:

    Pic: http://bildrian.de/n/b/58b89334ad8dfae7.bmp

    Soetwas in der Art hatte ich mir auch vorgestellt.
    Lässt sich also sowas mit Overlays darstellen?
    sprich: http://www.gamedev.net/community/forums/topic.asp?topic_id=359319

    mit freundlichen Grüßen
    supersass1



  • Ich würde diese Thread gerne nochmal hervorholen.

    Ich musste mich zwangsweise (Schule,...) mit Delphi beschäftigen. Da uns in der Schule nicht viel beigebracht wird, habe ich nachmittags gesessen und "herumgespielt". Dabei habe ich ein Programm entwickelt, das einen rotierenden Kreis auf dem Desktop flimmerfrei anzeigen lässt. Dazu habe ich die Canvas-Funktionen quasi in ein Bitmap gezeichnet, damit es nicht flimmert, als ich nur die Canvas benutzt habe, flimmerte es.

    Nun denke ich, wenn ich die TextOut-Funktion von C**++** in ein Bitmap packe, und es dann anzeigen lasse, dass es dann nicht flimmert?

    Was denkt ihr, ist das sinnvoll?

    viele liebe Grüße
    supersass1 🙂



  • also ich würde es lassen, weil es dann mit sicherheit anfängt zu haken.
    Aber versuch doch mal dein TextOut auf das offene Fenster anzupinnen, dann steht es bestimmt auch da.
    Und sag mal bescheid dann, wie du es hinbekommen hast ;-).
    Das INteressiert hier mit Sicherheit viiiiiele.



  • was meinst du mit "anpinnen"?
    Meinst du sowas wie bei Linux z.b. K3b tut, wenn man brennt?
    In Windows weiß ich grad kein Beispiel...

    Aber nochmal zum Bitmap, mein rotierender Kreis hakt ja auch nicht auf dem Dekstop, oder meinst du im Spiel ist das noch etwas anderes?



  • was meinst du mit "anpinnen"?

    Damit meinte ich, das der Text immer im Vordergrund gehalten wird, und es kein anderes Fenster überschirmt.



  • Sers, hab sowas ähnliches für WoW gemacht, wobei ich in WoW ein Fenster anzeigen lasse, indem der aktuelle Songtext aus Winamp angezeigt wird.
    Hab das folgendermaßen gemacht:

    //Fenster erstellen bei Titelwechsel
    void CreateEmbWindow(void)
    {
        if(KeepEmbUpTimerProc && hEmbWindow)//Falls der StayOntopTimer noch da is zerstören
            KillTimer(hEmbWindow, 1);
    
        if(hEmbWindow)//Falls es schon da ist zerstören
         {
            DestroyWindow(hEmbWindow);
            hEmbWindow = NULL;
            UnregisterClass("GEN_REM_EMB_WND", hInstEmbed);
         }
    
        if(bActEmb)//Wenn es in eine Anwendung eingebettet werden soll
         {
            hWindowToEmb = FindWindow(szClassNameToEmb, NULL);//Fenster der Anwendung suchen szClassNameToEmb is variabel
            if(!hWindowToEmb)//Wenn Anwendung nicht da raus
                return;
    
            hInstEmbed = (HINSTANCE)GetWindowLong(hWindowToEmb, GWL_HINSTANCE);
            WNDCLASS wndclass;
            wndclass.style         = CS_HREDRAW	| CS_PARENTDC;
            wndclass.lpfnWndProc   = EmbbedWndProc;
            wndclass.cbClsExtra    = 0;
            wndclass.cbWndExtra    = 0;
            wndclass.hInstance     = hInstEmbed;
            wndclass.hIcon         = NULL;
            wndclass.hCursor       = LoadCursor( NULL, IDC_ARROW );
            wndclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
            wndclass.lpszMenuName  = NULL;
            wndclass.lpszClassName = "GEN_REM_EMB_WND";
    
            if (!RegisterClass(&wndclass))
                return;
    
            hEmbWindow = CreateWindow("GEN_REM_EMB_WND", NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER, 8, 8,
                                  100, 50, hWindowToEmb, NULL, hInstEmbed, NULL);
    
            if(!bDisplayStayOnTop)//Falls es nicht immer da sein soll, wird das Fenster per Timer nach 5Sekunden zerstört
             {
                fnEmbTimerProc = EmbTimerProc;
                SetTimer(hEmbWindow, 0, 5000, fnEmbTimerProc);
             }
            fnKeepEmbUpTimerProc = KeepEmbUpTimerProc;
            SetTimer(hEmbWindow, 1, 1, fnKeepEmbUpTimerProc);//StayOnTopTimer das das Fenster (TextOut) nicht übermalt wird
         }
    }
    //---------------------------------------------------------------------------
    
    //Callback des TextOut Fensters
    LRESULT CALLBACK EmbbedWndProc(HWND hwnd, UINT uMsg, WPARAM wParam,	LPARAM lParam)
    {
        switch (uMsg)
    	{
    		case WM_CREATE:
             {
    
                    break;
             }
            case WM_PAINT:
             {
                    PAINTSTRUCT ps;
                    RECT rcToolBar;
                    TEXTMETRIC tm;
    
    			    HDC hDC = BeginPaint(hwnd, (LPPAINTSTRUCT) &ps);
                    SetTextColor(hDC,clLime);
    
                    GetClientRect(hwnd,&rcToolBar);
    
                    FillRect(hDC, &rcToolBar, CreateSolidBrush (RGB(0,0,0)));
    
                    SetBkMode(hDC, TRANSPARENT);
    
    //asTitle ist ein globaler AnsiString der Title, Länge, etc enthält
                    if(asEmbSystemState != "")
                        TextOut(hDC, 8, 2, asEmbSystemState.c_str(), asEmbSystemState.Length());
                    else
                        TextOut(hDC, 8, 2, asTitle.c_str(), asTitle.Length());
                    GetTextMetrics(hDC, &tm);
                    EndPaint(hwnd, (LPPAINTSTRUCT) &ps);
    
                    if(asEmbSystemState != "")
                        SetWindowPos(hwnd, HWND_TOP, 0,0,tm.tmAveCharWidth*asEmbSystemState.Length()+16,20, SWP_NOMOVE | SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_SHOWWINDOW);
                    else
                        SetWindowPos(hwnd, HWND_TOP, 0,0,tm.tmAveCharWidth*asTitle.Length()+8,20, SWP_NOMOVE | SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_SHOWWINDOW);
    
                    UpdateWindow(hwnd);
                    asEmbSystemState = "";
    
                    return true;
             }
     }
     return true;
    }
    //---------------------------------------------------------------------------
    
    //OnTop Timer
    VOID CALLBACK KeepEmbUpTimerProc(HWND  hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
    {
        if(hEmbWindow)
         {
            SetWindowPos(hEmbWindow, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_SHOWWINDOW);
            RECT rc;
            GetClientRect(hEmbWindow, &rc);
            InvalidateRect(hEmbWindow, &rc, true);
         }
    }
    //-----------------------------------------------------------------------------
    


  • Geht das auch bei anderen Spielen ?



  • Also bei Minesweeper und Pinball funzts auch 😉

    Sollte bei jedem Windowsspiel gehn, weil ja "szClassNameToEmb" variabel ist und durch "WindowFromPoint" mit folgendem "GetClassName" gesetzt wird.

    mfg

    Edit:
    Muss mich leider korrigieren, im Vollbildmodus von WoW flackert auch diese Lösung, nur im Fenstermodus sieht man den Text ohne flackern...aber vielleicht funktioniert das ganze ja irgendwie mit dxSDK...werd mir das die Tage nochmal anschaun...oder hat jmd noch ne andere Lösung?



  • Ich kann dir nur was zeigen, ich kann dir aber nicht sagen, wie es geht.

    Und zwar handelt es sich dabei um sogenannte Overlays.
    Es funktioniert absolut flimmerfrei, aber ich hab es halt nur irgendwann man gefunden und mich nicht weiter damit beschäftigt, bzw. es war mir zu hoch.

    ich meine ich hatte es auf der Seite gefunden http://www.codeproject.com/
    Aber ich finde es nicht mehr.

    Dennoch habe ich den Ordner gefunden und hochgeladen:
    http://www.loaditup.de/131458.html

    viele grüße
    supersass1 🙂

    P.S.Rashnok
    Ich hab dir ne PN/Mail geschickt.

    //Edit
    ich habe den Link gefunden:
    http://www.gamedev.net/community/forums/topic.asp?topic_id=359319


Anmelden zum Antworten