Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Eurozeichen bei FreeType2

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 23.07.2014, 23:15    Titel: Eurozeichen bei FreeType2 Antworten mit Zitat

Hallo liebe Leute

Ich habe mir aus der Bsp.Datei DrawStr.bas welche dem FB Paket beiliegt eine schöne Draw String Routine gebastelt. Die auch sehr gut läuft. Nun stört mich nur noch das halt kein € gezeichnet wird. In der Bsp.Datei gibt es ja folgende Sub
Code:
Sub DST_Zeichnen _
    ( ByVal Schrift As FT_Face, ByVal x As Integer, ByVal y As Integer, _
        ByVal farbe As UInteger )
 
  Dim As FT_Bitmap Ptr bitmap = @Schrift->glyph->bitmap

  Dim As UByte Ptr source = bitmap->buffer
  Dim As Integer h = bitmap->rows
  Dim As Integer pitch = DST.SCR_W - bitmap->width

  Dim As UInteger Ptr p = CPtr(UInteger Ptr, ScreenPtr()) + (y * DST.SCR_W) + x

  While (h > 0)
    Dim As Integer w = bitmap->width
    While (w > 0)
      ' Alphablenden erstellen
      #define MASK_RB_32 &h00FF00FF 'pink
      #define MASK_G_32  &h0000FF00 'grün
      Dim As UInteger srb = farbe And MASK_RB_32
      Dim As UInteger sg  = farbe And MASK_G_32
     
      ' Hintergrund auslesen
      Dim As UInteger dfarbe = p[0]
      Dim As UInteger drb = dfarbe And MASK_RB_32
      Dim As UInteger dg  = dfarbe And MASK_G_32
     
      Dim As Integer Alpha = source[0]
      srb = ((srb - drb) * Alpha) Shr 8
      sg  = ((sg - dg) * Alpha) Shr 8
     
      ' direkt auf Monitorpuffer Zeichnen
      *p = ((drb + srb) And MASK_RB_32) Or ((dg + sg) And MASK_G_32)
     
      p += 1: source += 1: w -= 1
     
    Wend
     
    h -= 1
    p += pitch
  Wend
End Sub

Die Sub hieß dort nur anders

Meine Überlegung war jetzt die Zeile
Code:
*p = ((drb + srb) And MASK_RB_32) Or ((dg + sg) And MASK_G_32)

in eine If bedingung zu setzen, so das anstelle eines 4ecks halt ein € Zeichen gemalt wird. Dachte da erst an Data Zeilen mit 0en und 1en. Da wirds dann aber wieder kompliziert mit verschiedenen Schriftgrößen.
Ansonsten könnt ich mir noch vorstellen das mit einer BMP zu machen die man dann je nach Schriftgröße skalliert.

Oder habt Ihr da bessere bzw einfachere Ideen.

LG
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 562
Wohnort: Jüterbog

BeitragVerfasst am: 24.07.2014, 10:20    Titel: Antworten mit Zitat

dieser Abschnitt ist fürs Rendern zuständig

dort sind die Ecken wo du ansetzen müsstest:

Code:

(FT_Load_Char(face, Asc("@"), FT_LOAD_DEFAULT)'<---- &h20AC oder dezimal 8364


bzw in deinem Fall:
Code:

Dim As FT_UInt index = FT_Get_Char_Index(font, text[i])'<---- &h20AC oder dezimal 8364

'' Load character glyph
If (FT_Load_Glyph(font, index, FT_LOAD_DEFAULT) <> 0) Then'<---- &h20AC oder dezimal 8364
  Return 0
End If


du könntest beim Zerlegen des Textes dir ein selten benutztes Zeichen aussuchen, und dieses bzw dessen asc() durch &H20AC ersetzen

Ich kenne mich mit Textcodierung auch nicht so aus, freetype benutzt wohl UTF-32

ist mit sicherheit keine optimale Lösung, aber wenn es nur darum geht, ein Euro Zeichen auf den Bildschirm zu zaubern und du eh schon freetype benutzt

Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 24.07.2014, 11:24    Titel: Antworten mit Zitat

danke, das war Rettung in letzter Sekunde. War gerade dabei FreeImage einzubinden. Hab schon die dll dateien in meine Ordner gepackt.

ich hab das jetzt erstmal mit IIF gelöst. Da die Tasten AltGr + E den Code 128 zurück geben, hab ich die Zeile nach deinem Tipp so geändert.
Code:
Dim As FT_UInt index = FT_Get_Char_Index(font, IIF(text[i] = 128, &h20AC, text[i]))

Bin mir nur nicht so sicher ob diese Tastenkombi immer 128 zurück gibt, oder ob der Wert je nach einstellung anders ist
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 24.07.2014, 12:54    Titel: Antworten mit Zitat

Zitat:
Bin mir nur nicht so sicher ob diese Tastenkombi immer 128 zurück gibt, oder ob der Wert je nach einstellung anders ist

128(dez) ist die Codierung des Euro-Zeichens, wenn die Zeichencodierung "Windows-1250" (siehe http://en.wikipedia.org/wiki/Windows-1250 ) verwendet wird. Wenn eine Unicode-codierung verwendet wird, ist das Euro Zeichen eben mit 20AC(hex) kodiert; siehe auch http://en.wikibooks.org/wiki/Unicode/Character_reference/2000-2FFF .
Mit der Tastatureingabe hat das eigentlich relativ wenig bis gar nix zu tun - INKEY liefert z.B. den Wert 63(dez).
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 03.08.2014, 20:36    Titel: Antworten mit Zitat

Hm Ok mit IIF hat es gut funktioniert wenn im Quelltext eine zeichenkette vorgegeben ist, die ein EUROzeichen enthält.
Leider ist es wie St_W schon gesagt hat bei tastureingabe nicht mehr so einfach. Und ich glaub das Problem ist, das nicht nur sondern auch ? bei Inkey den Wert 63 zurück gibt.

Hab ihr da vllt. eine Lösung wie das €zeichen abgefragt werden kann und das natürlich ohne das Fragezeichen zu verlieren. Und am besten wär es wenn sich dies über den Quellcode bewerkstelligen ließe. Wäre schon blöd wenn man vom Benutzer verlangen müsste etwas am System zu verändern.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Muttonhead



Anmeldungsdatum: 26.08.2008
Beiträge: 562
Wohnort: Jüterbog

BeitragVerfasst am: 04.08.2014, 07:29    Titel: Antworten mit Zitat

vielleicht hilft Multikey() weiter.
Ich weiß nicht wie deine Eingaberoutine aussieht, aber vielleicht kannst du bevor du Inkey aufrufst mit multikey den Zustand der Tasten altgr und e abfragen und gegebenenfalls den Code fürs Eurozeichen an die Bibliothek senden.
Kann mich da an ein Thread erinnern von TimesChange, irgendwas mit qbasic konvertierungen..., jedenfalls wurde dort versucht die komplette Usereingabe via Multikey zu lösen, da auch alt und strg abgefragt werden mußten

Mutton
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 04.08.2014, 11:34    Titel: Antworten mit Zitat

vielen Dank

war nicht ganz einfach diese Geburt mit den Augen rollen
Ich habe erst immer Inkey und Multikey getrennt abgefragt
Code:
FF_Input = Inkey
If multikey(&h1D) And Multikey(&h38) And Multikey(&h12) Then
  FF_Input = "€"
  Do: FF.EmptyInkey = Inkey: Loop Until FF.EmptyInkey = ""
  sleep 150
End If
und weitere ähnliche gebilde, was immer dazu führte das ich mehrfach eingaben hatte. Also bei einmal "AltGr + e" kam dann "?€€" oder "€€€€" auf dem Bildschirm.

Habs dann doch noch geschaft mit folgendem Code
Code:

    ' TASTEN abfrage

    ' [Strg] + [Alt] + [e]
    If multikey(&h1D) And Multikey(&h38) And Multikey(&h12) Then
      FF_Input = "€"
      Do: FF.EmptyInkey = Inkey: Loop Until FF.EmptyInkey = ""
      sleep 150

    ' ( [LShift] oder [RShift] ) + [ß bzw ?]
    Elseif (  multikey(&h2A) Or multikey(&h36)  ) And multikey(&h1A) Then
      FF_Input = "?"
      Do: FF.EmptyInkey = Inkey: Loop Until FF.EmptyInkey = ""
      sleep 150

    Else
      FF_Input = Inkey
      If ASC(FF_Input) = 63 Then FF_Input = ""

    End IF
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 04.08.2014, 13:13    Titel: Antworten mit Zitat

1) Multikey solltest du nicht mit Inkey vermischen. Du solltest warten, bis genau diese drei Tasten nicht mehr gedrückt werden, und nicht mit Inkey auf leere Eingabe prüfen.
2) Mit dieser Multikey-Methode schließt du alle Benutzer aus, die kein deutsches Tastatur-Layout verwenden, oder zumindest ein Layout, bei dem man das Euro-Zeichen genau so eingibt - und es gibt genug Keyboard-Layouts, wo man das anders eingibt. Mit Inkey hat man da ein paar weniger Probleme, weil da die Tastendrücke bereits vom System in die richtigen Zeichen übersetzt werden.
_________________
» Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 08.08.2014, 10:18    Titel: Antworten mit Zitat

@ Jojo, ich kann dir da gerade nicht so ganz folgen. Du sagst multikey und inkey sollte ich nicht vermischen. Aber in der Referenz steht es doch genau andersherum.
Referenz hat Folgendes geschrieben:
Der Tastaturpuffer wird nicht geleert, wenn MULTIKEY verwendet wird; jede gedrückte Taste wird gespeichert, bis sie z. B. durch INKEY abgefragt wird. Damit kein Überlauf im Tastaturpuffer stattfindet, müssen Sie diesen selbständig leeren; es empfiehlt sich daher, MULTIKEY in Kombination mit INKEY zu verwenden.


Und das zweite ist das ich auf Multikey ausgewichen bin da eine Abfrage über Inkey nicht funktioniert hat. der ASC wert war immer 63. Also immer der selbe wie bei einem Fragezeichen. Ich wüsste halt nicht wie ich es sonst abfragen soll.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 08.08.2014, 13:18    Titel: Antworten mit Zitat

MULTIKEY arbeitet halt anders als INKEY, und wenn du INKEY länger nicht abfragst, wird es von den MULTIKEY-Werten abweichen. Der Hinweis in der Referenz bedeutet lediglich, dass nach einer MULTIKEY-Abfrage die Tasten noch im Tastaturpuffer liegen; wenn du also auf neue Pufferwerte zugreifen will, muss man den Puffer vorher leeren. Die Verwendung von INKEY steht im Referenztext im deutlichen Zusammenhang mit dem Leeren des Puffers und ist keine Aufforderung, beides zusammen als Abfragemöglichkeit zu nutzen. lächeln

Wenn ich die Eurotaste per INkEY abfrage, bekomme ich gleich drei Werte, nämlich die Bytes des UTF8-Wertes. Interessant, dass die Betriebssysteme da verschieden arbeiten. Es wäre vielleicht zu überlegen, dem Benutzer für unbedingt erforderliiche Nicht-ASCII-Zeichen eine besondere Eingabemöglichkeit gegeben wird, vielleicht über Funktionstasten (was dann natürlich im Programm deutlich vermerkt werden müsste) oder grafisch über ein Button.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 08.08.2014, 17:18    Titel: Antworten mit Zitat

hilf mir bitte auf die sprünge. So langsam seh ich gar nicht mehr durch. verwundert Wie fragst du die Bytes des UTF8-Wertes per inkey ab?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 08.08.2014, 18:26    Titel: Antworten mit Zitat

Das wird dir nicht viel bringen.
Code:
DO
  taste = INKEY
  IF taste <> "" THEN PRINT ASC(taste)
LOOP UNTIL taste = chr(27) ' ESC

liefert mir beim Druck des Eurozeichens drei Werte: 226, 130, 172. Dein Betriebssystem macht das aber offensichtlich anders.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 08.08.2014, 18:41    Titel: Antworten mit Zitat

Das Verhalten wundert mich etwas. Ich würde es eher als "Bug" bezeichnen. Denn Inkey sollte laut Doku eigentlich immer einen 1-Byte ASCII Wert oder einen 2-Byte Extended Keycode zurückgeben. Insbesondere ist es auch seltsam, dass drei einzelne Tastendrücke erkannt werden (zumindest deinem Code nach, wenn du den beschriebenen Output erhältst).


