Seite 3 von 4
Verfasst: 03.11.2005 18:34
von Dostej
Um die Fonthöhe zu ermitteln musst du ja einfach nur die
einzellnen Pixel überprüfen.
Wie das? Einen text auf ein Image zeichnen und dann die obersten und untersten weisen Pixel suchen?
Verfasst: 03.11.2005 20:34
von PMV
So mach ich das ... mich würds auch wundern wenns
eine andere so genaue Möglichkeit geben würde. Aber
naja, sag nie mals nie *gg*.
Erstelle ein Images mit der Breite und Höhe von Size * 2
und render dort alle 255 möglichen Asciizeichen.
Anschließend werden alle Zeichen auf ein Images / Sprites
gerendert. So verschwinden dann die oberen und unteren
Ränder und die wirkliche Höhe wird nun gespeichert.
Wenn man Fonts lädt, also aus Grafikdateien, dann kann
man auch die als Parameter angegebene Höhe der Zeichen
nehmen, aber ich mach das auch hier, zur sicherheit

.
Edit:
Zum Thema Font ist mir grad noch was aufgefallen
z.B. wenn man den Font "Arial" mit Size 8 lädt, wird der
Text bei Locate(0, 0) bei -1 gesetzt -.- ... also auch beim
Positionieren am besten großzügig sein

(auch in Y-Richtung)
MFG PMV
Verfasst: 04.11.2005 08:48
von Dostej
Hm, erscheint mir recht aufwändig. Ich hab in der X2d-source mal gestöbert, wie er das macht.
Procedure.l GetFontHeight() ; Returns the Line-Height of the current DrawingFont
hDC.l
MOV EAX, [_PB_2DDrawing_CurrentDC]
MOV hDC, EAX
GetTextMetrics_(hDC, tm.TEXTMETRIC)
ProcedureReturn tm\tmHeight
EndProcedure
da ich in ASM völlig blank bin, versteh ich den Code nicht so ganz. Compilieren lässt er sich so nicht, da er [_PB_2DDrawing_CurrentDC] nciht findet. Am Anfang vom Code ist das so angegeben.... !EXTRN _PB_2DDrawing_CurrentDC
Ich muss mal in ner ruhigen stunde den ganzen Code durchschauen.Vielleicht kann ich dann ne einfach Proc draus machen, die die Textheight zurückgibt.
Verfasst: 04.11.2005 11:13
von freedimension
Wenn du mich lieb dran erinnerst (am Besten heute Abend so um 18 - 19 Uhr mal eine PN schicken) dann schaue ich mal im aktuellen Code nach und lasse dir diesen zukommen
EDIT: kann sein, dass es schon genügt wenn du einfach
in den Source schreibst.
Verfasst: 04.11.2005 16:56
von Dostej
Hab ich versucht, einfach la die Zeile mit reinzusetzen, hat dann der compiler gemeldet, er kenne das nicht... (Das wars dann bei meinen ASM kentnissen)
Verfasst: 04.11.2005 17:54
von PMV
Hm, aufwendig nur für den Rechner, da es natürlich etwas länger braucht, aber zum programmieren, sind ja nur 2 X 2 Schleifen

. Dann Ergebnis speichern und die Grafiken render.
Hm, ASM kann ich überhaupt nicht, weshalb ich erst mal davon absehe, diesen Code zu benutzten, wobei ich mir in etwa denken kann, was er macht. Aber Fremdcode ist Fremdcode auch wenn er von umserm Freedimension kommt

... und muss ja eh nur ein mal gemacht werden ... aber jedem dem seinen

. Mal schauen wies ist, wenn ich die Lib so weit veröffentlicht hab

Aber danke für den Tipp.
MFG PMV
Verfasst: 04.11.2005 21:35
von freedimension
Folgendes funktioniert:
Code: Alles auswählen
Procedure.l GetFontHeight()
; Externe PB-interne Variable deklarieren (siehe PB-SDK)
!extrn _PB_2DDrawing_CurrentDC
; Variable für den Device Context der aktuellen StartDrawing-Sitzung
hDC.l
; Device Context aus PB-interner Variable auslesen
MOV EAX, [_PB_2DDrawing_CurrentDC]
MOV hDC, EAX
; Einfache Windows-API-Funktion zum Auslesen einiger Font-Eigenschaften
GetTextMetrics_(hDC, tm.TEXTMETRIC)
; selbsterklärend, oder? ;)
ProcedureReturn tm\tmHeight
EndProcedure
; schnell dahingero... Anwendungsbeispiel :)
OpenWindow(1, 10, 10, 100, 100, 0, "test")
StartDrawing(WindowOutput())
LoadFont(1, "Arial", 36)
;StartDrawing()
DrawingFont(UseFont(1))
MessageRequester("", Str(GetFontHeight()))
StopDrawing()
Dostej hat geschrieben:Hab ich versucht, einfach la die Zeile mit reinzusetzen, hat dann der compiler gemeldet, er kenne das nicht... (Das wars dann bei meinen ASM kentnissen)
Er kennt das auch erst, wenn du mindestens eine 2D-Drawing-Funktion mit drinnen hast

El_Choni hat dazu aber in TailBite einen Fake-Befehl kreiert der dem Compiler vogaukelt das wäre da (oder so ähnlich, so richtig hab ich's auch nicht verstanden). Einfach mal in der Doku nachlesen

Verfasst: 07.11.2005 15:28
von Dostej
@freedimension
Erst mal (ganz brav ) danke, danke soweit, obwohl ich nicht ganz brav bitte bitte gesagt habe
Ich dneke ich habs soweit verstanden, bis aud das hier:
; Externe PB-interne Variable deklarieren (siehe PB-SDK)
!extrn _PB_2DDrawing_CurrentDC
Dann ne (vermutlich blöde) Frage: wo finde ich die PB-SDK? Und wie wird so ne PB_interne Var extern deklariert? Ist das praktisch mit dem Befehl passiert oder muss da noch woanders was gemacht werden?
Dann hats noch ne neue Version.
Ich habe übers WE mein Projekt komplett auf Screen und ScreenGadgets umgestellt und dazu die Lib verwendet (dafür hatte ich sie ja auch geschrieben

). Dabei hab ich noch einige Fehler gefunden und auch noch ein paar Dinge, die noch fehlen (noch nicht alle ergänzt).
Ich hab den Starteintrag (Seite 1 oben) entsprechend geändert, ansonsten ist der Link hier noch mal.
http://dostej.pureforge.net/Files/Scree ... IB_0.4.zip
Verfasst: 07.11.2005 16:37
von freedimension
Die PB-Libs werden erst nach dem Kompilieren des Codes hinzugelinkt, d.h. Variablen aus diesen Libs auf die du innerhalb deiner Anwendung zugreifen möchtest musst du vorher als "Extern" deklarieren.
Das PB-SDK findest du im PureBasic-Ordner, ist eine einfache Textdatei in der so einiges an technischem Hintergrundwissen zu PureBasic und zur Erstellung von Userlibs steht.
Verfasst: 07.11.2005 17:03
von Dostej
Auch auf die Gefahr hin, das Du mich für blöd erklärst, ich finde keine PB_SDK. Ich finde n Dir "Library-SDK" Ist es das? Oder wie soll die Dtei heissen?