Difference between revisions of "Dynamic Fonts"
From CEGUI Wiki - Crazy Eddie's GUI System (Open Source)
m (Robot: Adding Category:Uncategorised) |
|||
Line 1: | Line 1: | ||
+ | {{VersionBadge|0.5}} {{VersionBadge|0.6}} | ||
+ | |||
===Introduction=== | ===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: | 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: | ||
− | < | + | <source lang="cpp"> |
CEGUI::FontManager::getSingleton().createFont("Commonwealth-10.font"); | CEGUI::FontManager::getSingleton().createFont("Commonwealth-10.font"); | ||
− | </ | + | </source> |
− | This works well, but sometimes you need to display a same font in various sizes. | + | 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 [http://www.cegui.org.uk/phpBB2/viewtopic.php?p=13350 DynamicFont] | Please post comments or questions on the message board thread for the [http://www.cegui.org.uk/phpBB2/viewtopic.php?p=13350 DynamicFont] | ||
Line 12: | Line 14: | ||
====DynamicFont.h==== | ====DynamicFont.h==== | ||
− | < | + | <source lang="cpp"> |
#ifndef _DynamicFont_h_ | #ifndef _DynamicFont_h_ | ||
#define _DynamicFont_h_ | #define _DynamicFont_h_ | ||
Line 166: | Line 168: | ||
#endif // _DynamicFont_h_ | #endif // _DynamicFont_h_ | ||
− | </ | + | </source> |
====main.cpp==== | ====main.cpp==== | ||
− | < | + | <source lang="cpp"> |
#if defined( __WIN32__ ) || defined( _WIN32 ) | #if defined( __WIN32__ ) || defined( _WIN32 ) | ||
#define WIN32_LEAN_AND_MEAN | #define WIN32_LEAN_AND_MEAN | ||
Line 186: | Line 188: | ||
DemoSample app; | DemoSample app; | ||
return app.run(); | return app.run(); | ||
− | }</ | + | } |
+ | </source> | ||
====DynamicFont.layout==== | ====DynamicFont.layout==== | ||
− | < | + | <source lang="xml"> |
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||
Line 202: | Line 205: | ||
<Window Type="TaharezLook/MultiLineEditbox" Name="DynamicFont/Text" > | <Window Type="TaharezLook/MultiLineEditbox" Name="DynamicFont/Text" > | ||
<Property Name="Text" > | <Property Name="Text" > | ||
− | </Property> | + | </Property> |
<Property Name="ReadOnly" Value="True" /> | <Property Name="ReadOnly" Value="True" /> | ||
<Property Name="MaxTextLength" Value="1073741823" /> | <Property Name="MaxTextLength" Value="1073741823" /> | ||
Line 265: | Line 268: | ||
</Window> | </Window> | ||
</GUILayout> | </GUILayout> | ||
− | </ | + | </source> |
− | [[Category: | + | [[Category:HowTo]] |
Revision as of 17:31, 4 March 2011
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>