Ergebnis 1 bis 9 von 9

Thema: [RMXP / RGSS]: Datei kopieren...?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Hi Leute,

    ich hab mich ein wenig umgeschaut - ich denke ich bekomme langsam eine ungefähre Vorstellung davon, wie der Win32API-Kernel unter Ruby zu verwenden ist. Auch hab ich beim Durchforsten des Kernels diese Funktion hier gefunden, die wie geschaffen für unsere Zwecke aussieht:

    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

    Das klingt doch ziemlich gut was meint ihr? Wenn man für den "fl"-Parameter FR_PRIVATE angibt, so wird die Font sogar aus der Registry genommen sobald der aufrufende Prozess terminiert, egal wie. Zusätzlich spielt es so keine Rolle mehr, ob die Font vorher schon am System war oder nicht (Private Registrierung überdeckt öffentliche). Nur hab' ich noch ein kleines theoretisches Problem mit dem Win32API-Kernel in Ruby. Da werden die Argumenttypen ja am Anfang als String-Array angegeben, wobei "L" für Zahlen steht, "P" für Pointer, "V" für void etc. - aber was bitte ist das Kürzel für DWORD? Ist ein DWORD ein String? (sry für die Noob-Frage, mit C++ hatte ich bislang noch nichts zu tun)

    Auch wenn ich es jetzt noch nicht getestet habe, ich glaube wir sind schon recht nahe an der Lösung dran

    Gruß,


    Alan

    Geändert von Alan (11.01.2011 um 23:13 Uhr)

  2. #2
    Hi Leute,

    ich hab es mal geschafft, den Call erfolgreich abzusetzen. Hier das entsprechende Code-Fragment:

    Code:
        @kernel = Win32API.new('Gdi32', 'AddFontResourceEx', ['p', 'l', 'p'], 'i')
        result = @kernel.call('Sansation_Regular.ttf', 16, 0)
        p result
    Ich weiß dass der Call erfolgreich war, weil das "p result" genau "1" ausgibt - in der Dokumentation der Kernel-Funktion steht, dass sie die Anzahl der erfolgreich geddeten Fonts zurückgibt, das stimmt also genau.
    Das Problem, das ich jetzt noch habe ist schlicht und ergreifend, dass die Font im RPG-Maker nicht erkannt wird, wenn ich nach obigem Code schreibe:

    Code:
       p Font.exist?("Sansation")
       p Font.exist?("sansation")
       p Font.exist?("Sansation_Regular")
    ... alle drei calls printen "false" auf den Bildschirm. Habt ihr eine Idee woran es liegen könnte? Ich teste hier inzwischen weiter...


    Gruß,


    Alan


    EDIT: Es ist egal, ob ich die Font per "AddFontResource" oder "AddFontResourceEx" hinzufüge - der Call ist erfolgreich (liefert 1 zurück), die Font ist laut RPG-Maker aber tortzdem nicht vorhanden.


    EDIT2: Ok, das ist das VERRÜCKTESTE was ich in Zusammenhang mit Fonts jemals gesehen hab. Da mein Hinzufügen der Font ja 1 zurückgeliefert hat, der RPG-Maker aber keinen Zugriff auf die Font hatte, dachte ich so bei mir: "Ok, dann versuch' mal sie zu löschen, schauen ob das geht." Ich also folgenden Code geschrieben:

    Code:
        @kernelAdd = Win32API.new('Gdi32', 'AddFontResource', ['p'], 'i')
        result = @kernelAdd.call('Sansation_Regular.ttf')
        p result
        
        @kernelRem = Win32API.new('Gdi32', 'RemoveFontResource', ['p'], 'i')
        result = @kernelRem.call('Sansation_Regular.ttf')
        p result
        
        p Font.exist?("Sansation")
    Die Resultate der Prints:
    1
    1
    true

    Wenn ich die Font nur adde, ist sie laut Font.exist? NICHT da. Wenn ich sie lösche (und das löschen erfolgreich ist, da 1 zurückgeliefert wird) und DANACH versuche, auf die Font zuzugreifen, ist sie DA. Ich meine - ich bin froh dass es überhaupt geht, aber DAS nenne ich seltsam. So richtig. Hat jemand eine Erklärung dafür?

    Geändert von Alan (12.01.2011 um 11:45 Uhr)

  3. #3
    Zitat Zitat
    Man musste immer das Spiel einmal neustarten, ehe die Änderung wirksam war. Ich weiß allerdings nicht mehr woran das lag (ist schon länger her). Eventuell hab ich mich auch einfach nur zu blöd angestellt.
    Naja, AddFontResource fügt die Font der System Font-Table hinzu, aber es ist möglich, dass Ruby diese nur zu Beginn abfragt und sich eine eigene interne Table daraus konstruiert. Somit wäre die Font erst nutzbar wenn Ruby die System Table erneut liest.
    Vielleicht kann mit dieser Info aus der API-Referenz etwas anfangen:
    Zitat Zitat
    Any application that adds or removes fonts from the system font table should notify other windows of the change by sending a WM_FONTCHANGE message to all top-level windows in the operating system. The application should send this message by calling the SendMessage function and setting the hwnd parameter to HWND_BROADCAST.
    Das könnte die unter Ruby liegende Game.exe dazu veranlassen die System Table erneut zu lesen und vielleicht ist die Font dann auch direkt in Ruby nutzbar. Einen Versuch wäre es wert.

  4. #4
    Soweit ich weiss, werden neue Schriften nicht gelesen, solange der Game Thread noch läuft.
    Code:
    SM = Win32API.new('user32', 'SendMessage', ['L'] * 4, 'L')
    WM_FONTCHANGE = 0x001D
    HWND_BROADCAST = 0xffff
    SM.call(HWND_BROADCAST,WM_FONTCHANGE,0,0)
    a = Thread.new
    {
      system('Game')
    }
    exit

  5. #5
    Hi Leute,

    ich habe folgendes festgestellt:
    Wenn man eine Font per AddFontResource hinzufügt, so bekommt man die Bestätigung, dass es funktioniert hat, man kann sie aber noch nicht direkt anwenden. Öffnet man dann z.B. Microsoft Word, so ist die Font dort vorhanden. Startet man das RPG-Maker-Game dann neu, so ist die Font auch dort vorhanden (hätte man Word nicht zwischenzeitlich gestartet, wäre die Font auch im neu gestarteten RM-Projekt nicht da). Man kann eine Font so oft löschen wie man sie zuvor erzeugt hat.

    Scheinbar handelt es sich wirklich um ein Update-Problem.

    @StarWolf: Ich verstehe deinen Code, nur: wohin sollte man ihn einfügen? Gleich als allererstes in das oberste File des RMXP-Skript-Editors? Auf jeden Fall aber erst, NACHDEM man die Font erzeugt hat oder?

    @All: Was mich wundert: bei AddFontResource steht dabei, dass man eben selbigen Broadcast wie er von StarWolf vorgezeigt wurde, machen soll - bei AddFontResourceEx hingegen nicht. Hinzu kommt, dass ich bei diesem Befehl für alle anderen Fenster ja nichts ändert, folglich kein Update nötig ist. Und muss ich wirklich mein EIGENES Fenster darüber informieren dass es jetzt eine zusätzliche Font gibt?


    Gruß,


    Alan

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •