Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 21.03.2015, 16:04 Titel: BOM für € |
|
|
Hallo Leute,
meine Frage gehört warscheinlich eher zur Abteilung Windows-fragen. Aber ich denke Fragen zu Byte Order Mark passen auch ganz gut zu FB.
Und zwar versuche ich das € Symbol auf meinem Drucker zu bekommen. Natürlich benutze ich Win APIs. Und zum anzeigen TextOut(). Ich habe jetzt schon alles mögliche versucht, aber leider erscheint auf meinem Ausdruck immer nur ein ? oder so eine Art C mit einem Kringel unten dran.
Probiert habe ich es mit 'Times New Roman' und 'Arial'
Da ich zum erstenmal WStrings benutze hab ich in der Referenz was von BOM gelesen und mal Wiki und Google angestrengt.
Kann mir jemand sagen wie ich ein BOM setze? Muss ich mein WString um 2 Symbole vergrößern, die 2 Indexnummern bzw. Bytes für das entsprechende BOM an den Anfang des Strings setzen und dann den gewünschten Text (in dem Fall halt das € zeichen oder den Index 8364(&h20AC)) an die 3 Stelle bzw 2.Indexstelle des WStrings setzen?
Bisher hab ich das:
Code: |
...
#UNDEF TextOut
declare function TextOut alias "TextOutW" (byval as HDC, byval as integer, byval as integer, byval as LPCWSTR, byval as integer) as BOOL
...
Dim As wstring ptr wtext
wtext = Callocate( ( Len(text)+1 )*2 )
*wtext = text
Dim As byte byt
For ws As Integer = 0 To Len(*wtext)-1
byt = wtext[ws] ' Zeigt den wert 8364 was ja eigentlich das € ist
Next ws
TextOut(Printer.hDC, x , -y , *wtext , cntchars )
DEALLOCATE wtext
|
|
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 21.03.2015, 16:15 Titel: |
|
|
TextOut behandelt keine BOMs. Entweder man übergibt einen ANSI-String an TextOutA, oder einen Unicode-String an TextOutW. Alles andere ist nicht möglich.
Dein Code sieht allerdings so oder so suspekt aus. Wozu das ganze rum-allocaten?
Versuch es doch einfach mal ganz simpel.
Code: |
#include "windows.bi"
...
Dim as wstring text = !"Eurozeichen \&H20AC"
TextOutW(Printer.hDC, x , -y , strptr(text), len(text))
|
_________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 21.03.2015, 16:55 Titel: |
|
|
Hi Jojo, danke für die schnelle Antwort. Naja laut Ref. kann ich nicht erkennen das ich ein WString ohne Größenangabe befüllen kann.
Code: | Dim As WString wtext = !"Eurozeichen \&H20AC" |
ergibt folgendes: error 28: Expected pointer, found 'wtext' in 'Dim As wstring wtext = !"Eurozeichen \&H20AC"'
Da ich #DEFINE UNICODE vermeiden wollte lädt die Windows.bi die TextOutA als TextOut. Deshalb hab folgendes benutzt:
Code: | #UNDEF TextOut
declare function TextOut alias "TextOutW" (byval as HDC, byval as integer, byval as integer, byval as LPCWSTR, byval as integer) as BOOL |
Deine Variante (TextOut(hdc,x,y, StrPtr(wtext) , LEN(wtext) ) benutzte ich anfangs auch. Aber StrPtr scheint nicht mit WSTRINGs zu arbeiten:
error 24: Invalid data types, found ')' in 'TextOut(Printer.hDC, x , -y , StrPtr(wtext) , len(wtext) )' |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 21.03.2015, 17:19 Titel: |
|
|
Okay, dann ist das mit WSTRING eine FB-Limitierung. Da ich FB schon seit 6 Jahren nicht mehr angerührt habe, war mir das nicht bewusst. Hässlich...
Zitat: | Da ich #DEFINE UNICODE vermeiden wollte |
Warum? UNICODE sollte eigentlich schon seit Jahren der Standard sein. Intern muss Windows so oder so alle ANSI-Strings in Unicode konvertieren.
So oder so sollte die windows.bi alle drei Symbole (TextOut, TextOutA und TextOutW) bereitstellen, sonst ist das unvollständig. Kann aber natürlich sein, dass die FreeBASIC-Header hier im Vergleich zu den Original-C-Headern unvollständig sind.
Zitat: | Aber StrPtr scheint nicht mit WSTRINGs zu arbeiten: |
Naja, das hängt dann wieder damit zusammen, dass WSTRING nicht wie STRING funktioniert; Wenn du eh einen WSTRING PTR brauchst, hast du ja sowieso schon den Pointer auf den String-Inhalt. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
HorstD
Anmeldungsdatum: 01.11.2007 Beiträge: 107
|
Verfasst am: 21.03.2015, 20:25 Titel: |
|
|
Das Ansi-Eurozeichen ist: CHR(128) |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 22.03.2015, 00:54 Titel: |
|
|
...vorausgesetzt, dass du die Westeuropäische Codepage verwendest. (und genau deswegen ist ANSI doof) _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 27.03.2015, 09:42 Titel: |
|
|
Also danke für eure Antworten.
Ich hab Jojos Rat befolgt und benutze DEFINE UNICODE und hab alle meine Funktionen und Bibliotheken angepasst. Nun hat auch alles funktioniert... bis ich gestern meine Compileroption umgestellt habe. Die Profis unter euch wissen es bestimmt aber mir war das neu.
Es macht schon ein Unterschied ob -exx oder -s gui eingestellt ist. Frage: gibt es hier eine abfrage möglichkeit wie zB '#IFDEF exx' oder so?
Noch eine Frage zu Win API. Ins besondere zum Druckerdialog. Ich habe mich da für die Funktion und Struktur 'PrintDlg' entschieden. Erst habe die Funktion immer ohne ein Handle des aufrufenden Programms aufgerufen was dazu führte das das Dialogfeld im Hintergrund aufpopte. Jetzt gebe ich den Handle mit und das Dialogfeld hat ein ganz anderes Design. Mir hat allerdings das erste besser gefallen hat da jemand eine Idee. Ein Flag wie bei SHBrowseForFolder (BIF_USENEWUI) scheint es ja hier leider nicht zu geben.
P.S. Wenn es niemanden stört würde ich den Titel des Threads ändern, denn mit BOM hat es nun doch nichts zu tun |
|
Nach oben |
|
|
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 27.03.2015, 10:36 Titel: |
|
|
braesident hat Folgendes geschrieben: |
Es macht schon ein Unterschied ob -exx oder -s gui eingestellt ist. Frage: gibt es hier eine abfrage möglichkeit wie zB '#IFDEF exx' oder so? |
-exx sollte absolut keinen Unterschied machen. Welchen Unterschied bemerkst du denn?
GUI könnte einen Unterschied wegen des Fensterhandles machen.
braesident hat Folgendes geschrieben: |
Jetzt gebe ich den Handle mit und das Dialogfeld hat ein ganz anderes Design. |
Könnte auch daran liegen, dass du die Common Controls nicht initialisierst. Versuch mal, direkt zu Beginn des Programms InitCommonControlsEx aufzurufen. Ist allerdings nur ne Vermutung und es wäre vielleicht hilfreich, sich die komplette Dokumentation zu dem Druckerkram in der MSDN durchzulesen (was ich aber nicht für dich tun werde). _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 949 Wohnort: Austria
|
Verfasst am: 27.03.2015, 10:44 Titel: |
|
|
Die Optionen -exx und -s gui haben zwar natürlich Auswirkungen, einen Zusammenhang mit deinem Einsatzgebiet sehe ich jedoch nicht (zumindest auf den ersten Blick). Das hinzufügen/entfernen von -exx könnte irgendwelche falschen Speicherzugriffe zutage bringen. Die Option -s gui sollte keinerlei Auswirkung haben.
Bezüglichlich Layout fallen mir auf die Schnelle folgende mögliche Versuche ein:
1. Aufrufen von InitCommonControls bzw. InitCommonControlsEx und/oder
2. Hinzufügen eines entsprechenden Manifests in den Resourcen siehe https://msdn.microsoft.com/en-us/library/windows/desktop/bb773175.aspx _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
braesident
Anmeldungsdatum: 15.04.2008 Beiträge: 189 Wohnort: Berlin
|
Verfasst am: 27.03.2015, 12:37 Titel: |
|
|
Jojo hat Folgendes geschrieben: | -exx sollte absolut keinen Unterschied machen. Welchen Unterschied bemerkst du denn? |
Kann natürlich sein das Freetype2 da mit einwirkt.
Also wie schon erwähnt steht als erste Zeile im Code #DEFINE UNICODE
dann benutze ich Screenres 900, 560, 32
Wie gesagt hab die ganze Zeit mit -exx Kombiliert und Ascii2Ansi(MONTHNAME(MONTH(schluessel))) zeigte mir für März auch ein 'ä' an. Nach dem Kombilieren mit -s gui wurde aus dem ä ein Viereck. Dafür geht es jetzt ohne die Ascii2Ansi Funktion.
Zu dem ganzen Druckerkram lese ich mich nun schon seit einigen Wochen durch die MSDN Seiten und auch anderen Seiten. Das würde ich auch von niemandem verlangen, dies für mich zu tun. InitCommonControlsEx hat ich auch schon vor Augen. Hab mich nur noch nicht weiter mit beschäftigt. War wohl noch nicht interessant als ich drauf stieß.
@St_W
deinen Link werde ich mir auch gleich genauer ansehen
erstmal wieder vielen Dank euch. |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4601 Wohnort: ~/
|
|
Nach oben |
|
|
|