C++/MFC工程[3]——像素点的绘制

文章介绍了使用GDI对象进行绘图的三个基本步骤,包括创建GDI对象、绘图和恢复设备上下文。详细讨论了GDI提供的绘图工具类,如CBitmap、CBrush等,并讲解了SetPixel和SetPixelV函数用于绘制和获取像素颜色的方法。通过示例展示了如何在自定义坐标系中绘制正方形并实现颜色对称复制的效果。
摘要由CSDN通过智能技术生成

一、使用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轴负向对称位置
	}

运行效果如下: 

 \Rightarrow  

 可以看到,程序首先绘制好右边的正方形,左边被对称过去的正方形以肉眼可见的速度自右向左扫描绘制。那么,如果将代码改为如下的情况,结果如何?

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轴负向对称位置
	}

 \Rightarrow 

 容易观察到,此时程序是右边一列、左边一列(事实上是一个像素一个像素去复制)去绘制的,这和代码中体现的顺序一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陆小玖

您的鼓励是我的不竭动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值