Das Input-Handling von FB ist leider sehr stark von QBasic beeinflusst und trägt daher viele Altlasten mit. Obwohl es nun insgesamt 3 Wege gibt, Tastatureingaben abzufragen (Inkey, Multikey, Screenevent) ist keine davon wirklich optimal.

Ich fände z.B. ein Inkey, das etwa die per WM_CHAR / ReadConsoleInput() erhaltenen Zeichen als Unicode zurückgibt ser sinnvoll. Der Unicode Support von FB ist allerdings immer noch sehr bescheiden bzw. großteils eher praktisch nicht vorhanden.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
braesident



Anmeldungsdatum: 15.04.2008
Beiträge: 189
Wohnort: Berlin

BeitragVerfasst am: 09.08.2014, 16:33    Titel: Antworten mit Zitat

@ nemored
Ja stimmt, bei mir ist es nur 63 ( bei AltGr+e und bei ß/? )

Hab noch was interessantes hier im Forum gefunden.
Leider gab es kein weiteres Feedback dazu ob das Allgemeintauglich ist. Aber wenn dann müsste sich daraus eigendlich eine ziehmlich gute Eingaberoutine machen lassen. Wie der Autor aber schon gesagt hat müsste dabei halt noch der Programmfocus beachtet werden. Die enthaltene TestSub lief bei mir schonmal gut. (Win7 mit Netbooktastaur und deutschem Layout)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden MSN Messenger
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 949
Wohnort: Austria

BeitragVerfasst am: 09.08.2014, 21:38    Titel: Antworten mit Zitat

braesident hat Folgendes geschrieben:
Hab noch was interessantes hier im Forum gefunden.
Leider gab es kein weiteres Feedback dazu ob das Allgemeintauglich ist. Aber wenn dann müsste sich daraus eigendlich eine ziehmlich gute Eingaberoutine machen lassen. Wie der Autor aber schon gesagt hat müsste dabei halt noch der Programmfocus beachtet werden. Die enthaltene TestSub lief bei mir schonmal gut. (Win7 mit Netbooktastaur und deutschem Layout)

Der Code verwendet GetAsyncKeyState() um den aktuellen Tastaturstatus zu ermitteln - so wie Multikey. Ein Ersatz für InKey ist es damit definitiv nicht (es fragt Tasten nur in bestimmten Intervallen ab und garantiert z.B. nicht dass alle Tastendrücke erkannt werden, z.B. wenn sie schnell hintereinander oder nur ganz kurz erfolgen). Nebenbei hat es den Nachteil, dass es nur auf Windows läuft.
_________________
Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 17.08.2014, 23:56    Titel: Antworten mit Zitat

Zitat:
Denn Inkey sollte laut Doku eigentlich immer einen 1-Byte ASCII Wert oder einen 2-Byte Extended Keycode zurückgeben.

Ich verstehe das so, dass die einzelnen Bytes des Unicode-Zeichens in den Puffer gelegt werden und INKEY diese dann korrekt als drei einzelne Zeichen ausliest. Die Tasten in den Puffer zu legen sollte Aufgabe des Betriebssystems sein, weshalb ich hier keinen Bug vermute.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4597
Wohnort: ~/

BeitragVerfasst am: 19.08.2014, 22:33    Titel: Antworten mit Zitat

Nachtrag: Um meine Vermutung zu überprüfen, habe ich das obige Programm in der Konsole ausgeführt, nachdem ich mit
Code:
LC_ALL=de_DE luit

die Zeichencodierung umgestellt habe (ist vermutlich jetzt vereinfacht ausgedrückt). Der Effekt ist, dass das Eurozeichen keine Ausgabe mehr erzeugt (kein passendes ANSII-Zeichen, keine Umwandlung). Es liegt also wohl wirklich an der Konsoleneinstellung und nicht an FreeBASIC - FreeBASIC verarbeitet das, was es geliefert bekommt.

Dass unter Windows ein € in ein ? umgewandelt wird, soll wohl dazu dienen, unbekannte Zeichen wenigstens irgendwie darzustellen. Ob es für die Auswertung hilfreich, ist sei mal dahin gestellt. grinsen
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz