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:

Fonts unter FreeBASIC

 
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
zwergnase



Anmeldungsdatum: 03.01.2006
Beiträge: 26
Wohnort: Frankfurt am Main

BeitragVerfasst am: 01.08.2006, 18:31    Titel: Fonts unter FreeBASIC Antworten mit Zitat

Tach,
Weis einer von euch wie man Schriften in freebasic benutzt?

Martin
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kai Bareis



Anmeldungsdatum: 10.09.2004
Beiträge: 545
Wohnort: Baden Würtemberg

BeitragVerfasst am: 01.08.2006, 18:46    Titel: Antworten mit Zitat

also wenn du recht einfach TTF Fonts in FB verwenden willst solltest du die einmal http://www.freebasic.net/forum/viewtopic.php?t=1713&highlight=gfxlibttf
den Thread anschauen. Funktioniert soweit recht gut.
_________________
MfG Kai Bareis
Es ist noch kein Meister vom Himmel gefallen! Warum einfach wens auch umständlich geht!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
oldirty



Anmeldungsdatum: 04.08.2005
Beiträge: 65

BeitragVerfasst am: 01.08.2006, 19:37    Titel: Antworten mit Zitat

Hallo,

hier nochmals ein Tip: da ab der Version 0.17b vom 22.07.2006 die Einbindung der libgfxlibttf.a nicht mehr funktioniert (wird über die gfxlibttf.bi gemacht, Prg. lässt sich dann nicht mehr compilieren):

Code als SUB_ttf.bas abspeichern und über

Code:

#include once "SUB_TTF.bas"


mit ins Programm einbinden (anstelle der o. g. lib).

Info:
Code:

InitTTF


muss nach dem Screen-Aufruf ausgeführt werden.

Dann alles Weitere wie aus demo ersichtlich verwenden.


Code:

'Umgestaltet am 25/07/06 (Nur Zeile 6 und Zeile 17-20), damit diese Version als
'SUB_ttf.bas in alle Programme (ohne Verwendung der libgfxlibttf.a, da diese
'ab Version 0.17 vom 22/07/06 nicht mehr geht.
'Björn Hamcke

Option Explicit

#include once "windows.bi"
'#include "gfxlibttf.bi"
#include once "externs.bi"

Enum FontOptionsEnum
    Bold = &b1
    Italic = &b10
    Underline = &b100
    StrikeThrough = &b1000
    AntiAliased = &b10000
End Enum

'Declare Function FormatMessage Alias "FormatMessageA" _
'        (ByVal dwFlags As DWORD, ByVal lpSource As LPCVOID, ByVal dwMessageId As DWORD, _
'         ByVal dwLanguageId As DWORD, ByVal lpBuffer As LPTSTR, ByVal nSize As DWORD, _
'         ByVal Arguments As Any Ptr) As DWORD
Declare Function PrintFont(ByVal x As Integer, ByVal y As Integer, ByVal Text As String, ByVal TextColor As uInteger = 0, ByVal ReturnSprite As Integer = 0) As Integer
Declare Function SetFont(ByVal FontName As String = "Arial", ByVal FontSize As uInteger = 12, ByVal FontOptions As uInteger = 0) As HFONT
Declare Function PrintFontSm(ByVal x As Integer, ByVal y As Integer, ByVal Text As String, ByVal TextColor As uInteger = 0, ByVal ReturnSprite As Integer = 0) As Integer
Declare Function InitTTF As Integer
Declare Function GetTextWidth(ByVal Text As String)

Dim Shared BitmapV4Header As BitmapV4Header
Dim Shared MemBMP As HBITMAP
Dim Shared MemDC As HDC
Dim Shared MemSprite As Any Ptr
Dim Shared IsItalic As BOOL

Function InitTTF As Integer
    Dim BitmapPalette As LOGPALETTE Ptr
   
    ' Set up BitmapV4Header for ARGB:
    With BitmapV4Header
        .bV4Size = SizeOf(BitmapV4Header)
        .bV4Width = FB_Mode->Width
        .bV4Height = -FB_Mode->Height
        .bV4Planes = 1
        .bV4BitCount = 32
        .bV4V4Compression = BI_BITFIELDS
        .bV4SizeImage = FB_Mode->Width * FB_Mode->Height * 4
        .bV4XPelsPerMeter = 1
        .bV4YPelsPerMeter = 1
        .bV4ClrUsed = 0
        .bV4ClrImportant = 0
    End With   
   
    ' Create Memory Bitmap
    MemDC = CreateCompatibleDC( GetDC(FB_Win32.Wnd))
    MemBMP = CreateCompatibleBitmap( GetDC(FB_Win32.Wnd), FB_Mode->Width, FB_Mode->Height)
   
    SelectObject MemDC, MemBMP
   
    SetBkColor MemDC, Rgb(255, 0, 255)
    SetBkMode(MemDC, TRANSPARENT)
   
    PrintFont -999, -999, ".", Rgb(0, 0, 0)
   
    If cInt(MemDC) And cInt(MemBMP) Then Return TRUE
End Function

Function SetFont(ByVal FontName As String = "Arial", ByVal FontSize As uInteger = 12, ByVal FontOptions As uInteger = 0) As HFONT
    Dim nHeight As uInteger
    Dim nWidth As uInteger
    Dim nEscapement As uInteger
    Dim nOrientation As uInteger
    Dim fnWeight As uInteger
    Dim fdwItalic As uInteger
    Dim fdwUnderline As uInteger
    Dim fdwStrikeOut As uInteger
    Dim fdwCharSet As uInteger
    Dim fdwOutputPrecision As uInteger
    Dim fdwClipPrecision As uInteger
    Dim fdwQuality As uInteger
    Dim fdwPitchAndFamily As uInteger
   
    Dim hFont As HFONT
    Dim hDC As HDC
   
    hDC = GetDC(FB_Win32.Wnd)
    nHeight = -MulDiv(FontSize, GetDeviceCaps(hDC, LOGPIXELSY), 72)' "pt" sized
    nWidth = 0

    nEscapement = NULL
    nOrientation = NULL
    If FontOptions And Bold Then fnWeight = 700 Else fnWeight = 100
    If FontOptions And Italic Then fdwItalic = TRUE
    If FontOptions And Italic Then IsItalic = TRUE Else IsItalic = FALSE
    If FontOptions And Underline Then fdwUnderline = TRUE
    If FontOptions And StrikeThrough Then fdwStrikeOut = TRUE
   
    fdwQuality = ANTIALIASED_QUALITY
    fdwCharSet = NULL
    fdwOutputPrecision = NULL
    fdwClipPrecision = NULL
    fdwQuality = NULL
    fdwPitchAndFamily = NULL
   
    hFont = CreateFont(             _
        nHeight,                    _
        nWidth,                     _
        nEscapement,                _
        nOrientation,               _
        fnWeight,                   _
        fdwItalic,                  _
        fdwUnderline,               _
        fdwStrikeOut,               _
        fdwCharSet,                 _
        fdwOutputPrecision,         _
        fdwClipPrecision,           _
        fdwQuality,                 _
        fdwPitchAndFamily,          _
        StrPtr(FontName)            _
    )
   
    DeleteObject SelectObject(MemDC, hFont)
   
    Return hFont
End Function

Function PrintFontSm(ByVal x As Integer, ByVal y As Integer, ByVal Text As String, ByVal TextColor As uInteger = 0, ByVal ReturnSprite As Integer = 0) As Integer
    Dim TextSize As SIZE
    Dim Sprite As Any Ptr
    Dim SpriteData As uByte Ptr
    Dim NewSprite As uByte Ptr
    Dim NewRect As RECT
    Dim ReturnSpriteA As Any Ptr
    Dim As Integer cx, cy
   
    ReturnSpriteA = cPtr(Any Ptr, ReturnSprite)
   
    'Calculate Width And Height
    GetTextExtentPoint32 MemDC, StrPtr(Text), Len(Text), @TextSize
    If TextSize.cx + x > FB_Mode->Width Then TextSize.cx = FB_Mode->Width - x
    If TextSize.cy + y > FB_Mode->Height Then TextSize.cy = FB_Mode->Height - y
   
    Sprite = ImageCreate(TextSize.cx, TextSize.cy)

    NewRect.Right = TextSize.cx
    NewRect.Bottom = TextSize.cy
   
    'Copy To Sprite
    With BitmapV4Header
        .bV4Width = TextSize.cx
        .bV4Height = -TextSize.cy
        .bV4SizeImage = TextSize.cx * TextSize.cy * 4
    End With
   
    SetTextColor MemDC, TextColor
    SetBkMode MemDC, OPAQUE
    TextOut MemDC, 0, 0, StrPtr(Text), Len(Text)
    SetBkMode MemDC, TRANSPARENT
   
    GetDIBits MemDC, MemBMP, 0, TextSize.cy, Sprite + 4, cPtr(BITMAPINFO Ptr, @BITMAPV4HEADER), DIB_RGB_COLORS
   
    If ReturnSprite = 0 Then
        'PUT On Screen
        Put (x, y), Sprite, TRANS
        ImageDestroy Sprite
        Return TRUE
    Else
        Put ReturnSpriteA, (x, y), Sprite, PSET
        ImageDestroy Sprite
        Return TRUE

    End If
End Function

Function PrintFont(ByVal x As Integer, ByVal y As Integer, ByVal Text As String, ByVal TextColor As uInteger, ByVal ReturnSprite As Integer = 0) As Integer
    Dim TextSize As SIZE
    Dim Sprite As Any Ptr
    Dim SpriteData As uByte Ptr
    Dim NewSprite As uByte Ptr
    Dim NewRect As RECT
    Dim ReturnSpriteA As Any Ptr
    Dim As Integer cx, cy
   
    ReturnSpriteA = cPtr(Any Ptr, ReturnSprite)
   
    'Calculate Width And Height
    GetTextExtentPoint32 MemDC, StrPtr(Text), Len(Text), @TextSize
    TextSize.cx += 30
    If TextSize.cx + x > FB_Mode->Width Then TextSize.cx = FB_Mode->Width - x
    If TextSize.cy + y > FB_Mode->Height Then TextSize.cy = FB_Mode->Height - y
   
    Sprite = ImageCreate(TextSize.cx, TextSize.cy)

    NewRect.Right = TextSize.cx
    NewRect.Bottom = TextSize.cy
   
    If ReturnSprite Then
        Get ReturnSpriteA, (x, y)-(x + TextSize.cx -1, y + TextSize.cy - 1), Sprite
    Else
        Get (x, y)-(x + TextSize.cx -1, y + TextSize.cy - 1), Sprite
    End If
   
    'Copy To Sprite
    With BitmapV4Header
        .bV4Width = TextSize.cx
        .bV4Height = -TextSize.cy
        .bV4SizeImage = TextSize.cx * TextSize.cy * 4
    End With
   
    SetDIBits MemDC, MemBMP, 0, TextSize.cy, Sprite + 4, cPtr(BITMAPINFO Ptr, @BITMAPV4HEADER), DIB_RGB_COLORS
   
    SetTextColor MemDC, TextColor
    DrawText MemDC, StrPtr(Text), Len(Text), @NewRect, NULL
   
    GetDIBits MemDC, MemBMP, 0, TextSize.cy, Sprite + 4, cPtr(BITMAPINFO Ptr, @BITMAPV4HEADER), DIB_RGB_COLORS
   
    If ReturnSprite = 0 Then
        'PUT On Screen
        Put (x, y), Sprite, PSET
       
        ImageDestroy Sprite
    Else
        Put ReturnSpriteA, (x, y), Sprite, PSET
        ImageDestroy Sprite
        Return TRUE

    End If
End Function

Function GetTextWidth(ByVal Text As String)
    Dim TextSize As SIZE
    GetTextExtentPoint32 MemDC, StrPtr(Text), Len(Text), @TextSize
   
    Return TextSize.cx
End Function


Viel spass beim Ausprobieren.

OlDirty
www.dekorative-holzarbeiten.de/OlDirty/Index.htm
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
zwergnase



Anmeldungsdatum: 03.01.2006
Beiträge: 26
Wohnort: Frankfurt am Main

BeitragVerfasst am: 01.08.2006, 20:46    Titel: Auch unter DOS Antworten mit Zitat

Läuft die lib auch unter DOS?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Kai Bareis



Anmeldungsdatum: 10.09.2004
Beiträge: 545
Wohnort: Baden Würtemberg

