CPJAImage - 又一个图像绘制类
一个具有各种选项的图片绘制类 - 透明、禁用或灰度、居中或拉伸以适应给定矩形。
更新
2003年8月23日 - 修复了透明绘制错误
引言
在我编写了 CFileEditCtrl 编辑控件后,我收到一个请求,要求在浏览按钮上放置一个图像,然后又一个请求要求使控件变得扁平并对鼠标热响应。这成了一个相当艰巨的任务,我在本站和 www.codeguru.com 上搜索绘制代码,以绘制图像,无论是位图还是图标,无论是正常绘制还是透明绘制,无论是灰度化还是禁用,可能拉伸或至少居中在按钮上。因此,在找到一些解决了部分问题(但并非我想要的)的代码后,我将它们组合起来,填补了缺失的部分,并创建了 CPJAImage
类。虽然我编写这个类的原因是用于浏览按钮,但我认为不把它作为另一个独立的图像渲染类分享给大家是很可惜的。
致谢
Jean-Edouard Lachand-Robert 感谢他提供的 DitherBlt()
函数。
Paul Reynolds 感谢他提供的“True Mask”透明功能。
感谢 Zafir Anjum 和 Guy Gascoigne 提供的灰度算法。
使用 CPJAImage 类
第一步是将 PJAImage.h 和 PJAImage.cpp 文件包含到您的项目中。然后,在以正常方式加载或创建您的位图或图标对象后,使用 SetImage()
函数将其选择到 CPJAImage
对象中。
CBitmap Bitmap; Bitmap.LoadBitmap(IDB_BITMAP1); CPJAImage PJAImage; PJAImage.SetImage(Bitmap, PJAI_BITMAP);
然后,当您准备好绘制图像时,使用 DrawImage()
函数将图像绘制到给定的设备上下文中。
PJAImage.DrawImage(pDC, left, top, width, height, DrawFlags);
您在 DrawImage()
函数中指定的绘制标志决定了图像如何绘制。
用户函数
CPJAImage::CPJAImage()
类构造函数创建一个空的 CPJAImage
对象。
CPJAImage::~CPJAImage()
类析构函数销毁图像句柄
void CPJAImage::DrawImage(CDC *pToDC, int x, int y, int w, int h, DWORD DrawFlags = 0)
DrawImage()
执行实际的绘制操作。
参数
pToDC |
指向要将图像绘制到的设备上下文的指针。 |
x |
要绘制图像的边界矩形的左侧 |
是 |
边界矩形的顶部 |
w |
边界矩形的宽度 |
h |
边界矩形的高度 |
DrawFlags |
用于控制绘制的标志 |
在 DrawFlags 参数中使用的标志
|
将图像居中绘制在提供的矩形上。如果图像大于矩形,它将被裁剪。此标志不能与 PJAI_STRETCHED 标志一起使用。 |
PJAI_STRETCHED |
绘制图像,使其填充提供的矩形。位图使用 StretchBlt() API 函数拉伸。图标使用 DrawIconEx() API 函数拉伸。此标志不能与 PJAI_CENTERED 标志一起使用。 |
PJAI_DISABLED |
将图像绘制为禁用状态(3D 单色)。此标志不能与 PJAI_GRAYSCALE 标志一起使用。 |
PJAI_GRAYSCALE |
将图像绘制为灰度。此标志不能与 PJAI_DISABLED 标志一起使用。 |
PJAI_TRANSPARENT |
透明绘制图像。如果未通过 SetTransparentColor() 函数指定透明颜色,则使用图像左上角(GetPixel(0, 0))的颜色作为透明颜色。此标志对图标无效,因为图标默认就是透明的。 |
CSize CPJAImage::GetSize()
返回一个 CSize
对象,该对象包含当前 CPJAImage
中图像的大小。
BOOL CPJAImage::SetImage(HANDLE hImage, DWORD Flags)
将提供的图像选择到 CPJAImage
对象中。如果成功选择提供的图像,则返回 TRUE
,否则返回 FALSE
。
参数
hImage |
图像的 HANDLE ,可以是 HBITMAP (DIB 或 DDB)或 HICON |
标志 |
指定图像的标志。 |
SetImage() 函数使用的标志
PJAI_BITMAP |
给定的句柄是 HBITMAP |
PJAI_ICON |
给定的句柄是 HICON |
PJAI_AUTODELETE |
当设置新图像或删除 CPJAImage 对象时,将删除给定的句柄并释放内存。如果未设置此标志,则此类的用户负责在不再需要句柄时释放图像句柄。 |
COLORREF CPJAImage::SetTransparentColor(COLORREF clr = CLR_DEFAULT)
设置要用作位图图像透明颜色的颜色。返回先前的透明颜色。如果将 CLR_DEFAULT
(0xFF000000) 设置为透明颜色,则使用左上角像素(GetPixel(0, 0)
)的颜色作为透明颜色。
参数
clr |
透明颜色 |
演示应用程序
请务必查看演示应用程序,以实际了解 CPJAImage
类。虽然演示应用程序中有一个预加载的图像,但您可以将您喜欢的图片文件(*.ico, *.bmp, *.jpg, 或 *.gif)拖放到演示应用程序上。
要更改透明颜色,请单击 设置颜色 按钮,然后使用鼠标从显示的图片中选择颜色。
尽情享用!