首页 > 代码库 > Transformations

Transformations

  1 //Transformations.cpp  2   3   4 #include "vcf/ApplicationKit/ApplicationKit.h"  5 #include "vcf/ApplicationKit/ControlsKit.h"  6 #include "vcf/ApplicationKit/HorizontalLayoutContainer.h"  7   8   9  10  11  12 /** 13 This is a simple application that demonstrates how to modify the  14 transformation matrix of a GraphicsContext.   15 */ 16  17 using namespace VCF; 18  19 /** 20 A simple panel that holds a series of slider control‘s that enable the  21 user to manipulate the values of the translate, scale, shear, and rotation 22 values for a transformation matrix. 23 */ 24 class TransFormController : public Panel { 25 public: 26  27     enum { 28         transXTag = 0, 29         transYTag, 30         shearXTag, 31         shearYTag, 32         rotateTag, 33         scaleXTag, 34         scaleYTag 35     };  36  37     TransFormController() :xfrmView_(NULL),useConcatFunctions_(false){ 38         HorizontalLayoutContainer* container = new HorizontalLayoutContainer(); 39         setContainer( container );         40          41         translateX = new Label(); 42         translateX->setCaption( "Translate X:" ); 43         add( translateX ); 44  45         SliderControl* slider = new SliderControl(); 46         slider->setName( "translateX" ); 47         add( slider ); 48         slider->setTag( transXTag ); 49         slider->PositionChanged +=  50             new ClassProcedure1<Event*,TransFormController>( this, &TransFormController::onSliderValChanged, "TransFormController::onSliderValChanged" ); 51  52         slider->setMaxValue( 400 ); 53         slider->setMinValue( -400 ); 54         slider->setTickFrequency( 80 ); 55  56  57  58         translateY = new Label(); 59         translateY->setCaption( "Translate Y:" ); 60         add( translateY ); 61  62         slider = new SliderControl(); 63         slider->setName( "translateY" ); 64         add( slider ); 65         slider->setTag( transYTag ); 66         slider->PositionChanged += getCallback( "TransFormController::onSliderValChanged" ); 67         slider->setMaxValue( 400 ); 68         slider->setMinValue( -400 ); 69         slider->setTickFrequency( 80 ); 70  71         shearX = new Label(); 72         shearX->setCaption( "Shear X:" ); 73         add( shearX ); 74  75         slider = new SliderControl(); 76         slider->setName( "shearX" ); 77         add( slider ); 78         slider->setTag( shearXTag ); 79         slider->PositionChanged += getCallback( "TransFormController::onSliderValChanged" ); 80         slider->setMinValue( -360 ); 81         slider->setMaxValue( 360 ); 82         slider->setHasTickMarks( false ); 83         slider->setTickFrequency( 72 ); 84  85  86         shearY = new Label(); 87         shearY->setCaption( "Shear Y:" ); 88         add( shearY ); 89  90         slider = new SliderControl(); 91         slider->setName( "shearY" ); 92         add( slider ); 93         slider->setTag( shearYTag ); 94         slider->PositionChanged += getCallback( "TransFormController::onSliderValChanged" ); 95         slider->setMinValue( -360 ); 96         slider->setMaxValue( 360 ); 97         slider->setHasTickMarks( false ); 98         slider->setTickFrequency( 72 ); 99 100 101         scaleX = new Label();102         scaleX->setCaption( "Scale X:" );103         add( scaleX );104 105         slider = new SliderControl();106         slider->setName( "scaleX" );107         slider->setPosition( 100 );108         add( slider );109         slider->setTag( scaleXTag );110         slider->PositionChanged += getCallback( "TransFormController::onSliderValChanged" );111 112         scaleY = new Label();113         scaleY->setCaption( "Scale Y:" );114         add( scaleY );115 116         slider = new SliderControl();117         slider->setName( "scaleY" );118         slider->setPosition( 100 );119         add( slider );120         slider->setTag( scaleYTag );121         slider->PositionChanged += getCallback( "TransFormController::onSliderValChanged" );122 123         rotate = new Label();124         rotate->setCaption( "Rotate:" );125         add( rotate );126 127         slider = new SliderControl();128         slider->setName( "rotate" );129         add( slider );130         slider->setTag( rotateTag );131         slider->PositionChanged += getCallback( "TransFormController::onSliderValChanged" );132         slider->setMaxValue( 360 );133         slider->setHasTickMarks( false );134         slider->setTickFrequency( 36 );135 136 137         CommandButton* reset = new CommandButton();138         reset->setCaption( "Reset" );139         reset->addButtonClickHandler( new ClassProcedure1<Event*,TransFormController>( this, &TransFormController::onReset, "TransFormController::onReset" ) );140         add( reset );141 142         CheckBoxControl* checkBox = new CheckBoxControl();143         checkBox->setCaption( "Use GraphicsContext::concatXXX functions" );144         checkBox->addButtonClickHandler( new ClassProcedure1<Event*,TransFormController>( this, &TransFormController::onUseConcatFunctions, "TransFormController::onUseConcatFunctions" ) );145         add( checkBox );146     }147 148     virtual double getPreferredHeight() {149 150         HorizontalLayoutContainer* container = (HorizontalLayoutContainer*)getContainer();151         return container->getMinimumVisibleHeight();152     }153 154     void onReset( Event* e ) {155         SliderControl* slider = (SliderControl*) findComponent( "translateX" );156         slider->setPosition( 0.0 );157 158         slider = (SliderControl*) findComponent( "translateY" );159         slider->setPosition( 0.0 );160 161         slider = (SliderControl*) findComponent( "scaleX" );162         slider->setPosition( 100.0 );163 164         slider = (SliderControl*) findComponent( "scaleY" );165         slider->setPosition( 100.0 );166 167         slider = (SliderControl*) findComponent( "shearX" );168         slider->setPosition( 0.0 );169 170         slider = (SliderControl*) findComponent( "shearY" );171         slider->setPosition( 0.0 );172 173         slider = (SliderControl*) findComponent( "rotate" );174         slider->setPosition( 0.0 );175     }176 177     void onUseConcatFunctions( Event* e ) {178         useConcatFunctions_ = !useConcatFunctions_;179         if ( NULL != xfrmView_ ) {180             xfrmView_->repaint();181         }182     }183 184     void onSliderValChanged( Event* e ) {185         SliderControl* slider = (SliderControl*)e->getSource();186         switch( slider->getTag() ) {187             case transXTag : {188                 translateX->setCaption( "Translate X: " + StringUtils::toString( slider->getPosition() ) );189             }190             break;191 192             case transYTag : {193                 translateY->setCaption( "Translate Y: " + StringUtils::toString( slider->getPosition() ) );194             }195             break;196 197             case shearXTag : {198                 shearX->setCaption( "Shear X: " + StringUtils::toString( slider->getPosition() ) );199             }200             break;201 202             case shearYTag : {203                 shearY->setCaption( "Shear Y: " + StringUtils::toString( slider->getPosition() ) );204             }205             break;206 207             case scaleXTag : {208                 scaleX->setCaption( "Scale X: " + StringUtils::toString( slider->getPosition() ) );209             }210             break;211 212             case scaleYTag : {213                 scaleY->setCaption( "Scale Y: " + StringUtils::toString( slider->getPosition() ) );214             }215             break;216 217             case rotateTag : {218                 rotate->setCaption( "Rotate: " + StringUtils::toString( slider->getPosition() ) );219             }220             break;221         }222 223         if ( NULL != xfrmView_ ) {224             xfrmView_->repaint();225         }226     }227 228     Label* translateX;229     Label* translateY;230     Label* shearX;231     Label* shearY;232     Label* scaleX;233     Label* scaleY;234     Label* rotate;235 236     Control* xfrmView_;237 238     bool useConcatFunctions_;239 240     double getTransX() {241         242         SliderControl* slider = (SliderControl*) findComponent( "translateX" );243         return slider->getPosition();244     }245 246     double getTransY() {247         248         SliderControl* slider = (SliderControl*) findComponent( "translateY" );249         return slider->getPosition();250     }251 252     double getShearX() {253         254         SliderControl* slider = (SliderControl*) findComponent( "shearX" );255         return slider->getPosition();256     }257 258     double getShearY() {259         260         SliderControl* slider = (SliderControl*) findComponent( "shearY" );261         return slider->getPosition();262     }263 264     double getScaleX() {265         266         SliderControl* slider = (SliderControl*) findComponent( "scaleX" );267         return slider->getPosition() / 100.0;268     }269 270     double getScaleY() {271         272         SliderControl* slider = (SliderControl*) findComponent( "scaleY" );273         return slider->getPosition() / 100.0;274     }275 276     double getRotate() {277         278         SliderControl* slider = (SliderControl*) findComponent( "rotate" );279         return slider->getPosition();280     }281 282 };283 284 285 286 bool operator<( const Rect& lhs, const Rect& rhs ) 287 {288     289     return (lhs.getWidth() * lhs.getHeight()) < (rhs.getWidth() * rhs.getHeight());290 }291 292 293 /**294 A simple custom control that demonstrates drawing with the a matrix and how to 295 modify the matrix a whole unit.296 */297 class TransformView : public CustomControl {298 public:299     TransformView() {300 301     }302 303     virtual void paint( GraphicsContext* context ) {304         CustomControl::paint( context );305 306         Rect r = getClientBounds();307         r.inflate( -10, -10 );308 309         context->setColor( Color::getColor("white") );310         context->rectangle( &r );311         context->fillPath();312 313         if ( !(context->getViewableBounds() < r) ) {314             context->setClippingRect( &r );315         }316 317         int gcs = context->saveState();318 319         if ( controller_->useConcatFunctions_ ) {320             context->concatRotation( controller_->getRotate() );321             context->concatScale( controller_->getScaleX(), controller_->getScaleY() );322             context->concatShear( controller_->getShearX(), controller_->getShearY() );323             context->concatTranslation( controller_->getTransX(), controller_->getTransY() );324         }325         else {326             context->setRotation( controller_->getRotate() );327             context->setScale( controller_->getScaleX(), controller_->getScaleY() );328             context->setShear( controller_->getShearX(), controller_->getShearY() );329             context->setTranslation( controller_->getTransX(), controller_->getTransY() );330         }331 332         context->setStrokeWidth( 1 );333 334         context->setColor( Color::getColor("black") );335 336 337         Rect rect(30,40,100,230);338         context->rectangle( rect );339 340         context->circle( 500, 200, 50 );341 342         context->strokePath();343         344         345 346         context->ellipse( 200, 300, 300, 450 );347         context->setColor( Color::getColor("green") );348         context->fillPath();349 350 351         context->setStrokeWidth( 2.5 );352         context->setColor( Color::getColor("red") );353         context->strokePath();354 355 356         context->setStrokeWidth( 4 );357         context->setColor( Color::getColor("purple") );358         context->roundRect( 350, 400, 500, 500, 20, 20 );359         context->strokePath();360 361         context->getCurrentFont()->setName( "Arial" );362         context->getCurrentFont()->setPointSize( 15 );363 364         context->textAt( 200, 200, "Hello There!!" );365 366 367         //note - you may have to adjust the path to this accordingly368         //feel free to try different images as well369         Image* img = GraphicsToolkit::createImage( "test.bmp" );370         if ( NULL != img ) {371 372             context->drawImage( 500, 270, img, false );373 374             context->drawImage( 200, 10, img, false );375 376             context->renderImages();377 378             //delete img;379         }380 381         context->setStrokeWidth( 2 );382         context->setColor( Color::getColor("yellow") );383         context->rectangle( Rect(499,269,901,351) );384         context->strokePath();385 386         context->restoreState( gcs );387 388     }389 390     TransFormController* controller_;391 };392 393 394 395 class TransformationsWindow : public Window {396 public:397     TransformationsWindow() {398         setCaption( "Transformations" );399 400         TransformView* xfrmView = new TransformView() ;401 402         add( xfrmView, AlignClient ) ;403 404         TransFormController* controller = new TransFormController();405         controller->setHeight( controller->getPreferredHeight() );406 407         add( controller, AlignTop );408 409         xfrmView->controller_ = controller;410         controller->xfrmView_ = xfrmView;411     }412 413     virtual ~TransformationsWindow(){};414 415 416     417 };418 419 420 421 422 class TransformationsApplication : public Application {423 public:424 425     TransformationsApplication( int argc, char** argv ) : Application(argc, argv) {426 427     }428 429     virtual bool initRunningApplication(){430         bool result = Application::initRunningApplication();431         432         Window* mainWindow = new TransformationsWindow();433         setMainWindow(mainWindow);434         mainWindow->setBounds( 100.0, 100.0, 550.0, 700.0 );435         mainWindow->show();436         437         return result;438     }439 440 };441 442 443 int main(int argc, char *argv[])444 {445     Application* app = new TransformationsApplication( argc, argv );446 447     Application::main();448     449     return 0;450 }

 

Transformations