BeitragVerfasst am: 01.08.2006, 20:49    Titel: Antworten mit Zitat

Ne unter Dos geht das nicht. Aber du kannst eventuell mit Qbasic 4.5 und der X.print Routinen von AK ARL Fonts nehmen.
_________________
MfG Kai Bareis
Es ist noch kein Meister vom Himmel gefallen! Warum einfach wens auch umständlich geht!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
stevie1401



Anmeldungsdatum: 04.07.2006
Beiträge: 133

BeitragVerfasst am: 02.08.2006, 10:35    Titel: Antworten mit Zitat

Ich habe für Windows und Linux und DOS Fonts erstellt. Ich kann sie dir gerne per E-Mail geben.
Das gute an diesen SUBS ist, dass man weder auf die die Windows-API noch auf Linux-Routinen zurückgreifen muss. Es werden die Buchstaben einfach gemalt.
Hier die SUBS, wie man die Schriften laden und damit schreiben kann. Sollte eigentlich selbsterklärend sein:

Code:


rem ********Programmbeginn************************************
declare sub schreibe(x,y,satz$,farbe,rechts)
declare Sub ladefont(lade$)
b=254
c=64*64
Dim Shared letter_punkte(b),letter_x(b,c),letter_y(b,c),letter_breite(b)
Screen 20,32,2,1
color 0,rgb(255,255,255)
cls
ladefont exepath+"\font\verdana08.fon"

schreibe 100,100,"Hallo Welt!",rgb(255,0,0),0
sleep
Sub ladefont(lade$)
    Open "i",#1, lade$
    For i=1 To 254
        Input #1,letter_breite(i)
        Input #1,letter_punkte(i)
        For j=1 To letter_punkte(i)
            Input #1,letter_x(i,j)
            Input #1,letter_y(i,j)
        Next j
    Next i
    Close #1
     
End Sub
Sub schreibe(x,y,satz$,farbe,rechts)
    rem Erklärung für rechts:
    rem Wenn rechts=0, dann schreibt er ganz normal von links nach rechts,
    rem wenn rechts=1, dann schreibt er von rechts nach links.
    rem Das ist sinnvoll, wenn man Zahlen untereinander schreibt.
    satz_laenge=0
    Dim s_pace(Len(satz$))
    For i=1 To Len(satz$)
        t$=Mid$(satz$,i,1)
        ascii=Asc(t$)
        s_pace(i)=letter_breite(ascii)
        If t$=Chr$(32) Then s_pace(i)=2
        satz_laenge=satz_laenge+letter_breite(ascii)
    Next i
    If rechts=0 Then
        b=0
        s=0
        t=Len(satz$)
        For i=1 To t
            t$=Mid$(satz$,i,1)
            ascii=Asc(t$)
            If i=1 Then
                t_space=0
            Else
                t_space=s_pace(i-1)+2
            End If
            s=s+t_space
            b=b+1
            If b=1 Then
                For p1=1 To letter_punkte(ascii)
                    Pset(letter_x(ascii,p1)+x,letter_y(ascii,p1)+y),farbe
                Next p1
            Else
                For p1=1 To letter_punkte(ascii)
                    Pset(letter_x(ascii,p1)+s+x,letter_y(ascii,p1)+y),farbe
                Next p1
            End If
        Next t
    End If
    If rechts=1 Then
        b=0
        s=0
        t=Len(satz$)
        i=t+1
        Do
            i=i-1
            t$=Mid$(satz$,i,1)
            ascii=Asc(t$)
            If b=0 Then
                t_space=0
            Else
                t_space=s_pace(i)+2
            End If
            s=s+t_space
            b=b+1
            If b=1 Then
                For p1=1 To letter_punkte(ascii)
                    Pset(letter_x(ascii,p1)+x,letter_y(ascii,p1)+y),farbe
                Next p1
            Else
                For p1=1 To letter_punkte(ascii)
                    Pset(letter_x(ascii,p1)-s+x,letter_y(ascii,p1)+y),farbe
                Next p1
            End If
        Loop Until i=1
    End If
    Erase s_pace
End Sub
rem ****Programmende*******




Grüsse

Stevie1401
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail 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