首页 > 代码库 > TextLayout
TextLayout
1 //TextLayout.cpp 2 3 /* 4 Copyright 2000-2004 The VCF Project. 5 Please see License.txt in the top level directory 6 where you installed the VCF. 7 */ 8 9 10 //Graphics4.cpp 11 12 13 #include "vcf/ApplicationKit/ApplicationKit.h" 14 15 16 using namespace VCF; 17 18 /** 19 Thie will show some of the various text 20 options that are possible when drawing text 21 */ 22 23 class TextLayoutWindow : public Window { 24 public: 25 TextLayoutWindow() { 26 setCaption( "TextLayout" ); 27 28 } 29 30 virtual ~TextLayoutWindow(){}; 31 32 virtual void paint( GraphicsContext* ctx ) { 33 Window::paint( ctx ); 34 35 /** 36 first we‘ll create 3 different fonts 37 One with Times New Roman, in 16 point bold 38 Another with Verdana, using the default font size, and bold 39 And finally the third in Courier at 16 points 40 */ 41 42 Font font1; 43 font1.setName( "Times New Roman" ); 44 font1.setPointSize( 16 ); 45 font1.setBold( true ); 46 47 Font font2; 48 font2.setName( "Verdana" ); 49 font2.setItalic( true ); 50 51 Font font3; 52 font3.setName( "Courier" ); 53 font3.setPointSize( 16 ); 54 55 56 57 /** 58 Initial x and y coordinates for the text 59 */ 60 double x = 20; 61 double y = 20; 62 63 /** 64 To change the GraphicsContext‘s font, make a call to 65 GraphicsContext::setCurrentFont, passing in a pointer to 66 the font. The passed in font will be copied over, so you 67 do not have to hold on it. 68 */ 69 ctx->setCurrentFont( &font1 ); 70 71 /** 72 Set the color of the context for line drawing 73 */ 74 ctx->setColor( Color::getColor( "black" ) ); 75 76 /** 77 draw a horizontal line, showing where the top of the text will be drawn 78 */ 79 ctx->moveTo( x, y ); 80 ctx->lineTo( x + 600, y ); 81 ctx->strokePath(); 82 83 84 /** 85 Now draw the text using the current font of the GraphicsContext 86 */ 87 ctx->textAt( x, y, "Text Example - " ); 88 89 /** 90 Determine the text width. The GraphicsContext uses it‘s 91 current font to determine this 92 */ 93 double width = ctx->getTextWidth( "Text Example - " ); 94 95 /** 96 Now change the GraphicsContext‘s current to our second font 97 */ 98 ctx->setCurrentFont( &font2 ); 99 100 /**101 and draw our next chunk of text102 */103 ctx->textAt( x + width, y, "all on a single line" );104 105 106 x = 20;107 y = 100;108 109 ctx->moveTo( x, y );110 ctx->lineTo( x + 600, y );111 ctx->strokePath();112 113 ctx->setCurrentFont( &font1 );114 115 /**116 The GraphicsContext::textWithStateAt draws text in either an enabled or disabled117 format, using the GraphicsContext‘s current font118 */119 ctx->textWithStateAt( x, y, "Text Example - ", false );120 121 width = ctx->getTextWidth( "Text Example - " );122 123 ctx->setCurrentFont( &font2 );124 125 ctx->textWithStateAt( x + width, y, "all on a single line", true );126 127 128 y += 100;129 130 ctx->setCurrentFont( &font3 );131 132 /**133 Now we‘ll prepare to draw text using134 a Rect to specify the bounds that the text will be135 drawn within136 */137 String text = "Text within bounds";138 Rect textBounds(x,y,x,y);139 140 /**141 This will mabe a rectangle that is the size of the text142 using the GraphicsContext‘s current font143 */144 textBounds.right_ += ctx->getTextWidth( text );145 textBounds.bottom_ += ctx->getTextHeight( text );146 147 /**148 Draw the rectangle that encloses the text149 */150 ctx->rectangle( textBounds );151 ctx->strokePath();152 153 /**154 Draw the text with x,y coordinates155 */156 ctx->textAt( x, y, text );157 158 y += 100;159 160 textBounds.offset( 0, 100 );161 textBounds.right_ -= 50;162 textBounds.bottom_ += 100;163 164 ctx->rectangle( textBounds );165 ctx->strokePath();166 167 text = "Text within bounds, left aligned and word wrapped";168 169 /**170 Now draw the text using the rect‘s bounds. By default it will be word wrapped171 */172 ctx->textBoundedBy( &textBounds, text );173 174 int32 drawingOptions = GraphicsContext::tdoCenterHorzAlign;175 176 ctx->setCurrentFont( &font2 );177 textBounds.offset( 350, -100 );178 textBounds.right_ += 100;179 textBounds.bottom_ -= 100;180 181 text = "Text within bounds, center aligned, single line";182 183 /**184 Now draw the text using the rect‘s bounds185 using the text drawing options specified in186 the drawingOptions variable187 */188 ctx->textBoundedBy( &textBounds, text, drawingOptions );189 ctx->rectangle( textBounds );190 ctx->strokePath();191 192 textBounds.offset( 0, 50 );193 textBounds.right_ -= 50;194 195 text = "Clipped text within bounds, center aligned, single line";196 197 /**198 Draw the text but now that teh bounds have been shrunk, you‘ll see that199 the text becomes clipped200 */201 ctx->textBoundedBy( &textBounds, text, drawingOptions );202 ctx->rectangle( textBounds );203 ctx->strokePath();204 205 206 textBounds.offset( 0, 50 );207 textBounds.right_ += 50;208 209 text = "Text within bounds, right aligned, single line";210 211 drawingOptions = GraphicsContext::tdoRightAlign;212 213 /**214 Draw the text with right alignment215 */216 ctx->textBoundedBy( &textBounds, text, drawingOptions );217 ctx->rectangle( textBounds );218 ctx->strokePath();219 220 221 textBounds.offset( 0, 50 );222 textBounds.right_ += 50;223 textBounds.bottom_ += 100;224 225 text = "Text within bounds, left aligned, single line, centered vertically";226 227 drawingOptions = GraphicsContext::tdoCenterVertAlign;228 229 /**230 Draw the text and center it vertically231 */232 ctx->textBoundedBy( &textBounds, text, drawingOptions );233 ctx->rectangle( textBounds );234 ctx->strokePath();235 236 237 x = textBounds.left_;238 y = textBounds.bottom_ + 50;239 240 241 textBounds.left_ = x;242 textBounds.top_ = y;243 244 245 ctx->moveTo( x, y );246 ctx->lineTo( x + 600, y );247 ctx->strokePath();248 249 250 drawingOptions = GraphicsContext::tdoBottomAlign;251 252 ctx->setCurrentFont( &font1 );253 textBounds.right_ = textBounds.left_ + ctx->getTextWidth( "Text Example - " );254 textBounds.bottom_ = textBounds.top_ + ctx->getTextHeight( "EM" );255 256 257 /**258 Draw the text and align it to the bottom of the bounds259 */260 ctx->textBoundedBy( &textBounds, "Text Example - ", drawingOptions );261 262 263 ctx->setCurrentFont( &font2 );264 265 textBounds.left_ = textBounds.right_;266 textBounds.right_ = textBounds.left_ + ctx->getTextWidth( "all on a single line - bottom alignment" );267 268 269 ctx->textBoundedBy( &textBounds, "all on a single line - bottom alignment", drawingOptions );270 271 272 273 /**274 What follows shows you how to draw text that is aligned along a275 baseline276 */277 278 x = 20;279 y = textBounds.top_ + 100;280 281 ctx->textAt( x, y -20, "The text below is aligned to the baseline, allowing for multiple fonts" );282 283 font1.setPointSize( 32 );284 285 ctx->setCurrentFont( &font1 );286 287 288 289 /**290 Generate the baseline. The baseline is determined by using the291 largest ascent in the series of font‘s you intend to use. In292 our case that‘s font1293 */294 double baselineY = y + font1.getAscent() ;295 296 /**297 draw the baseline298 */299 ctx->moveTo( x, baselineY );300 ctx->lineTo( x + 1000, baselineY );301 ctx->strokePath();302 303 304 /**305 draw the first part of the text306 */307 ctx->textAt( x, y, "Text Example - " );308 309 /**310 nudge our x coordinate over by the width of the text we just drew311 */312 x += ctx->getTextWidth( "Text Example - " );313 314 /**315 reset the y coordinate. It‘s new value is the baseline316 minus the ascent of the next font we are going to use317 */318 y = baselineY - (font2.getAscent());319 320 /**321 set the next font322 */323 ctx->setCurrentFont( &font2 );324 325 /**326 draw the text327 */328 ctx->textAt( x, y, "all on a single line" );329 330 /**331 repeat ad infinitum...332 */333 x += ctx->getTextWidth( "all on a single line" );334 335 ctx->setCurrentFont( &font3 );336 337 y = baselineY - (font3.getAscent());338 339 ctx->textAt( x, y, ", with even more Text!" );340 341 x += ctx->getTextWidth( ", with even more Text!" );342 343 font1.setColor( Color::getColor("red") );344 font1.setItalic( true );345 346 font1.setPointSize( 16 );347 348 ctx->setCurrentFont( &font1 );349 y = baselineY - (font1.getAscent());350 351 352 ctx->textAt( x, y, " And now in Technicolor :)" );353 354 }355 356 };357 358 359 360 361 class TextLayoutApp : public Application {362 public:363 364 TextLayoutApp(int argc, char** argv) : Application(argc,argv){365 366 }367 virtual bool initRunningApplication(){368 bool result = Application::initRunningApplication();369 370 Window* mainWindow = new TextLayoutWindow();371 setMainWindow(mainWindow);372 mainWindow->setBounds( 0.0, 10.0, 925.0, 700.0 );373 mainWindow->show();374 375 return result;376 }377 378 };379 380 381 int main(int argc, char *argv[])382 {383 Application* app = new TextLayoutApp( argc, argv );384 385 Application::main();386 387 return 0;388 }389 390 391 /**392 $Id: TextLayout.cpp 3124 2007-06-17 00:26:39Z obirsoy $393 */
TextLayout
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。