附录二 VC环境下画象素的方法

  • 格式:doc
  • 大小:228.50 KB
  • 文档页数:6

59
附录二 VC环境下画象素的方法
众所周知,计算机内部存储和使用的数据是二进制数(由0和1组成)。目前我们使用的
主要图形输出设备显示器(一股为光栅图形显示器)和打印机(点阵、喷墨、激光打印机)本质
上是一种画点设备,是由一定数量的网格状细小光点(光点称为像案,光点的数量称为分辨
率)组成,使其某些象素亮(二进值为1),某些象素不亮(二进值为0)来显示图形或文字的。
因此,所谓的基本图形生成原理是指在点阵输出设备的情况下,如何对一条斜的直线或弯
曲的曲线尽可能快地输出其最接近理想的直线或曲线,即如何以最快的速度确定最佳逼近
于图形的象素集。
基本上,每种编程语言都会提供一个最低层的对显示设备的象素进行写操作的函数。
如C语言中的putpixel(x, y, color);
其中,x和y指定象素的位置坐标,color指定象素的颜色。
下面主要介绍在VC环境下如何画象素。
1、使用Windows API函数。其原型为:
SetPixel(HDC hdc, int x, int y, COLORREF crColor);
其中,hdc为设备上下文句柄,可由GetDC获得。x和y指定象素的位置坐标,crColor
指定象素的颜色。

2、使用CDC类的成员函数。其原型为:
SetPixel(int x, int y, COLORREF crColor);
其中,x和y指定象素的位置坐标,crColor指定象素的颜色。
使用方法:
生成一个单文档程序GraphExp,在其视图类CGraphExpView的成员函数OnDraw中添
加一行代码:pDC->SetPixel(100, 100, RGB(255, 0,0)); 运行程序,即可见在(100, 100)处生成
了一个红色的象素点。
接下来,我们将重点介绍如何在我们自己编写的图形学算法程序中实现画象素。

方法一:成员变量法。即:将CDC类作为自己编写的图形学算法类CGraphicDisp的一
个成员变量。
class CGraphicDisp
{
public:
CDC *pDC;
CGraphicDisp(CDC *poDC);
void lineDDA(int x1, int y1, int x2, int y2, COLORREF crColor=RGB(255, 0, 0));

};
60

建一个自己编写的图形学算法类
将CDC类作为图形学算法类的一个成员变量
CGraphicDisp::CGraphicDisp(CDC *poDC)
{
pDC = poDC;
}
61

//自己写的DDA画直线算法
void CGraphicDisp::lineDDA(int x1, int y1, int x2, int y2, COLORREF crColor)
{

pDC -> SetPixel(ROUND(x), ROUND(y), crColor);

}

图形学算法程序
具体使用:
生成一个单文档程序GraphExp,在其视图类CGraphExpView的实现文件中包含
CGraphicDisp的头文件,并在其成员函数OnDraw中添加如下代码:
CGraphicDisp mydisp(pDC);
mydisp.lineDDA(100, 100, 220, 240, RGB(255, 0, 0));
运行程序,即可见在屏幕上生成了一条红色的从点(100,100)到点(220, 240)的直线。
62

OnDraw函数中的代码
方法二:派生法。即:将CDC类作为自己编写的图形学算法类CGraphicDisp的基类。
class CGraphicDisp: public CDC
{
public:
void lineDDA(int x1, int y1, int x2, int y2, COLORREF crColor=RGB(255, 0, 0));

};

将CDC类作为图形学算法类的基类
//自己写的DDA画直线算法
void CGraphicDisp::lineDDA(int x1, int y1, int x2, int y2, COLORREF crColor)
{

SetPixel(ROUND(x), ROUND(y), crColor);
63


}

图形学算法程序
具体使用:
生成一个单文档程序GraphExp,在其视图类CGraphExpView的实现文件中包含
CGraphicDisp的头文件,并在其成员函数OnDraw中添加如下代码:
CGraphicDisp *mydisp = (CGraphicDisp *)pDC;
mydisp->lineDDA(100, 100, 220, 240, RGB(255, 0, 0));
运行程序,即可见在屏幕上生成了一条红色的从点(100,100)到点(220, 240)的直线。

OnDraw函数中的代码
64

用鼠标画线:将设量绘图模式为反转模式语句“dc.SetROP2(R2_NOT);”放在绘直线算
法中。
画直线算法

鼠标移动函数