CDrawingManager 类
CDrawingManager
类实现复杂的绘图算法。
语法
class CDrawingManager : public CObject
成员
公共构造函数
名称 | 描述 |
---|---|
CDrawingManager::CDrawingManager | 构造 CDrawingManager 对象。 |
CDrawingManager::~CDrawingManager |
析构函数。 |
公共方法
注解
CDrawingManager
类提供用于绘制阴影、颜色渐变和突出显示矩形的函数。 它还执行 alpha 值混合处理。 可以使用此类直接更改应用程序的 UI。
继承层次结构
CObject
CDrawingManager
要求
标头:afxdrawmanager.h
CDrawingManager::CDrawingManager
构造一个 CDrawingManager 对象。
CDrawingManager(CDC& dc);
参数
dc
[in] 对设备上下文的引用。 CDrawingManager
将此上下文用于绘图。
CDrawingManager::CreateBitmap_32
创建应用程序可以直接写入到的 32 位与设备无关的位图 (DIB)。
static HBITMAP __stdcall CreateBitmap_32(
const CSize& size,
void** pBits);
static HBITMAP __stdcall CreateBitmap_32(
HBITMAP bitmap,
COLORREF clrTransparent = -1);
参数
size
[in] 指示位图大小的 CSize 参数。
pBits
[out] 指向接收 DIB 位值位置的数据指针的指针。
位图
原始位图的句柄
clrTransparent
用于指定原始位图透明颜色的 RGB 值。
返回值
如果此方法成功,则为新创建的 DIB 位图的句柄;否则为 NULL。
备注
要详细了解如何创建 DIB 位图,请参阅 CreateDIBSection。
CDrawingManager::DrawAlpha
显示具有透明或半透明像素的位图。
void DrawAlpha(
CDC* pDstDC,
const CRect& rectDst,
CDC* pSrcDC,
const CRect& rectSrc);
参数
pDstDC
[in] 指向目标设备上下文的指针。
rectDst
[in] 目标矩形。
pSrcDC
[in] 指向源设备上下文的指针。
rectSrc
[in] 源矩形。
注解
此方法对两个位图执行 alpha 值混合处理。 有关 alpha 值混合处理的详细信息,请参阅 Windows SDK 中的 AlphaBlend。
CDrawingManager::DrawEllipse
使用提供的填充和边框颜色绘制椭圆形。
void DrawEllipse(
const CRect& rect,
COLORREF clrFill,
COLORREF clrLine);
参数
rect
[in] 椭圆形的边界矩形。
clrFill
[in] 此方法用于填充椭圆形的颜色。
clrLine
[in] 此方法用于椭圆形边框的颜色。
备注
如果任一颜色设置为 -1,则此方法会返回但不绘制椭圆形。 如果范围框的任一维度为 0,它也会返回但不绘制椭圆形。
CDrawingManager::DrawGradientRing
绘制一个环形,并用颜色渐变填充。
BOOL DrawGradientRing(
CRect rect,
COLORREF colorStart,
COLORREF colorFinish,
COLORREF colorBorder,
int nAngle,
int nWidth,
COLORREF clrFace = (COLORREF)-1);
参数
rect
[in] 一个 CRect 参数,用于指定渐变环的边界。
colorStart
[in] 渐变的第一种颜色。
colorFinish
[in] 渐变的最后一种颜色。
colorBorder
[in] 边框颜色。
nAngle
[in] 用于指定初始渐变绘制角度的参数。 该值应介于 0 到 360 之间。
nWidth
[in] 环形边框的宽度。
clrFace
[in] 环形内部的颜色。
返回值
如果成功,则不为 0;否则为 0。
备注
由 rect 定义的矩形必须至少为 5 像素宽和 5 像素高。
CDrawingManager::DrawLine、CDrawingManager::DrawLineA
绘制线条。
void DrawLine(
int x1,
int y1,
int x2,
int y2,
COLORREF clrLine);
void DrawLineA(
double x1,
double y1,
double x2,
double y2,
COLORREF clrLine);
参数
x1
[in] 行开始位置的 x 坐标。
y1
[in] 行开始位置的 y 坐标。
x2
[in] 行结束位置的 x 坐标。
y2
[in] 行结束位置的 y 坐标。
clrLine
[in] 行的颜色。
备注
如果 clrLine 等于 -1,此方法将失败。
CDrawingManager::DrawRect
使用提供的填充和边框颜色绘制矩形。
void DrawRect(
const CRect& rect,
COLORREF clrFill,
COLORREF clrLine);
参数
rect
[in] 矩形的边界。
clrFill
[in] 此方法用于填充矩形的颜色。
clrLine
[in] 此方法用于矩形边框的颜色。
注解
如果任一颜色设置为 -1,则此方法会返回但不绘制矩形。 如果矩形的任一维度为 0,它也会返回。
CDrawingManager::DrawShadow
为矩形区域绘制阴影。
BOOL DrawShadow(
CRect rect,
int nDepth,
int iMinBrightness = 100,
int iMaxBrightness = 50,
CBitmap* pBmpSaveBottom = NULL,
CBitmap* pBmpSaveRight = NULL,
COLORREF clrBase = (COLORREF)-1,
BOOL bRightShadow = TRUE);
参数
rect
[in] 应用程序中的矩形区域。 绘图管理器将在此区域下面绘制阴影。
nDepth
[in] 阴影的宽度和高度。
iMinBrightness
[in] 阴影的最小亮度。
iMaxBrightness
[in] 阴影的最大亮度。
pBmpSaveBottom
[in] 指向包含阴影底部图像的位图的指针。
pBmpSaveRight
[in] 指向一个位图的指针,该位图包含矩形右侧绘制的阴影的图像。
clrBase
[in] 阴影的颜色。
bRightShadow
[in] 一个布尔参数,指示如何绘制阴影。 如果 bRightShadow 为 TRUE
,则 DrawShadow
在矩形右侧绘制阴影。
返回值
如果成功,则不为 0;否则为 0。
备注
可以使用参数 pBmpSaveBottom 和 pBmpSaveRight 为底部和右侧阴影提供两个有效的位图。 如果这些 CBitmap 对象具有附加的 GDI 对象,DrawShadow
将使用这些位图作为阴影。 如果 CBitmap
参数没有附加的 GDI 对象,则 DrawShadow
绘制阴影并将位图附加到参数。 在将来调用 DrawShadow
时,可提供这些位图来加快绘制过程。 有关 CBitmap
类和 GDI 对象的详细信息,请参阅图形对象。
如果其中任一参数是 NULL
,DrawShadow
将自动绘制阴影。
如果将 bRightShadow 设置为 FALSE,将在矩形区域下方和左侧绘制阴影。
示例
下面的示例演示如何使用 CDrawingManager
类的 DrawShadow
方法。 此代码段是 Prop Sheet 演示示例的一部分。
// CDC* pDC
// CRect rectHeader
CDrawingManager dm(*pDC);
// Draw a shadow for a rectangular area.
// second parameter is the depth of the shadow
dm.DrawShadow(rectHeader, 2);
CDrawingManager::Fill4ColorsGradient
用两种颜色渐变填充矩形区域。
void Fill4ColorsGradient(
CRect rect,
COLORREF colorStart1,
COLORREF colorFinish1,
COLORREF colorStart2,
COLORREF colorFinish2,
BOOL bHorz = TRUE,
int nPercentage = 50);
参数
rect
[in] 要填充的矩形。
colorStart1
[in] 第一种颜色渐变的初始颜色。
colorFinish1
[in] 第一种颜色渐变的最终颜色。
colorStart2
[in] 第二种颜色渐变的初始颜色。
colorFinish2
[in] 第二种颜色渐变的最终颜色。
bHorz
[in] 一个布尔参数,指示 Fill4ColorsGradient
是为水平渐变还是垂直渐变着色。 TRUE 表示水平渐变。
nPercentage
[in] 0-100 的整数。 此值指示要填充第一种颜色渐变的矩形的百分比。
备注
当矩形填充两种颜色渐变时,它们要么位于彼此上方,要么彼此相邻,具体取决于 bHorz 的值。 使用 CDrawingManager::FillGradient 方法独立计算每种颜色渐变。
如果 nPercentage 小于 0 或大于 100,此方法将生成断言失败。
CDrawingManager::FillGradient
用指定的颜色渐变填充矩形区域。
void FillGradient(
CRect rect,
COLORREF colorStart,
COLORREF colorFinish,
BOOL bHorz = TRUE,
int nStartFlatPercentage = 0,
int nEndFlatPercentage = 0);
参数
rect
[in] 要填充的矩形区域。
colorStart
[in] 渐变的第一种颜色。
colorFinish
[in] 渐变的第一种颜色。
bHorz
[in] 一个布尔参数,指定 FillGradient
是否应绘制水平或垂直渐变。
nStartFlatPercentage
[in] FillGradient
在开始渐变之前用 colorStart 填充的矩形百分比。
nEndFlatPercentage
[in] FillGradient
在开始渐变之前用 colorFinish 填充的矩形百分比。
示例
下面的示例演示如何使用 CDrawingManager
类的 FillGradient
方法。 此代码片段是 MS Office 2007 演示示例的一部分。
// CRect rectScreen
// CDrawingManager dm
dm.FillGradient(rectScreen, RGB(114, 125, 152), RGB(178, 185, 202), TRUE);
CDrawingManager::FillGradient2
用指定的颜色渐变填充矩形区域。
void FillGradient2 (
CRect rect,
COLORREF colorStart,
COLORREF colorFinish,
int nAngle = 0);
参数
rect
[in] 要填充的矩形区域。
colorStart
[in] 渐变的第一种颜色。
colorFinish
[in] 渐变的最后一种颜色。
nAngle
[in] 一个介于 0 和 360 之间的整数。 此参数指定颜色渐变的方向。
备注
使用 nAngle 指定颜色渐变的方向。 当指定颜色渐变的方向时,还可以指定颜色渐变的起始位置。 nAngle 的值为 0 表示渐变从矩形顶部开始。 随着 nAngle 的增加,渐变的起始位置会根据角度沿逆时针方向移动。
示例
下面的示例演示如何使用 CDrawingManager
类的 FillGradient2
方法。 此代码片段是新控件示例的一部分。
// CRect rect
// CDC* pDC
CDrawingManager dm(*pDC);
// The last parameter is the angle that specifies the direction of the color gradient.
dm.FillGradient2(rect, RGB(102, 200, 238), RGB(0, 129, 185), 45);
CDrawingManager::GrayRect
用指定的灰色填充矩形。
BOOL GrayRect(
CRect rect,
int nPercentage = -1,
COLORREF clrTransparent = (COLORREF)-1,
COLORREF clrDisabled = (COLORREF)-1);
参数
rect
[in] 要填充的矩形区域。
nPercentage
[in] 矩形中所需的灰色百分比。
clrTransparent
[in] 透明色。
clrDisabled
[in] 此方法用于去饱和的颜色(如果 nPercentage 设置为 -1)。
返回值
如果此方法成功,则为 TRUE;否则为 FALSE。
备注
对于参数 nPercentage,值越低表示颜色越深。
nPercentage 的最大值为 200。 大于 200 的值不会更改矩形的外观。 如果值为 -1,则此方法使用 clrDisabled 来限制矩形的饱和度。
CDrawingManager::HighlightRect
突出显示矩形区域。
BOOL HighlightRect(
CRect rect,
int nPercentage = -1,
COLORREF clrTransparent = (COLORREF)-1,
int nTolerance = 0,
COLORREF clrBlend = (COLORREF)-1);
参数
rect
[in] 要突出显示的矩形区域。
nPercentage
[in] 指示突出显示透明度的百分比。
clrTransparent
[in] 透明色。
nTolerance
[in] 一个介于 0 和 255 之间的整数,指示颜色容差。
clrBlend
[in] 混合的基色。
返回值
如果此方法成功,则为 TRUE;否则为 FALSE。
注解
如果 nPercentage 介于 0 和 99 之间,则 HighlightRect
使用 alpha 值混合处理算法。 有关 alpha 值混合处理的详细信息,请参阅 alpha 值混合处理线条和填充。 如果 nPercentage 为 -1,则此方法使用默认突出显示级别。 如果 nPercentage 为 100,则此方法不执行任何操作并返回 TRUE。
该方法使用参数 nTolerance 来确定是否突出显示矩形区域。 要突出显示矩形,应用程序的背景色与 clrTransparent 之间的差异必须小于每个颜色分量(红色、绿色和蓝色)中的 nTolerance。
CDrawingManager::HLStoRGB_ONE
将颜色从 HLS 表示形式转换为 RGB 表示形式。
static COLORREF __stdcall HLStoRGB_ONE(
double H,
double L,
double S);
参数
H
[in] 一个介于 0 和 1 之间的数字,表示颜色的色调。
L
[in] 一个介于 0 和 1 之间的数字,表示颜色的亮度。
S
[in] 一个介于 0 和 1 之间的数字,表示颜色的饱和度。
返回值
提供的 HLS 颜色的 RGB 表示形式。
备注
颜色可以表示为 HSV(色调、饱和度和值)、HSL(色调、饱和度和亮度)或 RGB(红色、绿色和蓝色)。 要详细了解颜色的不同表示形式,请参阅颜色。
此方法和 CDrawingManager::HLStoRGB_TWO
方法执行相同的操作,但需要不同的 H 参数值。 在此方法中,H 是圆的百分比。 在 CDrawingManager::HLStoRGB_TWO
方法中,H 是介于 0 和 360 之间的度数,都表示红色。 例如,对于 HLStoRGB_ONE
,H 的值 0.25 等效于 HLStoRGB_TWO
的值 90。
CDrawingManager::HLStoRGB_TWO
将颜色从 HLS 表示形式转换为 RGB 表示形式。
static COLORREF __stdcall HLStoRGB_TWO(
double H,
double L,
double S);
参数
H
[in] 一个介于 0 和 360 之间的数字,表示颜色的色调。
L
[in] 一个介于 0 和 1 之间的数字,表示颜色的亮度。
S
[in] 一个介于 0 和 1 之间的数字,表示颜色的饱和度。
返回值
提供的 HLS 颜色的 RGB 表示形式。
备注
颜色可以表示为 HSV(色调、饱和度和值)、HSL(色调、饱和度和亮度)或 RGB(红色、绿色和蓝色)。 要详细了解颜色的不同表示形式,请参阅颜色。
此方法和 CDrawingManager::HLStoRGB_ONE 方法执行相同的操作,但需要不同的 H 参数值。 在此方法中,H 是介于 0 和 360 之间的度数,都表示红色。 在 CDrawingManager::HLStoRGB_ONE 方法中,H 是圆的百分比。 例如,对于 HLStoRGB_ONE
,H 的值 0.25 等效于 HLStoRGB_TWO
的值 90。
CDrawingManager::HSVtoRGB
将颜色从 HSV 表示形式转换为 RGB 表示形式。
static COLORREF __stdcall HSVtoRGB(
double H,
double S,
double V);
参数
H
[in] 一个介于 0 和 360 之间的数字,表示颜色的色调。
S
[in] 一个介于 0 和 1 之间的数字,表示颜色的饱和度。
V
[in] 一个介于 0 和 1 之间的数字,表示颜色的值。
返回值
提供的 HSV 颜色的 RGB 表示形式。
备注
颜色可以表示为 HSV(色调、饱和度和值)、HSL(色调、饱和度和亮度)或 RGB(红色、绿色和蓝色)。 要详细了解颜色的不同表示形式,请参阅颜色。
CDrawingManager::HuetoRGB
将色调值转换为红色、绿色或蓝色分量。
static double __stdcall HuetoRGB(
double m1,
double m2,
double h);
static BYTE __stdcall HueToRGB(
float rm1,
float rm2,
float rh);
参数
m1
[in] 请参阅“备注”。
m2
[in] 请参阅“备注”。
h
[in] 请参阅“备注”。
rm1
[in] 请参阅“备注”。
rm2
[in] 请参阅“备注”。
rh
[in] 请参阅“备注”。
返回值
提供的色调的单个红色、绿色或蓝色分量。
备注
此方法是 CDrawingManager
类用于计算 HSV 或 HSL 表示形式中颜色的单个红色、绿色和蓝色分量的帮助程序方法。 此方法不是由程序员直接调用的。 输入参数是依赖于转换算法的值。
若要将 HSV 或 HSL 颜色转换为 RGB 表示形式,请调用以下方法之一:
CDrawingManager::MirrorRect
翻转矩形区域。
void MirrorRect(
CRect rect,
BOOL bHorz = TRUE);
参数
rect
[in] 要翻转的区域的范围框。
bHorz
[in] 一个布尔参数,指示矩形是水平翻转还是垂直翻转。
注解
此方法可以翻转 CDrawingManager
类拥有的设备上下文的任何区域。 如果 bHorz 设置为 TRUE,则此方法水平翻转区域。 否则,它会垂直翻转区域。
CDrawingManager::PixelAlpha
计算半透明像素的最终颜色。
static COLORREF __stdcall PixelAlpha(
COLORREF srcPixel,
int percent);
static COLORREF __stdcall PixelAlpha(
COLORREF srcPixel,
double percentR,
double percentG,
double percentB);
static COLORREF __stdcall PixelAlpha(
COLORREF srcPixel,
COLORREF dstPixel,
int percent);
参数
srcPixel
[in] 像素的初始颜色。
percent
[in] 一个介于 0 和 100 之间的数字,表示透明度的百分比。 值 100 表示初始颜色完全透明。
percentR
[in] 一个介于 0 和 100 之间的数字,表示红色分量透明度的百分比。
percentG
[in] 一个介于 0 和 100 之间的数字,表示绿色分量透明度的百分比。
percentB
[in] 一个介于 0 和 100 之间的数字,表示蓝色分量透明度的百分比。
dstPixel
[in] 像素的基色。
返回值
半透明像素的最终颜色。
备注
这是一个用于为半透明位图着色的帮助程序类,不由程序员直接调用。
使用具有 dstPixel 的方法版本时,最终颜色是 dstPixel 和 srcPixel 的组合。 srcPixel 颜色是 dstPixel 基色上的部分透明颜色。
CDrawingManager::PrepareShadowMask
创建可用作阴影的位图。
static HBITMAP __stdcall PrepareShadowMask (
int nDepth,
COLORREF clrBase,
int iMinBrightness = 0,
int iMaxBrightness = 100);
参数
nDepth
[in] 阴影的宽度和高度。
clrBase
[in] 阴影的颜色。
iMinBrightness
[in] 阴影的最小亮度。
iMaxBrightness
[in] 阴影的最大亮度。
返回值
如果此方法成功,则为所创建位图的句柄;否则为 NULL。
备注
如果 nDepth 设置为 0,此方法将退出并返回 NULL。 如果 nDepth 小于 3,阴影的宽度和高度将设置为 3 像素。
CDrawingManager::RGBtoHSL
将颜色从红色、绿色和蓝色 (RGB) 表示形式转换为色调、饱和度和亮度 (HSL) 表示形式。
static void __stdcall RGBtoHSL(
COLORREF rgb,
double* H,
double* S,
double* L);
参数
rgb
[in] RGB 值中的颜色。
H
[out] 指向该方法存储颜色色调的双精度的指针。
S
[out] 指向该方法存储颜色饱和度的双精度的指针。
L
[out] 指向该方法存储颜色亮度的双精度的指针。
注解
颜色可以表示为 HSV(色调、饱和度和值)、HSL(色调、饱和度和亮度)或 RGB(红色、绿色和蓝色)。 要详细了解颜色的不同表示形式,请参阅颜色。
H 的返回值表示为介于 0 和 1 之间的分数,其中 0 和 1 都表示红色。 S 和 L 的返回值为介于 0 和 1 之间的数字。
CDrawingManager::RGBtoHSV
将颜色从 RGB 表示形式转换为 HSV 表示形式。
static void __stdcall RGBtoHSV(
COLORREF rgb,
double* H,
double* S,
double* V);
参数
rgb
[in] 要以 RGB 表示形式转换的颜色。
H
[out] 指向该方法存储颜色色调结果的双精度的指针。
S
[out] 指向该方法存储颜色饱和度结果的双精度的指针。
V
[out] 指向该方法存储颜色值结果的双精度的指针。
注解
颜色可以表示为 HSV(色调、饱和度和值)、HSL(色调、饱和度和亮度)或 RGB(红色、绿色和蓝色)。 要详细了解颜色的不同表示形式,请参阅颜色。
H 的返回值为介于 0 和 360 之间的数字,其中 0 和 360 都表示红色。 S 和 V 的返回值为介于 0 和 1 之间的数字。
CDrawingManager::SetAlphaPixel
为位图中的透明像素着色。
static void __stdcall SetAlphaPixel(
COLORREF* pBits,
CRect rect,
int x,
int y,
int percent,
int iShadowSize,
COLORREF clrBase = (COLORREF)-1,
BOOL bIsRight = TRUE);
参数
pBits
[in] 指向位图位值的指针。
rect
[in] 应用程序中的矩形区域。 绘图管理器在该区域下方和右侧绘制阴影。
x
[in] 要着色的像素的水平坐标。
y
[in] 要着色的像素的垂直坐标。
percent
[in] 透明度的百分比。
iShadowSize
[in] 阴影的宽度和高度。
clrBase
[in] 阴影的颜色。
bIsRight
[in] 一个布尔参数,指示要着色的像素。 有关详细信息,请参阅备注部分。
备注
此方法是 CDrawingManager::DrawShadow 方法使用的帮助程序方法。 如果想要绘制阴影,建议改为调用 CDrawingManager::DrawShadow
。
如果 bIsRight 设置为 TRUE,则从 rect 的右边缘 x 像素处测量要着色的像素。 如果为 FALSE,则从 rect 的左边缘 x 像素处测量要着色的像素。
CDrawingManager::SetPixel
将位图中的单个像素更改为指定颜色。
static void __stdcall SetPixel(
COLORREF* pBits,
int cx,
int cy,
int x,
int y,
COLORREF color);
参数
pBits
[in] 指向位图位值的指针。
cx
[in] 位图的总宽度。
cy
[in] 位图的总高度。
x
[in] 要更改的位图中像素的 x 坐标。
y
[in] 要更改的位图中像素的 y 坐标。
color
[in] 由所提供坐标标识的像素的新颜色。
CDrawingManager::SmartMixColors
根据加权比率合并两种颜色。
static COLORREF __stdcall SmartMixColors(
COLORREF color1,
COLORREF color2,
double dblLumRatio = 1.,
int k1 = 1,
int k2 = 1);
参数
color1
[in] 混合的第一种颜色。
color2
[in] 混合的第二种颜色。
dblLumRatio
[in] 新颜色的亮度比率。 SmartMixColors
在确定最终颜色之前,将此混合颜色的亮度乘以此比率。
k1
[in] 第一种颜色的加权比率。
k2
[in] 第二种颜色的加权比率。
返回值
用于表示所提供颜色的加权混合的颜色。
备注
如果 k1 或 k2 小于零,此方法将失败并出现错误。 如果这两个参数都设置为 0,则该方法返回 RGB(0, 0, 0)
。
加权比率是使用以下公式计算的:(color1 * k1 + color2 * k2)/(k1 + k2)。 确定加权比率后,该方法计算混合颜色的亮度。 然后,它将亮度乘以 dblLumRatio。 如果值大于 1.0,该方法会将混合颜色的亮度设置为新值。 否则,亮度设置为 1.0。
CDrawingManager::DrawRotated
将指定矩形内的源 DC 内容旋转 90 度。
void DrawRotated(
CRect rectDest,
CDC& dcSrc,
BOOL bClockWise);
参数
rectDest
目标矩形。
dcSrc
源设备上下文。
bClockWise
TRUE 表示旋转 +90 度;FALSE 表示旋转 -90 度。