examples/Graphics/GraphicsShell/Draw.cpp

00001 // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
00002 // All rights reserved.
00003 // License: "Symbian Foundation License v1.0" to Symbian Foundation
00004 // members and "Symbian Foundation End User License Agreement v1.0"
00005 // to non-members at the URL
00006 // "http://www.symbianfoundation.org/legal/licencesv10.html".
00007 //
00008 // Initial Contributors:
00009 // Nokia Corporation - initial contribution.
00010 //
00011 // Contributors:
00012 //
00013 // Description:
00014 //
00015 
00016 #include "GraphicsControl.h"
00017 
00018 #include <coemain.h>
00019 
00020 // Text printed to the console in UpdateModeL()
00021 _LIT(KTxtUpdateModelCase0,"point in center of screen");
00022 _LIT(KTxtUpdateModelCase1,"bolder point in center of screen");
00023 _LIT(KTxtUpdateModelCase2,"really bold point in center of screen");
00024 _LIT(KTxtUpdateModelCase3,"a line");
00025 _LIT(KTxtUpdateModelCase4,"a thicker line");
00026 _LIT(KTxtUpdateModelCase5,"really thick - note round ends and clipping");
00027 _LIT(KTxtUpdateModelCase6,"dotted line");
00028 _LIT(KTxtUpdateModelCase7,"dot-dash line");
00029 _LIT(KTxtUpdateModelCase8,"triangle using relative drawing");
00030 _LIT(KTxtUpdateModelCase9,"thick triangle - note rounded corners");
00031 _LIT(KTxtUpdateModelCase10,"dotted triangle - note pattern continuation");
00032 _LIT(KTxtUpdateModelCase11,"centered ellipse");
00033 _LIT(KTxtUpdateModelCase12,"arc - part of ellipse");
00034 _LIT(KTxtUpdateModelCase13,"arc - other part - see also construction elements");
00035 _LIT(KTxtUpdateModelCase14,"pie slices");
00036 _LIT(KTxtUpdateModelCase15,"centered rectangle with rounded corners");
00037 _LIT(KTxtUpdateModelCase16,"rounded rectangle showing corner ellipse");
00038 _LIT(KTxtUpdateModelCase17,"polyline");
00039 _LIT(KTxtUpdateModelCase18,"polygon with winding-fill rule");
00040 _LIT(KTxtUpdateModelCase19,"polygon using alternate-fill rule");
00041 _LIT(KTxtUpdateModelCase20,"copying using CopyRect()");
00042 _LIT(KTxtUpdateModelCase21,"left-justified boxed text");
00043 _LIT(KTxtUpdateModelCase22,"centered boxed text");
00044 _LIT(KTxtUpdateModelCase23,"right-justified offset text");
00045 _LIT(KTxtUpdateModelCase24,"cross-hatched box");
00046 _LIT(KTxtUpdateModelCase25,"teeny preview font!");
00047 _LIT(KTxtUpdateModelDefault,"overran!");
00048 
00049 static CArrayFix<TPoint>* CreatePointsArrayL();
00050 
00051 void CDrawControl::UpdateModelL()
00052         {
00053         switch (Phase())
00054                 {
00055                 case 0:
00056                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase0);
00057                         break;
00058                 case 1:
00059                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase1);
00060                         break;
00061                 case 2:
00062                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase2);
00063                         break;
00064                 case 3:
00065                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase3);
00066                         break;
00067                 case 4:
00068                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase4);
00069                         break;
00070                 case 5:
00071                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase5);
00072                         break;
00073                 case 6:
00074                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase6);
00075                         break;
00076                 case 7:
00077                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase7);
00078                         break;
00079                 case 8:
00080                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase8);
00081                         break;
00082                 case 9:
00083                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase9);
00084                         break;
00085                 case 10:
00086                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase10);
00087                         break;
00088                 case 11:
00089                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase11);
00090                         break;
00091                 case 12:
00092                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase12);
00093                         break;
00094                 case 13:
00095                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase13);
00096                         break;
00097                 case 14:
00098                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase14);
00099                         break;
00100                 case 15:
00101                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase15);
00102                         break;
00103                 case 16:
00104                         {
00105                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase16);
00106                         }
00107                         break;
00108                 case 17:
00109                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase17);
00110                         break;
00111                 case 18:
00112                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase18);
00113                         break;
00114                 case 19:
00115                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase19);
00116                         break;
00117                 case 20:
00118                         {
00119                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase20);
00120                         }
00121                         break;
00122                 case 21:
00123                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase21);
00124                         break;
00125                 case 22:
00126                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase22);
00127                         break;
00128                 case 23:
00129                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase23);
00130                         break;
00131                 case 24:
00132                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase24);
00133                         break;
00134                 case 25:
00135                         iGraphObserver->NotifyStatus(KTxtUpdateModelCase25);
00136                         break;
00137                 default:
00138                         iGraphObserver->NotifyStatus(KTxtUpdateModelDefault);
00139                         break;
00140                 }
00141         }
00142 
00143 
00144 // Text printed to the console in UpdateModeL()
00145 _LIT(KTxtDrawCase21,"White text left justified in dark gray box");
00146 _LIT(KTxtDrawCase22,"White text centered in black box");
00147 _LIT(KTxtDrawCase23,"Dark gray text right justified in lite gray box");
00148 _LIT(KTxtDrawCase25,"This text overwrites the cleared area");
00149 
00150         
00151 void CDrawControl::Draw(const TRect& /* aRect */) const
00152         {
00153         // put the next line back in to see the individual drawing actions
00154         // (iCoeEnv->WsSession()).SetAutoFlush(ETrue);
00155         // draw surrounding rectangle
00156         CWindowGc& gc=SystemGc(); // graphics context we draw to
00157         gc.UseFont(iMessageFont); // use the system message font
00158         gc.Clear();
00159         SystemGc().DrawRect(Rect()); // surrounding rectangle to draw into
00160         TRect rect=Rect(); // a centered rectangle of the default size
00161         TRect ellipseRect=Rect(); // for arcs and ellipse
00162         ellipseRect.Shrink(10,10); // set size so inside the border rectangle
00163         TRect box=Rect(); // a smaller centered rectangle, for text in a box
00164         box.Shrink(10,10); // set size of text box
00165         TRect tinyBox=Rect(); // a tiny box to clear
00166         tinyBox.Shrink(220,90); // set size of tiny box to clear
00167         TInt offset=0; // offset, for text in a box
00168         TPoint screenCenterPoint=rect.Center(); // the center of the screen 
00169         // set up a pair of construction points for arc and pie slice drawing
00170         // set up the size for half a screen (divided vertically)
00171         TPoint constructionPoint1(15,15); // outside the construction ellipse
00172         TPoint constructionPoint2(200,150); // inside the construction ellipse
00173         // set up a pair of points for drawing diagonal lines
00174         TPoint startPoint(50,50);
00175         TPoint endPoint(590,190);
00176         // set up an array of points for drawing a polyline and a polygon etc
00177         // will be used relative to top left of rectangle
00178         CArrayFix<TPoint>* mypoints=NULL;
00179         TRAPD(err,mypoints = CreatePointsArrayL());
00180         if(err)
00181                 {
00182                 return;
00183                 }
00184         // set up a black, a dark gray, a lite gray and a white RGB color
00185         TRgb black(0,0,0);
00186         TRgb darkGray(85,85,85);
00187         TRgb liteGray(170,170,170);
00188         TRgb white(255,255,255); // appears as blank screen gray-green color
00189         // Set up a "bold" size for the pen tip to (default is 1,1)
00190         TSize penSizeBold(3,3);
00191         // Set up a "fat" size for the pen tip
00192         TSize penSizeFat(30,30);
00193         // decide what to do, and do it
00194         switch (Phase())
00195                 {
00196                 case 0:
00197                         // draw a single pixel point in the center of the screen
00198                         // it is so small that some text is needed to explain the screen...
00199                         gc.Plot(screenCenterPoint);
00200                         break;
00201                 case 1:
00202                         // draw a "bold" point 3 pixels across
00203                         gc.SetPenSize(penSizeBold);
00204                         gc.Plot(screenCenterPoint);
00205                         break;
00206                 case 2:
00207                         // draw a "fat" point (circular blob),
00208                         // illustrating the effect of a very wide pen
00209                         gc.SetPenSize(penSizeFat);
00210                         gc.Plot(screenCenterPoint);
00211                         break;
00212                 case 3:
00213                         // draw a thin line fromtop left to bottom right
00214                         gc.DrawLine(startPoint,endPoint);
00215                         break;
00216                 case 4:
00217                         // draw a "bold" line fromtop left to bottom right
00218                         gc.SetPenSize(penSizeBold);
00219                         gc.DrawLine(startPoint,endPoint);
00220                         break;
00221                 case 5:
00222                         // draw a rather wide line from top left to bottom right,
00223                         // illustrating rounded ends and their clipping
00224                         gc.SetPenSize(penSizeFat);
00225                         gc.DrawLine(startPoint,endPoint);
00226                         break;
00227                 case 6:
00228                         // draw a dotted line from top left to bottom right
00229                         gc.SetPenStyle(CGraphicsContext::EDottedPen);
00230                         gc.DrawLine(startPoint,endPoint);
00231                         break;
00232                 case 7:
00233                         // draw a dot-dash line from top left to bottom right
00234                         gc.SetPenStyle(CGraphicsContext::EDotDashPen);
00235                         gc.DrawLine(startPoint,endPoint);
00236                         break;
00237                 case 8:
00238                         // draw a triangle by relative drawing
00239                         gc.MoveTo(TPoint(300,50)); // drawing position (300,50)
00240                         gc.DrawLineBy(TPoint(205,100)); // drawing position (505,150)
00241                         gc.DrawLineBy(TPoint(-410,0)); // drawing position (95,150)
00242                         gc.DrawLineBy(TPoint(205,-100)); // drawing position (300,50)
00243                         break;
00244                 case 9:
00245                         // draw a triangle, by relative drawing
00246                         // illustrating rounded ends at corners when using very wide lines
00247                         gc.SetPenSize(penSizeFat);
00248                         gc.MoveTo(TPoint(300,50)); // drawing position (300,50)
00249                         gc.DrawLineBy(TPoint(205,100)); // drawing position (505,150)
00250                         gc.DrawLineBy(TPoint(-410,0)); // drawing position (95,150)
00251                         gc.DrawLineBy(TPoint(205,-100)); // drawing position (300,50)
00252                         break;
00253                 case 10:
00254                         // draw a triangle by sequential drawing between specified points,
00255                         // using dot-dash line style, illustrating line pattern continuation 
00256                         gc.SetPenStyle(CGraphicsContext::EDotDashPen);
00257                         gc.MoveTo(TPoint(300,50)); // drawing position (300,50)
00258                         gc.DrawLineTo(TPoint(505,150)); // drawing position (505,150)
00259                         gc.DrawLineTo(TPoint(95,150)); // drawing position (95,150)
00260                         gc.DrawLineTo(TPoint(300,50)); // drawing position (300,50)
00261                         break;
00262                 case 11:
00263                         // draw an ellipse centered in the rectangle
00264                         gc.DrawEllipse(ellipseRect);
00265                         break;
00266                 case 12:
00267                         // draw an arc centered in the rectangle
00268                         gc.DrawArc(ellipseRect,constructionPoint1,constructionPoint2);
00269                         // gc.Clear();
00270                         break;
00271                 case 13:
00272                         // draw an arc centered in the rectangle that is the other
00273                         // portion of the ellipse (arguments reversed)
00274                         gc.DrawArc(ellipseRect,constructionPoint2,constructionPoint1);
00275                         // draw construction lines and points
00276                         gc.SetPenStyle(CGraphicsContext::EDottedPen);
00277                         gc.MoveTo(constructionPoint1);
00278                         gc.DrawLineTo(screenCenterPoint);
00279                         gc.DrawLineTo(constructionPoint2);
00280                         gc.SetPenSize(penSizeBold);
00281                         gc.Plot(constructionPoint1);
00282                         gc.Plot(constructionPoint2);
00283                         gc.Plot(screenCenterPoint);
00284                         break;
00285                 case 14:
00286                         // draw a pie slice centered in the rectangle
00287                         gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
00288                         gc.SetBrushColor(white);
00289                         gc.DrawPie(ellipseRect,constructionPoint1,constructionPoint2);
00290                         // draw the other portion of the elliptical disc
00291                         gc.SetBrushStyle(CGraphicsContext::EVerticalHatchBrush);
00292                         gc.DrawPie(ellipseRect,constructionPoint2,constructionPoint1);
00293                         break;
00294                 case 15:
00295                         {
00296                         // draw a rectangle with rounded corners, centered in the rectangle
00297                         TSize cornerSize(20,20); // size of a rounded corner
00298                         gc.DrawRoundRect(box,cornerSize); // same rect as text box
00299                         }
00300                         break;
00301                 case 16:
00302                         {
00303                         // draw a rectangle with rounded corners,
00304                         //centered in the rectangle, showing a corner ellipse
00305                         TSize cornerSize(20,20); // size of a rounded corner
00306                         // rect for corner ellipse is twice the corner size
00307                         TSize cornerEllipseSize(cornerSize.iHeight*2,cornerSize.iWidth*2);
00308                         TRect cornerRectTl(box.iTl,cornerEllipseSize);
00309                         gc.DrawRoundRect(box,cornerSize);
00310                         gc.SetPenStyle(CGraphicsContext::EDottedPen);
00311                         gc.DrawEllipse(cornerRectTl); // corner construction ellipse
00312                         }
00313                         break;
00314                 case 17:
00315                         // draw a polyline
00316                         gc.DrawPolyLine(mypoints);
00317                         break;
00318                 case 18:
00319                         // draw self-crossing polygon using the winding fill rule
00320                         gc.SetBrushStyle(CGraphicsContext::ESquareCrossHatchBrush);
00321                         gc.SetBrushColor(black);
00322                         gc.DrawPolygon(mypoints,CGraphicsContext::EWinding);
00323                         break;
00324                 case 19:
00325                         // draw self-crossing polygon using the alternate fill rule
00326                         gc.SetBrushStyle(CGraphicsContext::EDiamondCrossHatchBrush);
00327                         gc.SetBrushColor(black);
00328                         gc.DrawPolygon(mypoints,CGraphicsContext::EAlternate);
00329                         break;
00330                 case 20:
00331                         {
00332                         // draw self-crossing polygon using the alternate fill rule,
00333                         // and copy the lhs to the rhs of the screen
00334                         gc.SetBrushStyle(CGraphicsContext::EDiamondCrossHatchBrush);
00335                         gc.SetBrushColor(black);
00336                         gc.DrawPolygon(mypoints,CGraphicsContext::EAlternate);
00337                         TPoint screenOrigin(0,0); // top left of the screen
00338                         TSize halfScreenLR(320,240); // size of vertical half of screen
00339                         rect.SetRect(screenOrigin,halfScreenLR); // lhs of screen
00340                         TPoint offset(halfScreenLR.iWidth,0); // half screen width offset
00341                         gc.CopyRect(offset,rect); //  copy lhs of screen to rhs
00342                         }
00343                         break;
00344                 case 21:
00345                         // draw some text left justified in a box,
00346                         // offset so text is just inside top of box
00347                         {
00348                         CFont* font=iMessageFont; // get the system message font
00349                         TInt fontAscent(font->AscentInPixels()); // system message font ascent
00350                         offset=fontAscent+3; // add a 3 pixel text line spacing
00351                         TInt margin=2; // left margin is two pixels
00352                         gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
00353                         gc.SetBrushColor(darkGray);
00354                         gc.SetPenColor(white);
00355                         gc.UseFont(iMessageFont);
00356                         gc.DrawText(KTxtDrawCase21,box,offset,CGraphicsContext::ELeft,margin);
00357                         }
00358                         break;
00359                 case 22:
00360                         // draw some text centered in a box, (margin is zero)
00361                         {
00362                         TInt boxHeight=box.Height(); // get height of text box
00363                         CFont* font=iMessageFont; // get the system message font
00364                         TInt textHeight(font->HeightInPixels()); // system message font height
00365                         offset=(textHeight+boxHeight)/2; // 1/2 font ht below halfway down box
00366                         TInt margin=0; // margin is zero
00367                         gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
00368                         gc.SetBrushColor(black);
00369                         gc.SetPenColor(white);
00370                         gc.UseFont(iMessageFont);
00371                         gc.DrawText(KTxtDrawCase22,box,offset,CGraphicsContext::ECenter,margin);
00372                         }
00373                         break;
00374                 case 23:
00375                         // draw some text right justified in a box,
00376                         // offset so text is just inside bottom of box
00377                         {
00378                         TInt boxHeight=box.Height(); // get height of text box
00379                         CFont* font=iMessageFont; // get the system message font
00380                         TInt fontDescent=font->DescentInPixels(); // system message font descent
00381                         offset=boxHeight-fontDescent-3;// offset, 3 pixel text line spacing 
00382                         TInt margin=2; // right margin is two pixels
00383                         gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
00384                         gc.SetBrushColor(liteGray);
00385                         gc.SetPenColor(darkGray);
00386                         gc.UseFont(iMessageFont);
00387                         gc.DrawText(KTxtDrawCase23,box,offset,CGraphicsContext::ERight,margin);
00388                         }
00389                         break;
00390                 case 24:
00391                         {
00392                         // draw a cross-hatched box
00393                         // then clear a small central rectangle
00394                         gc.SetBrushColor(darkGray);
00395                         gc.SetBrushStyle(CGraphicsContext::ESquareCrossHatchBrush);
00396                         gc.DrawRect(rect);
00397                         // clear a small rectangle
00398                         gc.SetBrushColor(liteGray); // change the brush color
00399                         gc.Clear(tinyBox); // clear to brush color
00400                         }
00401                         break;
00402                 case 25:
00403                         {
00404                         // draw a cross-hatched box
00405                         // then clear a small central rectangle
00406                         // and write some text in it in smallest Swiss font,
00407                         // (which is actually a tiny "block" print-preview font)
00408                         // starting bottom left (illustrating flicker, overlap, mess)
00409                         gc.SetBrushColor(darkGray);
00410                         gc.SetBrushStyle(CGraphicsContext::ESquareCrossHatchBrush);
00411                         gc.DrawRect(rect);
00412                         // clear a small rectangle
00413                         gc.SetBrushColor(liteGray); // change the brush color
00414                         gc.Clear(tinyBox); // clear to brush color
00415                         // get an alternative font
00416                         CFont* myFont;
00417                         _LIT(KTxtArial,"Arial");
00418                         TFontSpec myFontSpec(KTxtArial,1); // to get smallest Arial font
00419                         CGraphicsDevice* screenDevice=(iCoeEnv->ScreenDevice());
00420                         screenDevice->GetNearestFontInTwips(myFont,myFontSpec);
00421                         gc.UseFont(myFont);
00422                         // set the text drawing position & draw (demonstrating flicker)
00423                         TInt fontDescent=myFont->DescentInPixels();
00424                         TPoint pos(0,tinyBox.Height()-fontDescent);
00425                         pos+=tinyBox.iTl;
00426                         gc.DrawText(KTxtDrawCase25,pos);
00427                         // discard and destroy the font
00428                         gc.DiscardFont();
00429                         screenDevice->ReleaseFont(myFont);
00430                         }
00431                         break;
00432                 default:
00433                         break;
00434                 }
00435         delete mypoints; // an array must be destroyed after use
00436         }
00437 
00438 static CArrayFix<TPoint>* CreatePointsArrayL()
00439         {
00440         CArrayFixFlat<TPoint>* pointsArray = new CArrayFixFlat<TPoint>(5);
00441         
00442         TPoint point1(20,20);
00443         TPoint point2(100,190);
00444         TPoint point3(110,90);
00445         TPoint point4(50,150);
00446         TPoint point5(200,150);
00447         
00448         pointsArray->AppendL(point1);
00449         pointsArray->AppendL(point2);
00450         pointsArray->AppendL(point3);
00451         pointsArray->AppendL(point4);
00452         pointsArray->AppendL(point5);
00453         
00454         return pointsArray;
00455         }

Generated by  doxygen 1.6.2