Request Windows Font / Draw Text
BlitzMax Forums/MaxGUI Module/Request Windows Font / Draw Text
| ||
| Hi, I'm trying to load a font image so that I can draw text to a canvas. I was using blitplus, but it displays text with a weird anti aliasing colour. And as the request font in maxgui doesn't let you use that font with drawtext, I found some great code by Neilo - http://www.blitzbasic.com/Community/posts.php?topic=57224#bottom However, the font never gets loaded / created. I've put in what I think are checks for a null object, but that's not working as expected. I'm new to using bmax / maxgui stuff, so go easy on me! ;) The test code I knocked up from the examples included with bmax. And I don't want to use other peoples modules,if I can help it even though their great and all, I never get them to sync or interface properlly. Here's the codes. And I really appreciate the help!! -Clyde. Test Code
SuperStrict
Import MaxGui.Drivers
Import BRL.freetypefont
Include "neilo - request windows font.bmx"
Const LOAD_FONT:Int=1
Const EXIT_PROG:Int=2
Global app_window:TGadget
Global app_canvas:TGadget
Global app_menu:TGadget
Global file_menu:TGadget
Global image_font:Timagefont
Global true_type_font:WindowsFont
init_app()
main_app()
Function main_app()
While WaitEvent()
Select EventID()
Case EVENT_GADGETPAINT
Select EventSource()
Case app_canvas
'
' Draw to the canvas
SetGraphics CanvasGraphics(app_canvas)
Cls
If ( image_font ) Then
SetImageFont( image_font )
End If
SetColor 255,255,255
DrawText "example text",0,0
'End If
Flip
RedrawGadget ( app_canvas )
End Select
Case EVENT_WINDOWCLOSE
'
' Quit
End
Case EVENT_WINDOWACCEPT
Case EVENT_MENUACTION
'
' Menu stuff
Select EventData()
Case LOAD_FONT
Local cx:Int=ClientWidth (Desktop())/2 - 269 / 2
Local cy:Int=ClientHeight (Desktop())/2 - 234 / 2
true_type_font=RequestWindowsFont( cx, cy, Null )', true_type_font )
If ( true_type_font=Null ) Then
Notify "null object"
End If
load_image_font( true_type_font )
Case EXIT_PROG
End
End Select
EndSelect
Wend
EndFunction
Function load_image_font( font_name:WindowsFont )
image_font=LoadImageFont( font_name.name, font_name.size )
If (image_font=Null ) Then
Notify "creation unsuccessfull"
End If
End Function
Function init_app()
graphics_gui("draw text to canvas",640,480)
End Function
Function graphics_gui( title:String, wwidth:Int, height:Int )
Local cx:Int =ClientWidth (Desktop())/2 - wwidth/2
Local cy:Int =ClientHeight (Desktop())/2 - height/2
app_window=CreateWindow( title, cx, cy, wwidth, height )
app_canvas=CreateCanvas( 0, 0, ClientWidth(app_window),ClientHeight(app_window), app_window )
app_menu =WindowMenu(app_window)
file_menu =CreateMenu("&File",0, WindowMenu(app_window))
CreateMenu("&Load Font" ,LOAD_FONT, file_menu)
CreateMenu("E&xit" ,EXIT_PROG, file_menu)
UpdateWindowMenu( app_window )
End Function
Request Windows Font - Neilo ' ' http://www.blitzbasic.com/Community/posts.php?topic=57224#bottom ' Type WindowsFont Field name:String Field fullPath:String Field size:Int End Type Function RequestWindowsFont:WindowsFont(x:Int,y:Int,font:WindowsFont) Local win:TGadget Local btnOk:TGadget Local btnCancel:TGadget Local lstFontNames:TGadget Local lstFontSizes:TGadget Local tbFontSize:TGadget Local canSample:TGadget Local fontPath:String Local fontDirHandle:Int Local fileName:String Local quit:Int Local iFont:TImageFont Local i:Int Local winFont:WindowsFont Local defaultFontSizes:Int[]=[8,10,12,14,18,24,36,48,72] Function renderSampleText(gr:TGraphics,font:TImageFont) Local width:Int,tWidth:Int Local height:Int,tHeight:Int Local x:Int,y:Int SetGraphics gr width=GraphicsWidth() height=GraphicsHeight() SetImageFont font tWidth=TextWidth("Sample") tHeight=TextHeight("Sample") x=(width-tWidth)/2 y=(height-tHeight)/2 Cls DrawText "Sample",x,y Flip End Function win=CreateWindow("Select Font",x,y,269,234,Null,WINDOW_TITLEBAR|WINDOW_CLIENTCOORDS) lstFontNames=CreateListBox(3,3,200,140,win) tbFontSize=CreateTextField(GadgetX(lstFontNames)+GadgetWidth(lstFontNames)+3,.. GadgetY(lstFontNames),60,22,win) lstFontSizes=CreateListBox(GadgetX(tbFontSize),GadgetY(tbFontSize)+26,60,.. GadgetHeight(lstFontNames)-25,win) canSample=CreateCanvas(3,146,263,60,win) btnOk=CreateButton("Ok",206,209,60,22,win) btnCancel=CreateButton("Cancel",143,209,60,22,win) fontPath=getenv_("windir") fontPath:+"\Fonts\" fontDirHandle=ReadDir(fontPath) Repeat fileName=NextFile(fontDirHandle) Select fileName Case "" Case "." Case ".." Default If Right(fileName,3)="ttf" Then .. AddGadgetItem lstFontNames,fileName End Select Until fileName="" For i=0 To defaultFontSizes.length-1 AddGadgetItem lstFontSizes,defaultFontSizes[i] Next SetGadgetText tbFontSize,"16" quit=False While Not quit WaitEvent Select EventID() Case EVENT_GADGETACTION Select EventSource() Case lstFontNames i=SelectedGadgetItem(lstFontNames) If i>-1 fileName=fontPath+GadgetItemText(lstFontNames,i) iFont=LoadImageFont(fileName,TextFieldText(tbFontSize).ToInt()) renderSampleText CanvasGraphics(canSample),iFont EndIf Case lstFontSizes i=SelectedGadgetItem(lstFontSizes) If i>-1 SetGadgetText tbFontSize,GadgetItemText(lstFontSizes,i) iFont=LoadImageFont(fileName,TextFieldText(tbFontSize).ToInt()) renderSampleText CanvasGraphics(canSample),iFont EndIf Case btnOk i=SelectedGadgetItem(lstFontNames) If i>-1 winFont=New WindowsFont winFont.name=GadgetItemText(lstFontNames,i) winFont.fullPath=fontPath+GadgetItemText(lstFontNames,i) winFont.size=TextFieldText(tbFontSize).ToInt() quit=True EndIf Case btnCancel winFont=Null quit=True End Select Case EVENT_WINDOWCLOSE Select EventSource() Case win quit=True winFont=Null End Select Case EVENT_GADGETPAINT Select EventSource() Case canSample renderSampleText CanvasGraphics(canSample),iFont End Select End Select Wend FreeGadget win Return winFont End Function 'RequestWindowsFont 40,40,Null Cheers!!! :) |