绘制其实就是在给每一个像素点涂颜色,每种颜色都是由红蓝黄三要素组合而成,因此通过RGB 颜色值可以指定出一种颜色,一个 RGB 颜色值由三个两位十六进制数字组成,分别代表各自的颜色强度。例如,颜色值 #FF0000(十六进制) 之所以被渲染为红色,是因为红色的值达到了最高值 FF (等于十进制的 255)。同时红色也可以通过RGB(255,0,0)来表示,也可以通过二进制的0X11111001来表示。
设备上下文绘图有很多种方法。例如通过创建位图画刷,利用其填充一个区域来实现图像的绘制。此外,还可以使用CDC类的位图函数来输出位图到设备上下文中。
BitBlt 用于从原设备中复制位图到目标设备,语法格式如下:
BOOLBitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrcDC,int xSrc,int ySrc,DWORDdwRop);
x:目标矩形区域的左上角x轴坐标点。
y:目标矩形区域的左上角y轴坐标点。
nWidth:在目标设备中绘制位图的宽度。
nHight:在目标设备中绘制位图的高度。
pSrcDC:源设备上下文对象指针。
xSrc:源设备上下文的起点x轴坐标,函数从该起点复制位图到目标设备。
ySrc:源设备上下文的起点y轴坐标,函数从该起点复制位图到目标设备。
dwRop:光栅操作代码(查看此参数的详细请点击我)
StretchBlt与BitBlt不同在于StretchBlt方法能够延伸或收缩位图以适应目标区域的大小。格式如下:
BOOL StrevhBlt(int x,int y,int nWidth,int nHeight,CDC* pSrcDC,int xSrc,int ySrc,intnSrcWidth,int nSrcHeight,DWORD dwRop);
x:目标矩形区域的左上角x轴坐标点。
y:目标矩形区域的左上角y轴坐标点。
nWidth:在目标设备中绘制位图的宽度。
nHight:在目标设备中绘制位图的高度。
pSrcDC:源设备上下文对象指针。
xSrc:源设备上下文的起点x轴坐标,函数从该起点复制位图到目标设备。
ySrc:源设备上下文的起点y轴坐标,函数从该起点复制位图到目标设备。
nSrcWidth;需要复制的位图宽度。
nSrcHeight;需要复制的位图高度。
dwRop:光栅操作代码。
下面是两种方法对比程序,程序代码如下:
void CoutoutBmpView::OnDraw(CDC* pDC) { COutputBmpDoc* pDoc =GetDocument();//获取文档对象 ASSERT_VALID(pDoc);//验证文档对象 CDC memDC;//定义一个设备上下文 memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文 CBitmap bmp;//定义位图对象 bmp.LoadBitmap(IDB_BKBITMAP);//加载位图 memDC.SelectObject(&bmp);//选中位图对象 pDC->BitBlt(30,20,180,180,&memDC,1,1,SRCCOPY);//绘制位图 //以上是利用BitBlt来绘制位图 CRect rc(30,20,210,200);//定义一个区域 CBrush brush(RGB(0,0,0));//定义一个黑色的画刷 pDC->FrameRect(rc,&brush);//绘制矩形边框 //只是用来观察两者区别的,绘制一个矩形框 rc.OffsetRect(220,0);//移动区域 //下边是利用StretchBlt绘制的位图 BITMAP BitInfo;//定义位图结构 bmp.GetBitmap(&BitInfo);//获取位图信息 int x = BitInfo.bmWidth;//获取位图宽度 int y = BitInfo.bmHeight;获取位图高度 pDC->StretchBlt(rc.left,rc.top,rc.Width(),rc.Height(),&memDC,0,0,x,y,SRCCOPY);//绘制位图 pDC->FrameRect(rc,&brush);//绘制边框 brush.DeleteObject();//释放画刷 memDC.DeleteDC();//释放设备上下文 bmp.DeleteObject();//释放位图对象 }