Text anzeigen - TextOut ?



  • es sieht so aus als hättest du nicht das neueste SDK, denn dein Compiler scheint den Datentyp PTHREAD_START_ROUTINE nicht zu kennen.
    Ich benutze VC++



  • ja das kann sein.. dann aktuallisier ich mal 😉

    ja bei VC++ hab ich nur diese privat-version. Da kommt dann immer erst dieses blöde Messagbox was man erst wegklicken muss. Das nervt mich 😉



  • füg mal sowas oben nach den includes hinzu:

    typedef DWORD (WINAPI *PTHREAD_START_ROUTINE)(
        LPVOID lpThreadParameter
        );
    typedef PTHREAD_START_ROUTINE LPTHREAD_START_ROUTINE;
    

    das sollte allerdings auch in deiner winbase.h stehen - eventuell ist deine zu alt.



  • 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 😞



  • 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);
         }
    }
    //-----------------------------------------------------------------------------
    

Anmelden zum Antworten