Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Text Previewer (windows only)
#1
Code: (Select All)
$Color:32

Type Font_type
    name As String
    dir As String
End Type
Type Color_Type
    name As String
    kolor As _Unsigned Long
End Type


_Icon
Screen _NewImage(800, 600, 32)
_Title "Text Previewer"

ReDim As Font_type Font(0)
ReDim Shared As Color_Type Kolor(0)
ReDim Shared As Font_type DefaultFont
Dim Shared As _Unsigned Long Background, FontColor, MouseScroll, DefaultFontSize, CurrentImage
Dim Shared As String UserText, BackgroundName, FontColorName
Dim Shared As Long CurrentFG, CurrentBG, PrintMode


GetFonts Font()
CleanFontList Font()
GetColors
UserText = "Hello World"
DefaultFontSize = 24

CurrentFG = 262: CurrentBG = 236
FontColor = White: FontColorName = "White"
Background = SkyBlue: BackgroundName = "SkyBlue"
CurrentImage = -11
PrintMode = 3

Do
    Cls , 0
    MouseScroll = 0
    While _MouseInput
        MouseScroll = MouseScroll + _MouseWheel
    Wend

    DropDownFontList 100, 420, 300, Font()
    Sizer 420, 420
    GetText 100, 470, 300
    ChangeImage 540, 420, 150, 150
    ChangeColors
    ChoosePrintMode

    Preview
    _Limit 30
    _Display
Loop Until _KeyDown(32)
System

Sub ChoosePrintMode
    Static oldmb
    mb = _MouseButton(1)
    x1 = 420: x2 = 454: x3 = 488
    y = 470: wide = 30: tall = 36
    _Font 16
    Line (x1, y)-Step(wide + 2, tall + 2), Gold, BF
    Line (x2, y)-Step(wide + 2, tall + 2), Gold, BF
    Line (x3, y)-Step(wide + 2, tall + 2), Gold, BF

    If mb And Not oldmb Then
        If _MouseY >= y And _MouseY <= y + tall + 2 Then
            If _MouseX >= x1 And _MouseX <= x1 + wide + 2 Then PrintMode = 1
            If _MouseX >= x2 And _MouseX <= x2 + wide + 2 Then PrintMode = 2
            If _MouseX >= x3 And _MouseX <= x3 + wide + 2 Then PrintMode = 3
        End If
    End If
    oldmb = mb



    If PrintMode = 1 Then
        Line (x1 + 1, y + 1)-Step(wide, tall), SkyBlue, BF
    Else
        Line (x1 + 1, y + 1)-Step(wide, tall), LightGray, BF
    End If
    If PrintMode = 2 Then
        Line (x2 + 1, y + 1)-Step(wide, tall), SkyBlue, BF
    Else
        Line (x2 + 1, y + 1)-Step(wide, tall), LightGray, BF
    End If

    If PrintMode = 3 Then
        Line (x3 + 1, y + 1)-Step(wide, tall), SkyBlue, BF
    Else
        Line (x3 + 1, y + 1)-Step(wide, tall), LightGray, BF
    End If
    UCprint 428, 475, Black, 0, "NO"
    UCprint 428, 493, Black, 0, "BG"
    UCprint 462, 475, Black, 0, "NO"
    UCprint 462, 493, Black, 0, "FG"
    UCprint 493, 482, Black, 0, "ALL"

End Sub

Sub ChangeColors
    x1 = 100: x2 = 320
    y = 530
    wide = 200: tall = 32
    Line (x1, y)-Step(wide + 4, tall + 4), Gold, BF
    Line (x1 + 2, y + 2)-Step(wide, tall), FontColor, BF


    If _KeyDown(100304) Or _KeyDown(100303) Then MouseScroll = _Ceil(MouseScroll / 20 * UBound(Kolor))

    If _MouseY >= y And _MouseY <= y + 36 Then
        If _MouseX >= x1 And _MouseX <= x1 + wide + 4 Then
            CurrentFG = CurrentFG + MouseScroll
            If CurrentFG < 0 Then CurrentFG = UBound(Kolor)
            If CurrentFG > UBound(Kolor) Then CurrentFG = 0
            FontColor = Kolor(CurrentFG).kolor
            FontColorName = Kolor(CurrentFG).name
        End If
        If _MouseX >= x2 And _MouseX <= x2 + wide + 4 Then
            CurrentBG = CurrentBG + MouseScroll
            If CurrentBG < 0 Then CurrentBG = UBound(Kolor)
            If CurrentBG > UBound(Kolor) Then CurrentBG = 0
            Background = Kolor(CurrentBG).kolor
            BackgroundName = Kolor(CurrentBG).name
        End If
    End If

    h = (tall - _UFontHeight) \ 2
    w = (wide - _UPrintWidth(FontColorName)) \ 2
    w2 = (wide - _UPrintWidth(BackgroundName)) \ 2

    Line (x2, y)-Step(wide + 4, tall + 4), Gold, BF
    Line (x2 + 2, y + 2)-Step(wide, tall), Background, BF
    UCprint x1 + w, y + h, Black, 0, FontColorName
    UCprint x2 + w2, y + h, Black, 0, BackgroundName
    UCprint x1 + w, y + h + 35, White, 0, FontColorName
    UCprint x2 + w2, y + h + 35, White, 0, BackgroundName
End Sub

Sub GetColors
    file$ = ".\internal\support\color\color32.bi"
    If _FileExists(file$) = 0 Then Exit Sub 'bad path, bad file... some glitch... we can't work
    Open file$ For Binary As #1
    ReDim Kolor(1000) As Color_Type

    Do Until EOF(1)
        Line Input #1, text$
        If UCase$(Left$(text$, 5)) = "CONST" Then
            count = count + 1
            text$ = Mid$(text$, 7) 'strip off the CONST and space
            l = InStr(text$, "=")
            Kolor(count).name = Left$(text$, l - 4)
            Kolor(count).kolor = Val(Mid$(text$, l + 2))
        End If
    Loop
    Close
    ReDim _Preserve Kolor(count) As Color_Type
End Sub




Sub ChangeImage (x, y, wide, tall)
    Static oldmb
    mb = _MouseButton(1)
    Line (x, y)-Step(wide + 4, tall + 4), Gold, BF
    Line (x + 2, y + 2)-Step(wide, tall), Background, BF
    If _MouseX >= x And _MouseX <= x + wide + 4 Then
        If _MouseY >= y And _MouseY <= y + tall + 4 Then
            If mb And Not oldmb Then
                If CurrentImage <> 0 And CurrentImage <> -11 Then _FreeImage CurrentImage
                result$ = _OpenFileDialog$("Background Image", , ".png|*.jpg|*.bmp|*.gif", "Image File")
                If result$ <> "" Then
                    CurrentImage = _LoadImage(result$, 32)
                Else
                    CurrentImage = 0
                End If
            End If
        End If
    End If
    If CurrentImage <> 0 Then _PutImage (x + 2, y + 2)-Step(wide, tall), CurrentImage
    oldmb = mb
End Sub

Sub Preview
    Static As Long f, oldf, OldFontSize
    Static As String OldfontName

    Line (100, 100)-(700, 400), Gold, BF
    Line (102, 102)-(698, 398), Background, BF
    If CurrentImage <> 0 Then _PutImage (102, 102)-(698, 398), CurrentImage
    x = 100: y = 100

    If OldfontName <> DefaultFont.name Or OldFontSize <> DefaultFontSize Then
        If DefaultFont.name <> "No Font List Loaded" Then
            oldf = f
            f = _LoadFont(DefaultFont.dir, DefaultFontSize)
            _Font f
            OldfontName = DefaultFont.name
            olffontsize = DefaultFontSize
        End If
    End If
    If oldf <> f Then
        If oldf > 31 Then _FreeFont oldf
    End If

    Select Case PrintMode
        Case 1: _PrintMode _KeepBackground
        Case 2: _PrintMode _OnlyBackground
        Case 3: _PrintMode _FillBackground
    End Select
    h = (300 - _UFontHeight) \ 2
    w = (600 - _UPrintWidth(UserText)) \ 2
    UCprint x + w, y + h, FontColor, Background, UserText
    _PrintMode _FillBackground
End Sub

Sub GetText (x, y, wide)
    Static oldmb
    mb = _MouseButton(1)
    Line (x, y)-Step(wide + 4, 36), Gold, BF
    Line (x + 2, y + 2)-Step(wide, 32), SkyBlue, BF
    If _MouseX >= x And _MouseX <= x + wide + 4 Then
        If _MouseY >= y And _MouseY <= y + 36 Then
            If mb And Not oldmb Then
                result$ = _Trim$(_InputBox$("Text to Preview", "Enter text to preview", UserText$))
                If result$ <> "" Then UserText$ = result$
            End If
        End If
    End If
    out$ = UserText
    w = (wide - _UPrintWidth(out$)) \ 2
    UCprint x + w, y + 6, MidnightBlue, 0, out$
    oldmb = mb
End Sub

Sub Sizer (x, y)
    Line (x, y)-Step(100, 36), Gold, BF
    Line (x + 2, y + 2)-Step(96, 32), SkyBlue, BF

    If _MouseX >= x And _MouseX <= x + 100 Then
        If _MouseY >= y And _MouseY <= y + 36 Then
            If _KeyDown(100304) Or _KeyDown(100303) Then MouseScroll = MouseScroll * 10
            DefaultFontSize = DefaultFontSize + MouseScroll
            If DefaultFontSize < 4 Then DefaultFontSize = 128
            If DefaultFontSize > 128 Then DefaultFontSize = 4
        End If
    End If
    out$ = _Trim$(Str$(DefaultFontSize))
    w = (96 - _UPrintWidth(out$)) \ 2
    UCprint x + w, y + 6, MidnightBlue, 0, out$
End Sub

Sub DropDownFontList (x, y, wide, fontlist() As Font_type)
    Shared Font() As Font_type
    Static As Long f, CurrentFont
    If UBound(Font) = 0 Then
        DefaultFont.name = "No Font List Loaded"
        DefaultFont.dir = ""
        CurrentFont = 0
        f = 16
        oldf = 16
    End If
    If DefaultFont.name = "" Then
        CurrentFont = 1
        DefaultFont.name = Font(1).name
        DefaultFont.dir = Font(1).dir
    End If

    If _MouseX >= x And _MouseX <= x + wide + 4 Then
        If _MouseY >= y And _MouseY <= y + 36 Then
            If CurrentFont > 0 Then
                If _KeyDown(100304) Or _KeyDown(100303) Then MouseScroll = _Ceil(MouseScroll * UBound(fontlist) / 10)
                CurrentFont = CurrentFont + MouseScroll
                If CurrentFont < 1 Then CurrentFont = UBound(fontlist)
                If CurrentFont > UBound(fontlist) Then CurrentFont = 1
                DefaultFont.name = Font(CurrentFont).name
                DefaultFont.dir = Font(CurrentFont).dir
                f = _LoadFont(DefaultFont.dir, 24)
            End If
        End If
    End If

    If f = 0 Then 'initialize the font handle for the first time
        f = _LoadFont(DefaultFont.dir, 24)
        oldf = f
    End If

    If oldf <> f Then
        Print f, oldf
        If oldf <> 0 Then _FreeFont oldf
        _Font f
    End If
    If _UPrintWidth(DefaultFont.name) > wide - 4 Then
        For i = 1 To Len(DefaultFont.name)
            out$ = Left$(DefaultFont.name, i)
            If _UPrintWidth(out$) > wide Then
                out$ = Left$(out$, i - 1)
                Exit For
            End If
        Next
    Else
        out$ = DefaultFont.name
    End If


    Line (x, y)-Step(wide + 4, 36), Gold, BF
    Line (x + 2, y + 2)-Step(wide, 32), SkyBlue, BF
    w = (wide - _UPrintWidth(out$)) \ 2
    UCprint x + w, y + 6, MidnightBlue, 0, out$
    oldf = f
End Sub


Sub UCprint (x, y, kolor As _Unsigned Long, bkg As _Unsigned Long, text$)
    d = _DefaultColor: B = _BackgroundColor
    Color kolor, bkg
    _UPrintString (x, y), text$
    Color d, B
