码迷,mamicode.com
首页 > 其他好文 > 详细

StrokesAndFills

时间:2014-12-18 16:49:46      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:style   blog   ar   io   color   os   sp   for   on   

  1 //StrokesAndFills.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 #include "vcf/ApplicationKit/ApplicationKit.h"
 11 #include "vcf/ApplicationKit/ControlsKit.h"
 12 
 13 
 14 
 15 using namespace VCF;
 16 
 17 
 18 /**
 19 This example will demonstrate the use of the
 20 Fill and Stroke classes and the new AGG anti-aliased
 21 vector library support.
 22 */
 23 
 24 class StrokesAndFillsWindow : public Window {
 25 public:
 26     StrokesAndFillsWindow() {
 27         setCaption( "StrokesAndFills" );
 28 
 29         /**
 30         Create a checkbox button, and add an event handler
 31         when the button is clicked
 32         */
 33         CheckBoxControl* antiAliasToggle = new CheckBoxControl();
 34         antiAliasToggle->setCaption( "Anti-aliased" );
 35         antiAliasToggle->setBounds( 20, 20, 100, antiAliasToggle->getPreferredHeight() );
 36         add( antiAliasToggle );
 37 
 38         antiAliasToggle->ButtonClicked += new ClassProcedure1<ButtonEvent*,StrokesAndFillsWindow>( this, &StrokesAndFillsWindow::onButtonClicked, "StrokesAndFillsWindow::onButtonClicked" );
 39     }
 40 
 41     virtual ~StrokesAndFillsWindow(){};
 42 
 43 
 44     /**
 45     This event handler will toggle whether or not hte render
 46     buffer is enabled. If the render buffer is enabled
 47     (isUsingRenderBuffer() returns true) then anti-aliased
 48     drawing is possible for the control, otherwise no
 49     anti-aliased drawing will take place.
 50     */
 51     void onButtonClicked( ButtonEvent* e ) {
 52         CheckBoxControl* antiAliasToggle = (CheckBoxControl*)e->getSource();
 53 
 54         antiAliasToggle->setChecked( !isUsingRenderBuffer() );
 55 
 56         /**
 57         calling this method sets the use of an render buffer
 58         to support the anti-aliasing features of AGG. Each control
 59         can control whether or not it support this, and by
 60         default controls start up *not* using the render
 61         buffer.
 62         */
 63         setUsingRenderBuffer( antiAliasToggle->isChecked() );
 64 
 65 
 66         if ( isUsingRenderBuffer() ) {
 67             //GraphicsContext* ctx = getContext();
 68             //ctx->setRenderArea( getClientBounds() );
 69         }
 70 
 71         repaint();
 72     }
 73 
 74 
 75     virtual void paint( GraphicsContext* ctx ) {
 76         Window::paint( ctx );
 77 
 78         /**
 79         This is a path that supports lines, and curves.
 80         You call the moveTo, lineTo, curveTo, etc methods
 81         to add points to the path.
 82         */
 83         BezierCurve shape;
 84 
 85         /**
 86         This is a stroke object. You can use it
 87         to draw the shape of your path. You
 88         set properties of the stroke object
 89         such as the width, color, etc.
 90         */
 91         BasicStroke stroke;
 92 
 93         /**
 94         This sets the current stroke to use. This
 95         pointer is *not* owned by the GraphicsContext
 96         so be sure to set it to NULL (or
 97         the previous value) when you‘re done
 98         */
 99         ctx->setCurrentStroke( &stroke );
100 
101         /**
102         Add a dash pattern to the stroke.
103         */
104         stroke.addDash( 10.0, 5.0 );
105         stroke.addDash( 3.0,  5.0 );
106 
107         /** 
108         Start dashing pattern at 15.0 (10.0 + 5.0), so the first part
109         of line displayed will correspond to the short dashed segment
110         specified above (3.0). 
111         */
112         stroke.dashStart( 15.0 );
113         
114         /**
115         Add two points to the path
116         */
117         shape.moveTo( 100, 100 );
118         shape.lineTo( 300, 300 );
119         shape.lineTo( 500, 300 );
120 
121         /**
122         Draw the path. The GraphicsContext will use
123         it‘s current Stroke and Fill pointers to stroke
124         and fill the path. Since we have not specified a
125         Fill to use, the path will only be stroked
126         */
127         ctx->draw( &shape );
128 
129         /**
130         Remove dash from stroke, so any use of stroke
131         below will NOT be dashed.
132         */
133         stroke.removeDashes();
134         
135         
136         /**
137         Adjust the GraphicsContext‘s matrix
138         to offset by 0 pixels to the left, and 50 pixel down
139         This will transform any paths that are drawn but will
140         *not* directly modify the path‘s points
141         */
142         ctx->setTranslation( 0, 50 );
143 
144         /**
145         set the stroke‘s color to green and the
146         width to 3
147         */
148         stroke.setColor( &Color(0.0,1.0,0.0) );
149         stroke.setWidth( 3.0 );
150 
151         ctx->draw( &shape );
152 
153         /*
154         reset the translation
155         */
156         ctx->setTranslation( 0, 0 );
157 
158         /**
159         create a curved shape .
160         the curve() method takes 4 points, a
161         starting point, the first control point, the second
162         control point, and the end point.
163         */
164         BezierCurve shape2;
165 
166         /**
167         This will overlap the previous shapes a bit
168         so we can see the effects of setting the
169         stroke‘s opacity
170         */
171         shape2.curve( 50, 300,
172                         100, 250,
173                         300, 250,
174                         375, 300 );
175 
176 
177         Color color(1.0,0.0,0.75);
178         color.setAlpha( 0.75 );
179         stroke.setColor( &color );
180         stroke.setWidth( 15.0 );
181         /**
182         Note we set the stroke to be 75% opaque
183         so we‘ll be able to partially see what ever is
184         "underneath" this shape. However this will
185         only take effect if the anti-aliasing support
186         is enabled by calling setUsingRenderBuffer() with
187         a true value passed in.
188         */
189 
190         ctx->draw( &shape2 );
191 
192 
193         BezierCurve rect;
194 
195         rect.rectangle( Rect(75,350,175,450) );
196 
197         ctx->draw( &rect );
198 
199         BasicFill fill;
200         color = *Color::getColor("yellow");
201         color.setAlpha( 0.65 );
202 
203         fill.setColor( &color );
204 
205         ctx->setCurrentFill( &fill );
206 
207         /**
208         We‘re going to directly modify the points of our
209         path by using a series to matrices to transform
210         the shape by first rotating 45 degrees and then
211         offsetting by 50 pixels
212         */
213         Matrix2D translate;
214         /**
215         tranlation matrix to move the rect shape back to
216         0,0 centered around it‘s center.
217         Our rect‘s left/top coordinate was at 75,350
218         and it‘s width/height was 100,100 so to center
219         it around the origin (0,0) we need to
220         translate it by -125,-400
221         */
222         translate.translate( -125, -400 );
223 
224         Matrix2D rotate;
225         rotate.rotate( 45 );
226 
227         Matrix2D mat;
228 
229         mat.multiply( translate );
230         mat.multiply( rotate );
231 
232         /**
233         apply the rotation/translation matrix to the shape
234         */
235         rect.applyTransform( mat );
236 
237         translate.translate( 125, 400 );
238 
239         /**
240         transalte the shape back to it‘s original position
241         only now‘s been rotated 45 degrees
242         */
243         rect.applyTransform( translate );
244 
245         translate.translate( 0, 50 );
246         //move it down 50 pixels
247         rect.applyTransform( translate );
248 
249         Color ltBlue(0.0,0.0,1.0);
250         //change the color by manipulating the HSV components
251         ltBlue.setHSV( 0.23, 0.0, 0.0 );
252         ltBlue.setAlpha( 0.45 );
253 
254         stroke.setColor( &ltBlue );
255         stroke.setWidth( 4.0 );
256 
257         ctx->draw( &rect );
258 
259 
260         ctx->setCurrentFill( NULL );
261         ctx->setCurrentStroke( NULL );
262     }
263 };
264 
265 
266 
267 
268 class StrokesAndFillsApplication : public Application {
269 public:
270 
271     StrokesAndFillsApplication(int argc, char** argv) : Application(argc,argv){
272 
273     }
274 
275     virtual bool initRunningApplication(){
276         bool result = Application::initRunningApplication();
277 
278         Window* mainWindow = new StrokesAndFillsWindow();
279         setMainWindow(mainWindow);
280         mainWindow->setBounds( 100.0, 100.0, 500.0, 500.0 );
281         mainWindow->show();
282 
283         return result;
284     }
285 
286 };
287 
288 
289 int main(int argc, char *argv[])
290 {
291     Application* app = new StrokesAndFillsApplication( argc, argv );
292 
293     Application::main();
294 
295     return 0;
296 }
297 
298 
299 /**
300 $Id: StrokesAndFills.cpp 3424 2008-04-02 18:23:15Z ddiego $
301 */

 

StrokesAndFills

标签:style   blog   ar   io   color   os   sp   for   on   

原文地址:http://www.cnblogs.com/elitiwin/p/4171807.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!