Eine Uhr in einer DirectX Anwendung darstellen

    • VB.NET

    Es gibt 45 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

      Eine Uhr in einer DirectX Anwendung darstellen

      Hallo,

      ich möchte euch zeigen wie man mit hilfe einer dll und einem VB-Programm die
      Uhrzeit in eine DirectX Anwendung schreibt/zeigt! Dazu müsst ihr als erstes diesen Packet
      downloaden, darin ist alles enthalten was benötigt wird:

      rapidshare.com/files/224504900/GPP.rar *down*
      mikoweb.eu/downloads/GPP14.zip

      (Die Seite des Erstellers der dll ist: mikoweb.eu)


      In der rar Datei befinden sich 3 Dateien:

      gpcomms.dll <= Muss mit in den Ordner des VB Programms
      d3d9.dll <= Wenn die anwendung DirectX 9 ist muss die Datei in das Verzeichnis wo die exe der Anwendung liegt in der die Uhr angezeigt werden soll
      d3d8.dll <= Wenn die anwendung DirectX 8 ist muss die Datei in das Verzeichnis wo die exe der Anwendung liegt in der die Uhr angezeigt werden soll

      Nun zum VB Programm:

      1. Erstellt eine ganz normale Form Anwendung
      2. Dann erstellt ihr 2 Labels und einen Timer mit den Namen; Label1, Label2 und Timer1 auf der Form
      3. Den Text des Label1 setzt ihr auf "Uhrzeit:" und vom Label2 auf "00:00:00". Und das Interval des Timers auf "100"
      4. Wechselnt nun in das Coding Fenster
      5. Als erstes erstellen wir ein paar Variablen:

      VB.NET-Quellcode

      1. Dim Zeit As String = Nothing
      2. Dim Stunde As String = Nothing
      3. Dim Minute As String = Nothing
      4. Dim Sekunde As String = Nothing


      6. Dann die Function um Text in einer DirectX Anwendung darzustellen unter die deklaration der Variablen:

      VB.NET-Quellcode

      1. Private Declare Function GPSL_SetTextLineData Lib "gpcomms.dll" (ByVal wTextPosX As Short, ByVal wTextPosY As Short, ByVal LPCTSTR As String, ByVal dwTextColor As Integer, ByVal bBlackBackground As Boolean, ByVal cSize As Byte, ByVal bTextBold As Boolean, ByVal cFontFamily As Byte) As Boolean
      2. Private Declare Function GPSL_ShowText Lib "gpcomms.dll" (ByVal bShowIt As Boolean) As Boolean


      7. In Form_Load setzt ihr das:

      VB.NET-Quellcode

      1. Timer1.Enabled = True


      Dadurch fängt die Uhr direkt nach Start der Anwendung an zu Ticken xD

      8. In Timer1_Tick kommt dieser Code:

      VB.NET-Quellcode

      1. Stunde = Now.Hour
      2. Minute = Now.Minute
      3. Sekunde = Now.Second
      4. If Stunde.Length = 1 Then
      5. Stunde = "0" & Stunde
      6. End If
      7. If Minute.Length = 1 Then
      8. Minute = "0" & Minute
      9. End If
      10. If Sekunde.Length = 1 Then
      11. Sekunde = "0" & Sekunde
      12. End If
      13. Zeit = Stunde & ":" & Minute & ":" & Sekunde
      14. Label2.Text = Zeit
      15. GPSL_SetTextLineData(1064, 5, Zeit, Color.FromArgb(255, 255, 0, 0).ToArgb, True, 20, True, 0)
      16. GPSL_ShowText(True)


      Er schreibt die Uhrzeit in ein Variable und dann wird die Uhrzeit über 2 Function aus gegeben. Die Uhrzeit ist so "kompliziert", weil ich nicht will das die Uhrzeit so aussieht "20:2:6"! Ich schreibe immer wenn die Stunden Ziffer, die Minuten Ziffer oder die Sekunden Ziffer nur eine Stelle hat eine Null davor sieht einfach besser aus.

      9. Dann müsst ihr die Anwendung erstellen und die gpcomms.dll müsst ihr in den Ordner kopieren wo die exe des gerade erstellten Programmes liegt. Achtung: Man kann die Anwendung nicht aus VB selbst starten weil er dann die dll nicht findet!

      10. Nun könnt ihrdas Programm starten und anschließend eure DirectX Anwendung, Ihr müsst aber die d3d9.dll bzw. d3d8.dll in das Hauptverzeichnis des DirectX Programmes kopieren. IN der Anwendung müsst die Uhrzeit erscheinen!

      Hier will ich erklären wie ihr die Farbe, die Schriftgröße, die Schriftposition und Schriftfarbe eures angezeigten Textes ändern könnt!
      Das ist die Funktion die dafür zuständig ist:

      VB.NET-Quellcode

      1. GPSL_SetTextLineData(1064, 5, Zeit, Color.FromArgb(255, 255, 0, 0).ToArgb, True, 20, True, 0)


      1064 <= Ist die X Position des Textes
      5 <= Ist die Y Position des Textes
      Zeit <= Ist der Text der angezeigt wird, in diesem Falle eine Variable
      Color.FromArgb(255, 255, 0, 0).ToArgb <= Ist der RGB der Textfarbe
      Das erste "True" <= Wenn True hat der Text Schwarzen Hintergrund
      20 <= Ist die Schriftgröße
      Das zweite "True" <= Wenn True ist der Text Fettgedruckt
      0 <= ist die Fontfamily, 0 ist die Standart Schriftart 1 ist z.B. Arial soweit ich weiß

      Das war es auch schon. Ich werden das Tuorial bald ergänzen und dann zeigen wie man Bilder darstellt und ander Dinge!


      @Mod oder Admin: Bitte in Tipps und Tutorial Sektion verschieben!

      MFG

      Werewolve :thumbsup:

      Edit by Mad Andy: Download-Link aktualisiert

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mad Andy“ ()


      @Mod oder Admin: Bitte in Tipps und Tutorial Sektion verschieben!

      Kann ich dagegen stimmen?

      In TuT sollte wenn möglich (IMHO!) "schöner" Code stehen.


      Dim Stunde As String = Nothing
      '
      Stunde = Now.Hour

      Ist schon mal nicht "schön"

      Außerdem gibt

      VB.NET-Quellcode

      1. Now.ToString("hh:mm:ss")

      in einer Zeile das Ergebnis, wofür hier x Zeilen Code "verbraten" werden.
      Naja, das abrufen der Zeit ist meiner Meinung nach unwichtig, dass lässt sich ja auch schnell verbessern.
      Wichtig ist, dass dies TuT die Funktionsweise der nicht ganz einfachen DLL erklärt und somit eine der meistgestellten Fragen im Multimedia- und Spieleprogrammierung - Subforum löst.

      Achja: Hiermit steht es 2 zu 1 für eine Verschiebung nach TUTs. Vorrausgesetzt ist die Verbesserung des Abschnitts mit der Uhrzeit.
      Ka wusste ich nicht wenn du es so nicht willst dann ändere es doch bei dir selbst. Seid froh das ich mir die Mühe gemacht habe eine TuT zu schreiben und dann wegen einem Schönheitfehler direkt hier ein auf dicke Hose machen!!

      RE: Eine Uhr in einer DirectX Anwendung darstellen

      Werewolve schrieb:


      d3d9.dll <= Wenn die anwendung DirectX 8 ist muss die Datei in das Verzeichnis wo die exe der Anwendung liegt in der die Uhr angezeigt werden soll

      d3d8.dll <= Wenn die anwendung DirectX 9 ist muss die Datei in das Verzeichnis wo die exe der Anwendung liegt in der die Uhr angezeigt werden soll
      sicher, dass es nicht anders rum ist?

      d3d9 = DirectX 9 oder?
      und d3d8 = DirectX 8 !?

      Skybird schrieb:

      Das sind ja Ubisoftmethoden hier !

      hallo magerquark,

      Achja: Hiermit steht es 2 zu 1 für eine Verschiebung nach TUTs. Vorrausgesetzt ist die Verbesserung des Abschnitts mit der Uhrzeit.

      es steht dir nicht zu neue richtlinien zur aufnahme zu erstellen.

      einzig und allein die mods befinden über die würdigkeit eines beitrags.

      wobei ich diesen bereich nicht mag, da man dort seine beiträge nicht mehr selbst editieren kann.

      gruss

      mikeb69
      Hallo mikeb69,

      das mit dem 2 zu 1 war nicht ganz ernst gemeint.
      Ich wollte damit nur picoflop entgegenhalten und mich für eine Verschiebung ins TUT Forum ausdrücken, wenn es der TE wünscht.
      Dass ich nicht entscheiden kann was letztendlich dort landet ist mir klar.

      Lg, magerquark

      PS: Eine Diskussion darüber macht im SourceCode-Forum aber wenig Sinn. Wenn du mir dazu noch was zu sagen hast, gerne per PN.
      Erstmal super :)

      Das tut funktioniert einwandfrei ^^

      Doch ich habe ein Problem: Ich will zwei verschiedene Labels anzeigen:

      VB.NET-Quellcode

      1. Public Class Form1
      2. Dim TE As String = Nothing
      3. Dim TZ As String = Nothing
      4. Dim instance As ToolStripControlHost
      5. Dim handler As KeyPressEventHandler
      6. Private Declare Function GPSL_SetTextLineData Lib "gpcomms.dll" (ByVal wTextPosX As Short, ByVal wTextPosY As Short, ByVal LPCTSTR As String, ByVal dwTextColor As Integer, ByVal bBlackBackground As Boolean, ByVal cSize As Byte, ByVal bTextBold As Boolean, ByVal cFontFamily As Byte) As Boolean
      7. Private Declare Function GPSL_ShowText Lib "gpcomms.dll" (ByVal bShowIt As Boolean) As Boolean
      8. Private Declare Function GetAsyncKeyState Lib "User32" (ByVal vKey As Long) As Integer
      9. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
      10. Timer1.Enabled = True
      11. End Sub
      12. Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
      13. TE = "Lalalalalala"
      14. Label2.Text = TE
      15. GPSL_SetTextLineData(1064, 5, TE, Color.FromArgb(255, 255, 0, 0).ToArgb, True, 20, True, 0)
      16. GPSL_ShowText(True)
      17. TZ = "Lulululululu"
      18. Label3.Text = TZ
      19. GPSL_SetTextLineData(75, 100, TZ, Color.FromArgb(255, 255, 0, 0).ToArgb, False, 20, False, 0)
      20. GPSL_ShowText(True)
      21. End Sub
      22. End Class


      Doch es wird nur der zweite Text TZ angezeigt... was mache ich falsch?
      Ich habe die gpcomms.dll mit dependency walker ausgelesen und bin auf das gestoßen:

      Quellcode

      1. GPML_SetTextMultilineData
      2. GPML_ShowText
      3. GPPIC_LoadNewPicture
      4. GPPIC_ShowPicturePos
      5. GPSI_GetScreenSize
      6. GPSI_ShowFPS
      7. GPSL_SetTextLineData
      8. GPSL_ShowText


      Nun habe ich ein bisschen gesucht und herausgefunden, dass man für FPS

      VB.NET-Quellcode

      1. Private Declare Function GPPIC_LoadNewPicture Lib "gpcomms.dll" (ByVal LPCTSTR As String) As Boolean
      2. Private Declare Function GPPIC_ShowPicturePos Lib "gpcomms.dll" (ByVal bShowIt As Boolean, ByVal wPosX As Integer, ByVal wPosY As Integer) As Boolean
      3. 'Zum Anzeigen:
      4. GPSI_ShowFPS(True)


      das braucht und für Picture das:

      VB.NET-Quellcode

      1. Private Declare Function GPPIC_LoadNewPicture Lib "gpcomms.dll" (ByVal LPCTSTR As String) As Boolean
      2. Private Declare Function GPPIC_ShowPicturePos Lib "gpcomms.dll" (ByVal bShowIt As Boolean, ByVal wPosX As Integer, ByVal wPosY As Integer) As Boolean
      3. 'Zum Auswählen des Bildes:
      4. GPPIC_LoadNewPicture("C:\test.jpg"
      5. 'Und das zum Anzeigen:
      6. GPPIC_ShowPicturePos(True, 0, 50)


      Nun bin ich auch auf die Multiline Funktion gestoßen:

      VB.NET-Quellcode

      1. Private Declare Function GPML_SetTextMultilineData Lib "gpcomms.dll" _
      2. (ByVal wPosX As Integer, ByVal wPosY As Integer, _
      3. ByVal pText As String, ByVal dwTextColor As Long, _
      4. ByVal bBlackBackground As Boolean, ByVal cFontSize As Byte, _
      5. ByVal bTextBold As Boolean, _
      6. ByVal wSizeX As Integer, ByVal wSizeY As Integer, _
      7. ByVal cFontFamily As Byte) As Boolean
      8. Private Declare Function GPML_ShowText Lib "gpcomms.dll" (ByVal bShowIt As Boolean) As Boolean


      Und hab mal probiert es so anzuzeigen:

      VB.NET-Quellcode

      1. GPML_SetTextMultilineData 200, 200, "Hello there - in yellow" & vbCrLf & "and 50% transparency", GetTextColour(65535, 50), False, 40, True, 300, 400, 1
      2. 'Anzeigen:
      3. GPML_ShowText True


      Doch es meckert immer dass irgendwas mit "GetTextColour" nicht stimmt... was? :huh:
      Ich wusste schon das man so mehrzeilige Text anzeigen kann aber ich dachte du wollest 2 von einander unabhänige Fenster haben!

      Probier anstatt:

      VB.NET-Quellcode

      1. GetTextColour(65535, 50)


      das:

      VB.NET-Quellcode

      1. Color.FromArgb(255, 255, 0, 0).ToArgb

      Werewolve schrieb:

      Ich wusste schon das man so mehrzeilige Text anzeigen kann aber ich dachte du wollest 2 von einander unabhänige Fenster haben!

      Probier anstatt:

      VB.NET-Quellcode

      1. GetTextColour(65535, 50)


      das:

      VB.NET-Quellcode

      1. Color.FromArgb(255, 255, 0, 0).ToArgb


      Erstmal danke, und ja eigentlich wollte ich zwei unabhänige Texte haben ;) Aber das ist ja anscheinend nicht möglich :|
      Hi, ich habe folgenden Code für Multiline verwendet:

      VB.NET-Quellcode

      1. Private Declare Function GPML_SetTextMultilineData Lib "gpcomms.dll" _
      2. (ByVal wPosX As Integer, ByVal wPosY As Integer, _
      3. ByVal pText As String, ByVal dwTextColor As Long, _
      4. ByVal bBlackBackground As Boolean, ByVal cFontSize As Byte, _
      5. ByVal bTextBold As Boolean, _
      6. ByVal wSizeX As Integer, ByVal wSizeY As Integer, _
      7. ByVal cFontFamily As Byte) As Boolean
      8. Private Declare Function GPML_ShowText Lib "gpcomms.dll" (ByVal bShowIt As Boolean) As Boolean
      9. [...]
      10. 'Timer1 Code:
      11. GPML_SetTextMultilineData(200, 200, "Hello there - in yellow" & vbCrLf & "and 50% transparency", Color.FromArgb(255, 255, 0, 0).ToArgb, False, 40, True, 300, 400, 0)
      12. 'Anzeigen:
      13. GPML_ShowText True


      Aber es wird nichts angezeigt :S
      Diese Datei ist weder einem Premiumaccount, noch einem Collector's Account zugeordnet und kann deshalb insgesamt nur 10 mal heruntergeladen werden. Dieses Limit ist erreicht. Um diese Datei herunterladen zu können, muss der Anbieter entweder die Datei in seinen Collector's Account verschieben, oder die Datei erneut raufladen. Die Datei kann nachträglich in ein Collector's Account verschoben werden. Der Anbieter muss nur auf den Löschlink der Datei klicken, um mehr Informationen zu erhalten.
      :(
      Hallo,
      ich habe nun versucht den Text den man in TextBox1 eingibt anzuzeigen mit:

      VB.NET-Quellcode

      1. GPSL_SetTextLineData(1064, 5, TextBox1 & "xD", Color.FromArgb(255, 255, 0, 0).ToArgb, True, 20, True, 0)


      aber dann kommt:

      Fehler 1 Der &-Operator ist für die Typen "System.Windows.Forms.TextBox" und "String" nicht definiert.
      Was ist dadran falsch?

      //edit

      10. Nun könnt ihrdas Programm starten und anschließend eure DirectX Anwendung, Ihr müsst aber die d3d9.dll bzw. d3d8.dll in das Hauptverzeichnis des DirectX Programmes kopieren. IN der Anwendung müsst die Uhrzeit erscheinen!
      Sobald ich die d3d9.dll dort hin verschiebe wo das Spiel ist dann funkioniert das spiel nicht mehr :S

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „youfree“ ()