一、使用GDI对象绘图时遵循的三个步骤
1、绘图开始前,创建一个新的GDI对象,并选入当前设备上下文中,同时保持指向原GDI对象的指针;
2、使用新的GDI对象绘图;
3、绘图结束后,使用已保存的原GDI对象的指针将设备上下文恢复原状。
二、GDI主要提供的绘图工具类
1、CGdiObject:提供各种Windows GDI绘图工具的基类;
2、CBitmap:提供位图操作接口;
3、CBrush:可以选作设备上下文的当前画刷;
4、CFont:可以选作设备上下文的当前字体;
5、CPalette:提供应用程序和显示器之间的颜色接口;
6、CPen:可以选作设备上下文的当前画笔。
三、绘制像素点函数
1、SetPixel函数
返回值:如果该函数调用成功,返回所绘制像素点的RGB值;否则,返回-1.
2、SetPixelV函数
返回值:返回布尔型——如果该函数调用成功,返回“非0”;否则,返回“0”。
注:一般情况下使用SetPixelV函数绘制像素点,因为SetPixel函数需要返回RGB值,执行速度比前者更慢。
RGB为颜色表示的一种方法,C++/MFC工程[1]——创建新项目及常用类介绍中有简单介绍。
四、获取像素点颜色函数
GetPixel函数
返回值:若该函数调用成功,返回指定像素点的RGB颜色值;否则,返回“-1”。
五、实例
1、定义P0点(100,100),将其向右移100个像素点得到P1点。将P0点绘制为红色,获取该点像素颜色,将颜色赋值给P1点。
CPoint P0(100, 100);//定义P0点
CPoint P1(P0.x + 100, P0.y);//右移100个像素得到P1点
pDC->SetPixel(P0, RGB(255, 0, 0));//绘制P0点为红色
COLORREF crColor = pDC->GetPixel(P0);//定义COLORREF型变量,获取P0点像素
pDC->SetPixel(P1, crColor);//颜色赋值给P1点
2、自定义坐标系,在Y轴右侧绘制一正方形,随机填充颜色; 调用GetPixel函数获取该正方形内各像素点的坐标和颜色,在X轴负向的对称位置上重新绘制(Copy)正方形点集。
//自定义坐标系
CRect rect;//不是单纯的一个数值
GetClientRect(rect);
pDC->SetMapMode(MM_ANISOTROPIC);//变量是一种映射模式;->:指向成员运算符
pDC->SetWindowExt(rect.Width(), rect.Height());//设置窗口大小(宽度、高度)
pDC->SetViewportExt(rect.Width(), -rect.Height());//设置视区的大小,使Y轴向上
pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);//设置原点位置
rect.OffsetRect(-rect.Width() / 2, -rect.Height() / 2);//偏移函数,向左偏移
//绘制,左下角(50,-50),右上角(150,50)
srand((unsigned)time(NULL));//随机数发生器,使用time函数(秒数)获得一个随机值
COLORREF crColor;
for (int x = 50; x < 150; x++)//横坐标
for (int y = -50; y < 50; y++)//纵坐标
pDC->SetPixelV(x, y, RGB(rand() % 255, rand() % 255, rand() % 255));//绘制像素点
for(int x=50;x<150;x++)
for (int y = -50; y < 50; y++)
{
crColor = pDC->GetPixel(x, y);//获取RGB值
pDC->SetPixelV(-x, y, crColor);//X轴负向对称位置
}
运行效果如下:
可以看到,程序首先绘制好右边的正方形,左边被对称过去的正方形以肉眼可见的速度自右向左扫描绘制。那么,如果将代码改为如下的情况,结果如何?
srand((unsigned)time(NULL));//随机数发生器,使用time函数(秒数)获得一个随机值
COLORREF crColor;
for (int x = 50; x < 150; x++)//横坐标
for (int y = -50; y < 50; y++)//纵坐标
{
pDC->SetPixelV(x, y, RGB(rand() % 255, rand() % 255, rand() % 255));//绘制像素点
crColor = pDC->GetPixel(x, y);//获取RGB值
pDC->SetPixelV(-x, y, crColor);//X轴负向对称位置
}
容易观察到,此时程序是右边一列、左边一列(事实上是一个像素一个像素去复制)去绘制的,这和代码中体现的顺序一致。