Dynamic Fonts
From CEGUI Wiki - Crazy Eddie's GUI System (Open Source)
(Redirected from DynamicFont)
Written for CEGUI 0.5
Works with versions 0.5.x (obsolete)
Written for CEGUI 0.6
Works with versions 0.6.x (obsolete)
Introduction
The datafiles\fonts folder contains static font definitions such as Commonwealth-10.font. The XML contents of that file specify one particular font, mainly a logical name (Commonwealth-10), a filename (Commonv2c.ttf), and a size (10). To load this static font definition you'd write the following line of code:
CEGUI::FontManager::getSingleton().createFont("Commonwealth-10.font");
This works well, but sometimes you need to display a same font in various sizes. One approach is to create multiple .font files, one per font size. But there is a better approach, a way to dynamically create fonts.
Please post comments or questions on the message board thread for the DynamicFont
Files
DynamicFont.h
#ifndef _DynamicFont_h_ #define _DynamicFont_h_ #include "CEGuiSample.h" #include "CEGUI.h" #include "CEGUIXMLAttributes.h" class DemoSample : public CEGuiSample { public: bool initialiseSample() { using namespace CEGUI; try { // Retrieve the window manager WindowManager& winMgr = WindowManager::getSingleton(); // Load the TaharezLook scheme and set up the default mouse cursor and font SchemeManager::getSingleton().loadScheme("TaharezLook.scheme"); System::getSingleton().setDefaultMouseCursor("TaharezLook", "MouseArrow"); if(!FontManager::getSingleton().isFontPresent("Commonwealth-10")) FontManager::getSingleton().createFont("Commonwealth-10.font"); // Set the GUI Sheet Window* sheet = winMgr.createWindow("DefaultWindow", "root_wnd"); System::getSingleton().setGUISheet(sheet); // Load a layout Window* guiLayout = winMgr.loadWindowLayout("DynamicFont.layout"); sheet->addChildWindow(guiLayout); // Configure the event for the list of created fonts CEGUI::Combobox* existingFonts = static_cast<CEGUI::Combobox*>(winMgr.getWindow("DynamicFont/Fonts")); existingFonts->subscribeEvent(CEGUI::Combobox::EventListSelectionAccepted, CEGUI::Event::Subscriber(&DemoSample::eventSelectExistingFont, this)); // Configure the event for the add button CEGUI::PushButton* add = static_cast<CEGUI::PushButton*>(winMgr.getWindow("DynamicFont/Add")); add->subscribeEvent(CEGUI::PushButton::EventMouseClick, CEGUI::Event::Subscriber(&DemoSample::eventAddFont, this)); // Add the font previously created addExistingFont("Commonwealth-10"); } catch(Exception &e) { #if defined( __WIN32__ ) || defined( _WIN32 ) MessageBox(NULL, e.getMessage().c_str(), "Error initializing the demo", MB_OK | MB_ICONERROR | MB_TASKMODAL); #else std::cerr << "Error initializing the demo:" << e.getMessage().c_str() << "\n"; #endif } return true; } void cleanupSample(void) { } bool eventAddFont(const CEGUI::EventArgs& args) { // Add a font from the specified parameters using namespace CEGUI; WindowManager& winMgr = WindowManager::getSingleton(); Window* nameText = winMgr.getWindow("DynamicFont/Name"); Window* filenameText = winMgr.getWindow("DynamicFont/Filename"); Window* sizeText = winMgr.getWindow("DynamicFont/Size"); setFont(nameText->getText(), filenameText->getText(), sizeText->getText()); return true; } void addExistingFont(const CEGUI::String& pName) { // Once a font has been created we add it to the combobox of fonts using namespace CEGUI; WindowManager& winMgr = WindowManager::getSingleton(); Combobox* existingFonts = static_cast<CEGUI::Combobox*>(winMgr.getWindow("DynamicFont/Fonts")); ListboxTextItem* itemCombobox = new ListboxTextItem(pName); itemCombobox->setSelectionBrushImage("TaharezLook", "MultiListSelectionBrush"); itemCombobox->setSelected(true); existingFonts->addItem(itemCombobox); } bool eventSelectExistingFont(const CEGUI::EventArgs& args) { // Use an already created font using namespace CEGUI; WindowManager& winMgr = WindowManager::getSingleton(); Combobox* existingFonts = static_cast<CEGUI::Combobox*>(winMgr.getWindow("DynamicFont/Fonts")); setFont(existingFonts->getText(), "", ""); return true; } void setFont(const CEGUI::String& pName, const CEGUI::String& pFilename, const CEGUI::String& pSize) { // Set the font displayed within the multiline editbox using namespace CEGUI; String sampleText(pName); WindowManager& winMgr = WindowManager::getSingleton(); CEGUI::Window* text = winMgr.getWindow("DynamicFont/Text"); Font* font; if(FontManager::getSingleton().isFontPresent(pName)) { // Select a previously created font font = FontManager::getSingleton().getFont(pName); } else { // Dynamically create a new font XMLAttributes xmlAttributes; // Attributes specified within CEGUIFont.cpp xmlAttributes.add("Name", pName); xmlAttributes.add("Filename", pFilename); xmlAttributes.add("ResourceGroup", ""); xmlAttributes.add("AutoScaled", "true"); xmlAttributes.add("NativeHorzRes", "800"); xmlAttributes.add("NativeVertRes", "600"); // Attributes specified within CEGUIXMLAttributes.cpp xmlAttributes.add("Size", pSize); xmlAttributes.add("AntiAlias", "true"); try { font = FontManager::getSingleton().createFont("FreeType", xmlAttributes); if(font) { font->load(); // This function must be used addExistingFont(pName); } } catch(Exception &e) { // Display the error message sampleText = e.getMessage(); } } text->setFont(font); text->setText(sampleText); } private: }; #endif // _DynamicFont_h_
main.cpp
#if defined( __WIN32__ ) || defined( _WIN32 ) #define WIN32_LEAN_AND_MEAN #define NOMINMAX #include "windows.h" #endif #include "DynamicFont.h" #if defined( __WIN32__ ) || defined( _WIN32 ) int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) #else int main(int argc, char *argv[]) #endif { DemoSample app; return app.run(); }
DynamicFont.layout
<?xml version="1.0" encoding="UTF-8"?> <GUILayout > <Window Type="TaharezLook/FrameWindow" Name="DynamicFont" > <Property Name="Text" Value="Dynamic Font" /> <Property Name="TitlebarFont" Value="Commonwealth-10" /> <Property Name="InheritsAlpha" Value="False" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="TitlebarEnabled" Value="True" /> <Property Name="UnifiedAreaRect" Value="{{0.02,0},{0.054167,0},{0.98,0},{0.781251,0}}" /> <Window Type="TaharezLook/MultiLineEditbox" Name="DynamicFont/Text" > <Property Name="Text" > </Property> <Property Name="ReadOnly" Value="True" /> <Property Name="MaxTextLength" Value="1073741823" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.01,0},{0.075,0},{0.99,0},{0.715617,0}}" /> </Window> <Window Type="TaharezLook/StaticText" Name="DynamicFont/NameLabel" > <Property Name="Text" Value="Name:" /> <Property Name="HorzFormatting" Value="RightAligned" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.018409,0},{0.881661,0},{0.0809004,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/Editbox" Name="DynamicFont/Name" > <Property Name="MaxTextLength" Value="1073741823" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.0809,0},{0.881661,0},{0.328819,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/StaticText" Name="DynamicFont/FilenameLabel" > <Property Name="Font" Value="Commonwealth-10" /> <Property Name="Text" Value="Filename:" /> <Property Name="HorzFormatting" Value="RightAligned" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.347544,0},{0.881661,0},{0.438807,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/Editbox" Name="DynamicFont/Filename" > <Property Name="Font" Value="Commonwealth-10" /> <Property Name="MaxTextLength" Value="1073741823" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.438807,0},{0.881661,0},{0.713682,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/StaticText" Name="DynamicFont/SizeLabel" > <Property Name="Font" Value="Commonwealth-10" /> <Property Name="Text" Value="Size:" /> <Property Name="HorzFormatting" Value="RightAligned" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.731982,0},{0.881661,0},{0.793499,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/Editbox" Name="DynamicFont/Size" > <Property Name="Font" Value="Commonwealth-10" /> <Property Name="MaxTextLength" Value="1073741823" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.793499,0},{0.881661,0},{0.858294,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/Button" Name="DynamicFont/Add" > <Property Name="Text" Value="Add" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.867109,0},{0.881661,0},{0.974324,0},{0.968338,0}}" /> </Window> <Window Type="TaharezLook/StaticText" Name="DynamicFont/FontsLabel" > <Property Name="Font" Value="Commonwealth-10" /> <Property Name="Text" Value="Fonts:" /> <Property Name="HorzFormatting" Value="RightAligned" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.018409,0},{0.768338,0},{0.0859395,0},{0.855015,0}}" /> </Window> <Window Type="TaharezLook/Combobox" Name="DynamicFont/Fonts" > <Property Name="ReadOnly" Value="True" /> <Property Name="UnifiedMaxSize" Value="{{1,0},{1,0}}" /> <Property Name="UnifiedAreaRect" Value="{{0.085939,0},{0.768338,0},{0.974324,0},{0.994412,0}}" /> <Property Name="MaxEditTextLength" Value="1073741823" /> </Window> </Window> </GUILayout>