grafische Textausgabe außerhalb eines Frames



  • Hi,

    eigentlich wollte ich diese Sache in java realisieren(wie der Rest von dem Projekt), damit komme ich wohl aber bei folgendem Problem nicht weit:

    Ich möchte gerne außerhalb jedes Containers, also direkt auf dem aktuellen Bildschirm (unabhängig von den geöffneten Fenstern) Text ausgeben. Also wie Untertitel in einem Film.

    Wichtig ist, dass das ganze nicht anklickbar ist und die Controls dahinter anklickbar bleiben. Man kennt das evtl. von Notebooks wenn man die Helligkeit oder die Lautstärke ändert.
    Ein Frame (weder in Java noch in C) kann ich wohl nicht so konfigurieren dass es diese Anforderungen erfüllt.

    in C++ bin ich leider nicht so fit wie in java, daher frage ich hier nach Tips. Alles was ich bisher an grafischen Ausgaben gefunden hab, ist eben die "klassische" GUI in einem Frame.

    Was absolut spitze wäre, wenn es bereits von Windows eine .dll geben würde, die Methoden dafür beinhaltet und ich dann nur noch über JNI darauf zugreifen müsste.
    Wenns das nicht gibt, dann muss ich wohl ein C++ Programm dafür schreiben, die Methode bereitstellen, als .dll kompilieren und dann mit JNI zugreifen. Dazu müsst ich aber wissen wie man sowas realisieren könnte.

    Kann mir hier jemand bissl Starthilfe geben? Oder hat jemand eine Idee, wie man sowas eleganter lösen kann?

    Bin dankbar für jeden kleinen Tip 🙂



  • Also ums mal kurz zusammenzufassen: Du weißt nicht, wie du etwas in Java umsetzen sollst, deshalb fragst du, wie du es in C++ umsetzen kannst, weil du es dort erst recht nicht weißt?

    So oder so bist du im falschen Forum. Standard-C++ kennt keine Grafikausgabe oder ähnliches, da wirst du dir das passende Framework suchen müssen. Da das Thema grob unter "Grafik" anzusiedeln ist schick ich dich mal ins entsprechende Forum.

    PS: die Anzeige auf Bildschirmen bei Lautstärkeregelungen etc. ist ein reines Hardwarefeature. Da hat das Betriebssystem oder andere Programme keine Aktien drin. Genau sowas wirst du sicherlich nicht hinbekommen.



  • Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ (auch C++0x, bzw. C++11) in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke für die Antwort, mit der Zuteilung ins richtige Forum hab ich mir bissl schwer getan.

    Ich wills nicht in C++ machen, weil ichs in Java nicht hinkriege, ich wills in c++ machen weil ich glaube dass Java so etwas gar nicht kann. Wenn Java so etwas können würde, würd ichs gern in Java machen.
    Ich lass mich hier gerne eines Besseren belehren, wenn jemand der Meinung ist dass man sowas mit Java hinkriegen kann. Das wär der für mich optimalste Fall.

    Dass mein Beispiel ein reines Hardwarefeature is, is mir klar. Ich habs ja nur angeführt, damit man sich eine Vorstellung machen kann von dem was ich gerne haben würde.

    Passendes Framework... Naja, wenn ich mit c++ allein nicht auskomme, Visual C++?
    Ich weiß auch nicht so recht, drum poste ich ja hier - Brauche nen Ansatz zum Starten von jemandem, der in dem Bereich evtl. bissl mehr Erfahrung hat als ich und die Frameworks und Technologien besser kennt.
    Den Syntax und die Prinzipien kann ich mir dann selber zusammensuchen, aber wenn ich einen Nagel in die Wand schlagen soll, will ich nicht mit nem Schraubendreher als Werkzeug davor stehen und das versuchen.
    Wenn mir wer die richtige Richtung zeigen könnte, müsst ich nicht jede Sackgasse ausprobieren vorher 🙂



  • Na ja, das dürfte mit der WinAPI ziemlich problemlos sein. Du brauchst nicht mal ein Fenster zu erstellen. Ein Icon in der Iconbar dürfte reichen, du holst dir halt das Handle vom Desktop und gibst da drauf Text aus. (Textausgabe geht auch nur mit einem Konsolenprogramm.)

    Mal Quick & really Dirty:

    #include <Windows.h>
    
    int main()
    {
      HFONT font = (HFONT)GetStockObject(SYSTEM_FONT);
      HWND desktop = GetDesktopWindow();
      HDC hdc = GetDC(desktop);
      SelectObject(hdc, font);
      while (1)
      {
        char text[] = "Hallo, Welt";
        TextOut(hdc, 50, 50, text, sizeof(text) - 1);
        Sleep(1);
      }
    }
    

    Ansonsten würde es noch die Möglichkeit über DirectX geben, aber das scheint mir ungleich komplizierter.



  • Der Wahnsinn, vielen Dank!

    Dass das so einfach geht dacht ich echt nicht.
    Erfüllt alles was ich brauche, die controls im Hintergrund bleiben bedienbar, kein Frame, perfekt!

    Jetzt weiß ich was ich brauche, werd mich bissl in die WindAPI einlesen und schaun was es da so an Methoden gibt, und wie ich den Hintergrund transparent mache und so weiter.
    Aber das krieg ich sicher hin da ich nun weiß wo ich suchen muss, vielen Dank nochmal!



  • Hurra, geschafft!

    wollt mich nochmal bedanken, mit deiner Hilfe hab ich nun das Grundlegende fertig.

    .cpp code erstellt mit deiner Hilfe, .dll erstellt, mit JNI zugegriffen. Das alles is echt nicht einfach wenn man das das erste mal macht, habs aber nun endlich geschafft.

    Meine größten Probleme:

    -aus der java Datei die headerdatei generieren (Datei wurde nicht gefunden, obwohl sie da war) Problem war hier das package, Lösung war hier dass man die Datei samt Package angeben muss, also -classpath auf den src Ordner setzen, und dann package.datei angeben. (da hab ich echt lange gesucht)

    -die TextOut Methode will als dritten Parameter kein char[] sondern einen LPCWSTR im VisualStudio. Wenn ich als IDE CodeBloxx nehme, klappts mit einem char[]. Kann man zwar konvertieren(A2BSTR(char_string) in atlconv.h), aber warum das so ist, ist mir nach wie vor ein Rätsel...ich mein, das muss doch unabhängig sein von der Entwicklungsumgebung oder vom Compiler, ist ja in beiden Fällen die gleiche Funktion von der windows.h 😕

    -Parameterübergaben: c++ und java Typen passen nicht immer zusammen, da half nur duku lesen 🙂

    Vielleicht hilfts ja jemandem, der auch mal sowas machen muss und wie ich, noch nicht so viel gemacht hat in dem Bereich



  • zu deinem zweitens punkt: man kann bei den compileroptionen entscheiden, ob man char oder wchar_t nutzen will, sprich eben den char*(LPCSTR) oder den wchar_t*(LPCWSTR). bei visual studio ist das unicode(W) oder multibyte(kein wchar_t) zeichensatz verwenden...



  • Ich muss diesen Thread nochmal ausgraben, weil mir aufgefallen ist, dass ich hier noch ein encoding Problem hab beim übergeben des Strings von java auf c++.

    Umlaute werden falsch dargestellt, sprich 'ä', 'ü' und so weiter auf eine komplett falsche weise.
    Java verwendet doch Unicode, im Visual Studio ist auch Unicode eingestellt. System ist Windows 7 64 bit, englsch und auch auf american englisch eingestellt.

    Welche Probleme könnts hier geben, also wo muss ich ansetzen? Java, C++ oder beim System?


Anmelden zum Antworten