shapespiechartcontainer.cpp
来自「series60 应用程序开发的源代码 series60 应用程序开发的源代码」· C++ 代码 · 共 177 行
CPP
177 行
/**
*
* @brief Definition of CShapesBarChartContainer
*
* Copyright (c) EMCC Software Ltd 2003
* @version 1.0
*/
// INCLUDE FILES
// Class includes
#include "ShapesPieChartContainer.h"
// System includes
#include <e32math.h> // KPi and Math:: trigonometric functions
#include <eikenv.h> // AKN_LAF_COLOR()
// User includes
#include "ShapesModel.h" // CShapesModel
// CONSTANTS
#define KPieRect TRect(TPoint(40, 40), TPoint(120, 120))
const TInt KStartPointX = 0;
const TInt KStartPointY = 70;
const TInt KMaxColorValue = 215;
// ================= MEMBER FUNCTIONS =======================
/**
* Symbian OS 2 phase constructor.
* Constructs the CShapesPieChartContainer using the NewLC method, popping
* the constructed object from the CleanupStack before returning it.
*
* @param aShapesModel a reference to the model
* @param aRect The rectangle for this window
* @return The newly constructed CShapesPieChartContainer
*/
CShapesPieChartContainer* CShapesPieChartContainer::NewL(CShapesModel& aShapesModel, const TRect& aRect)
{
CShapesPieChartContainer* self = CShapesPieChartContainer::NewLC(aShapesModel, aRect);
CleanupStack::Pop(self);
return self;
}
/**
* Symbian OS 2 phase constructor.
* Constructs the CShapesPieChartContainer using the constructor and ConstructL
* method, leaving the constructed object on the CleanupStack before returning it.
*
* @param aShapesModel a reference to the model
* @param aRect The rectangle for this window
* @return The newly constructed CShapesPieChartContainer
*/
CShapesPieChartContainer* CShapesPieChartContainer::NewLC(CShapesModel& aShapesModel, const TRect& aRect)
{
CShapesPieChartContainer* self = new (ELeave) CShapesPieChartContainer(aShapesModel);
CleanupStack::PushL(self);
self->ConstructL(aRect);
return self;
}
/**
* C++ constructor
*
* @param aShapesModel a reference to the model
*/
CShapesPieChartContainer::CShapesPieChartContainer(CShapesModel& aShapesModel)
: iShapesModel(aShapesModel)
{
}
/**
* Symbian OS 2nd phase constructor. Creates a Window for the control to draw to.
* Activates the control
*
* @param aRect The rectangle for this window
*/
void CShapesPieChartContainer::ConstructL(const TRect& aRect)
{
CreateWindowL();
SetRect(aRect);
ActivateL();
}
/**
* Destructor
*/
CShapesPieChartContainer::~CShapesPieChartContainer()
{
}
/**
* Draw function calls DrawPie()
*
* @param aRect The rectangle to draw to (not used)
*/
void CShapesPieChartContainer::Draw(const TRect& /*aRect*/) const
{
DrawPie();
}
/**
* Draws the pie chart using the GC DrawPie() function
* Trigonometrical rotation functions are used to calculate correct
* radials for each pie segment
*/
void CShapesPieChartContainer::DrawPie() const
{
// Clear the graphics context.
CWindowGc& gc = SystemGc();
gc.Clear();
// Set up variables necessary for calculations
const TPoint centerOfPie(KPieRect.Center());
TPoint startPoint(KStartPointX, KStartPointY); // cartesian based coordinate system
TPoint endPoint(startPoint); // cartesian based coordinate system
// Set up the random seed.
TTime time;
time.HomeTime();
TInt64 colorSeed = time.Int64();
const TReal sumOfData = iShapesModel.SumOfElements(); // TReal for floating-point division.
const TInt numElements = iShapesModel.NumElements();
for (TInt i = 0; i < numElements; i++)
{
// Obtain a value from the model
TInt currentVal = iShapesModel.ElementAt(i);
if (currentVal)
{
// Generate a random color and set brush parameters - note that this will result in
// different colors being used each time this view is selected (even for the same data).
TInt randomColor = Math::Rand(colorSeed);
randomColor = randomColor % KMaxColorValue;
TRgb brushColor = AKN_LAF_COLOR(randomColor);
gc.SetBrushColor(brushColor);
gc.SetBrushStyle(CGraphicsContext::EForwardDiagonalHatchBrush);
// Make the start of the new pie slice the end of the last one
startPoint = endPoint;
// Calculate the end point for the new pie segment based on rotation equations
// Calculate the angle as a percentage of the data.
const TReal angleInRadians = (currentVal * (2 * KPi)) / sumOfData;
// Calculate the sine and cosine of the angle.
TReal trigResultCos;
Math::Cos(trigResultCos, angleInRadians);
TReal trigResultSin;
Math::Sin(trigResultSin, angleInRadians);
// Calculate end point cartesian coordinates, casting results back to integers.
const TInt newX = (TInt)((startPoint.iX * trigResultCos) - (startPoint.iY * trigResultSin));
const TInt newY = (TInt)((startPoint.iX * trigResultSin) + (startPoint.iY * trigResultCos));
endPoint.SetXY(newX, newY);
// Adjust from Cartesian to screen coordinates
const TPoint pieStartPoint(centerOfPie.iX + startPoint.iX, centerOfPie.iY - startPoint.iY);
const TPoint pieEndPoint(centerOfPie.iX + endPoint.iX, centerOfPie.iY - endPoint.iY);
// Draw the pie
gc.DrawPie(KPieRect, pieStartPoint, pieEndPoint);
}
}
}
// End of File
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?