End Sub

Sub CleanFontList (FontList() As Font_type)
    For i = 1 To UBound(FontList)
        P = _InStrRev(FontList(i).name, "(") 'strip off the (True Type) type id
        If P Then FontList(i).name = Left$(FontList(i).name, P - 1)
    Next
End Sub

Sub GetFonts (FontList() As Font_type)
    BypassStupidSHELL
    F = FreeFile
    Open "temp.txt" For Binary As #F
    ReDim FontList(0) As Font_type
    If LOF(1) Then
        Do
            Line Input #1, temp$
            Select Case Right$(UCase$(temp$), 4)
                Case "FON", "FNT", "PCF", "BDF"
                    _Continue
            End Select
            P = InStr(temp$, "REG_SZ")
            If P Then
                l$ = _Trim$(Left$(temp$, P - 1))
                r$ = _Trim$(Mid$(temp$, P + 7))
                count = count + 1
                If UBound(fontlist) < count Then
                    ReDim _Preserve FontList(count + 1000) As Font_type
                End If
                FontList(count).name = l$
                FontList(count).dir = r$
            End If
        Loop Until EOF(1)
    End If
    Close #F
    Kill "temp.txt"
    ReDim _Preserve FontList(count) As Font_type

    'a quick and simple combsort to make certain our list is in alphabetical order

    gap = count
    Do
        gap = 10 * gap \ 13
        If gap < 1 Then gap = 1
        i = 1
        swapped = 0
        Do
            If FontList(i).name > FontList(i + gap).name Then
                Swap FontList(i).name, FontList(i + gap).name
                Swap FontList(i).dir, FontList(i + gap).dir
                swapped = -1
            End If
            i = i + 1
        Loop Until i + gap > count
    Loop Until gap = 1 And swapped = 0
End Sub

Sub BypassStupidSHELL
    f = FreeFile
    Open "makelist.bat" For Output As #f
    Print #f, "reg query " + Chr$(34) + "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts" + Chr$(34) + " /s > temp.txt"
    Close f
    Open "temp.txt" For Output As #f: Close f
    Shell _Hide "makelist.bat"
    Kill "makelist.bat"
End Sub


As Dimster brought up here -- https://qb64phoenix.com/forum/showthread.php?tid=2505 -- there's no really great tool out there right now for previewing what text might look like on the screen; especially when changing colors/backgrounds/fonts/images.

This is the start of my solution to such a preview tool.

At the moment, this gets a list of all the fonts on an user's computer (Windows only), and it produces a preview pane with a background and font color, letting you choose your font and see how it'd  look with that configuration.
Reply


Messages In This Thread
Text Previewer (windows only) - by SMcNeill - 03-17-2024, 06:46 PM
RE: Text Previewer (windows only) - by a740g - 03-17-2024, 06:56 PM
RE: Text Previewer (windows only) - by SMcNeill - 03-17-2024, 07:00 PM
RE: Text Previewer (windows only) - by a740g - 03-17-2024, 07:05 PM
RE: Text Previewer (windows only) - by bplus - 03-17-2024, 07:14 PM
RE: Text Previewer (windows only) - by SMcNeill - 03-17-2024, 07:16 PM
RE: Text Previewer (windows only) - by mdijkens - 03-25-2024, 12:52 PM
RE: Text Previewer (windows only) - by SMcNeill - 03-17-2024, 07:46 PM
RE: Text Previewer (windows only) - by SMcNeill - 03-17-2024, 11:15 PM
RE: Text Previewer (windows only) - by SMcNeill - 03-18-2024, 12:31 AM
RE: Text Previewer (windows only) - by SMcNeill - 03-18-2024, 12:38 AM
RE: Text Previewer (windows only) - by SMcNeill - 03-18-2024, 12:34 PM
RE: Text Previewer (windows only) - by Pete - 03-25-2024, 02:47 AM
RE: Text Previewer (windows only) - by SMcNeill - 03-25-2024, 02:34 PM



Users browsing this thread: 3 Guest(s)