188 lines
6.9 KiB
C++
188 lines
6.9 KiB
C++
// ==========================================================================
|
|
// Class Specification : COXGraphics
|
|
// ==========================================================================
|
|
|
|
// Header file : OXGraphics.h
|
|
|
|
// Version: 9.3
|
|
|
|
// This software along with its related components, documentation and files ("The Libraries")
|
|
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
|
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
|
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
|
// to obtain this file, or directly from our office. For a copy of the license governing
|
|
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
|
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
/////////////////////////////////////////////////
|
|
|
|
/*
|
|
|
|
DESCRIPTION
|
|
|
|
COXGraphics class was designed in order to provide advanced graphics routines
|
|
for programmers. We should note from the very beginning that we are not going
|
|
to explain the underlying theory that has been used while creating this class.
|
|
For those who are interested in depth information about graphics algorithms
|
|
we would recommend toread the following book:
|
|
|
|
"Computer Graphics, principle and practice" by James D. Foley,
|
|
Andries van Dam
|
|
Steven K. Feiner
|
|
John F. Hughes
|
|
|
|
Addison-Wesley publishing company. ISBN 0-201-84840-6
|
|
|
|
|
|
This class will be constantly updated with new cool graphics routines. At this
|
|
point it provides the following functionality:
|
|
|
|
|
|
1) Drawing rounded rectangles. Rectangle is filled with given color.
|
|
The color of every point is calculated depending on the location of
|
|
light source (vertical and horizontal angles) and surface
|
|
characteristics (light intensity, spot size, etc.). This way we
|
|
can achieve 3D effect.
|
|
|
|
In order to draw 3D rounded rectangle you should call the following function:
|
|
|
|
DrawRoundedButton()
|
|
|
|
Refer to the documentation on this function which arguments reveal all
|
|
settings that influence the ultimate appearance of the drawn rectangle.
|
|
|
|
The functionality provided by this function is used in the following
|
|
Ultimate Toolbox class: COXRoundedButton. Refer to this class as to
|
|
the real-life example of using of this function. Also you might want
|
|
to take look at the RoundedButton sample that can be found in the
|
|
.\Samples\gui\RoundedButton subdirectory of your Ultimate Toolbox
|
|
directory.
|
|
|
|
|
|
|
|
|
|
Dependency:
|
|
#include "OXGraphics.h"
|
|
|
|
|
|
Source code files:
|
|
"OXGraphics.cpp"
|
|
|
|
|
|
*/
|
|
|
|
#if !defined(_OXGRAPHICS_H__)
|
|
#define _OXGRAPHICS_H__
|
|
|
|
#if _MSC_VER >= 1000
|
|
#pragma once
|
|
#endif // _MSC_VER >= 1000
|
|
|
|
#include "OXDllExt.h"
|
|
|
|
|
|
class OX_CLASS_DECL COXGraphics
|
|
{
|
|
public:
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Constructs the object
|
|
COXGraphics();
|
|
|
|
|
|
// --- In :
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Destructs the object
|
|
virtual ~COXGraphics();
|
|
|
|
|
|
protected:
|
|
|
|
// Functions to draw rounded button
|
|
//
|
|
|
|
// Calculates colors on sphere with light source
|
|
DWORD* PrepareSphere(CDC *pDC, // dc where button will be drawn
|
|
int nLeft, int nTop, // coordinates of the top/left corner of the button
|
|
int nExternalRadius, // roundness of the button
|
|
int nInternalRadius, // part of sphere that will be painted using flat sphere color
|
|
COLORREF clrLightSource, // color of light source
|
|
float Lx, float Ly, float Lz, // normalized vector of the normal to the sphere
|
|
float fLightIntensity, // power of the light source
|
|
int nPhong, // influence on spot size
|
|
float fMirror, // influence on spot intensity
|
|
float fDiffuse, // diffuse lighting
|
|
float fAmbient, // ambient lighting
|
|
COLORREF clrButton, // color for filing the bitmap
|
|
COLORREF clrBack // color to fill the space that is not covered by the button
|
|
// if CLR_NONE is specified then the background will be covered
|
|
// using background of the specified devicce context
|
|
);
|
|
|
|
// Helper function. Draws specified bitmap in the specified position.
|
|
// If pPalette is not NULL then it will be populated with palette
|
|
// that was used to draw the bitmap (only for 256-color video mode)
|
|
void DrawBitmap(CDC *pDC, int nLeft, int nTop, int width, int height,
|
|
DWORD *bitmap, CPalette* pPalette);
|
|
|
|
// Helper function. Builds palette for specified bitmap
|
|
BOOL BuildButtonPalette(CDC *pDC, DWORD *bitmap, int width,
|
|
int height, CPalette* pPalette);
|
|
|
|
// Create bitmap for rounded button on the base of the specified sphere bitmap
|
|
// that was built using PrepareSphere() function
|
|
DWORD* PrepareButton(int nButtonWidth, int nButtonHeight,
|
|
DWORD *SphereBitmap, int SphereRadius);
|
|
|
|
//
|
|
///////////////////////////////////////////////////////////////
|
|
|
|
public:
|
|
// --- In : pDC - device context to draw button in
|
|
// nLeft - x coordinate of top/left corner of the button
|
|
// nTop - y coordinate of top/left corner of the button
|
|
// nButtonWidth - button width
|
|
// nButtonHeight - button height
|
|
// nExternalRadius - radius of flat center and rounded border
|
|
// nInternalRadius - radius of flat part
|
|
// pPalette - pointer to palette object to be populated with
|
|
// entries used to draw the button when 256-color
|
|
// video mode is set on
|
|
// clrButton - solid color of button without lighting
|
|
// clrLightSource - color of light source
|
|
// fThetta - vertical angle of the light source
|
|
// fPhi - horizontal angle of the light source
|
|
// fLightIntensity - influence on diffuse lighting and spot intensity
|
|
// nPhong - influence on spot size
|
|
// fMirror - influence on spot intensity
|
|
// fDiffuse - diffuse lighting
|
|
// fAmbient - ambient lighting
|
|
// clrBack - color to fill the space that is not covered
|
|
// by the button. If CLR_NONE color is specified
|
|
// then the background will be covered using
|
|
// background of the specified device context
|
|
//
|
|
// --- Out :
|
|
// --- Returns:
|
|
// --- Effect : Draws rounded button. The button background color will be
|
|
// adjusted in order to accommodate light source, which properties
|
|
// can be set using parameters of the function. If current video
|
|
// mode is set to display only 256 colors the palette that has
|
|
// been used in order to draw the button will be saved in pPalette
|
|
// parameter
|
|
void DrawRoundedButton(CDC* pDC, int nLeft, int nTop, int nButtonWidth,
|
|
int nButtonHeight, int nExternalRadius=8, int nInternalRadius=3,
|
|
CPalette* pPalette=NULL,
|
|
COLORREF clrButton=::GetSysColor(COLOR_BTNFACE),
|
|
COLORREF clrLightSource=::GetSysColor(COLOR_3DHIGHLIGHT),
|
|
float fThetta=60, float fPhi=-45,
|
|
float fLightIntensity=1.3f, int nPhong=15, float fMirror=0.6f,
|
|
float fDiffuse=0.5f, float fAmbient=0.9f,
|
|
COLORREF clrBack=CLR_NONE);
|
|
};
|
|
|
|
#endif // !defined(_OXGRAPHICS_H__)
|