最近在做图像采集的工作,需要处理图像数据,所以学习了一下位图显示,而且只看了设备相关位图DDB。基本上实现了位图的显示、位图数据的处理等功能。这里就记录一下我自己的理解,不一定全都对,仅供参考而已。

要显示位图,需要做如下工作:

CStatic* pStatic=(CStatic*)GetDlgItem(IDC_DISPLAY2);
CDC* pDC=pStatic->GetDC();
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP2);
BITMAP bmp;
bitmap.GetBitmap(&bmp);
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);

dcCompatible.SelectObject(&bitmap);
CRect rect;
pStatic->GetClientRect(&rect);

pDC->StretchBlt(0,0,rect.Width(),rect.Height(), &dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

程序中,创建了一个位图对象bitmap,bitmap.LoadBitmap(IDB_BITMAP2);将一幅位图加载到了bitmap这个对象中,按我的理解,这个对象是存在在内存中的,所以我们对这个对象的操作并不会对原来那幅位图有什么影响。另外,还定义了一个BITMAP结构:bmp。之所以定义这个结构,是为了获得位图的宽度、高度等图像信息,如果我们知道加载的位图的高度、宽度、一个像素占多少字节等信息,那么我们无需定义这个bmp结构,不过为了方便,还是定义一个的好。要显示位图,还要创建与当前DC兼容的DC,当前DC怎么获得?就是下面这两句:

CStatic* pStatic=(CStatic*)GetDlgItem(IDC_DISPLAY2);
CDC* pDC=pStatic->GetDC();

我要将位图在对话框中的静态文本控件中显示,因此定义了一个指向静态CStatic对象的指针,这样,当前DC就需要使用pStatic->GetDC();来获取。然后创建一个与当前DC兼容的DC: dcCompatible.CreateCompatibleDC(pDC);。这个DC创建了之后,就把内存中的位图对象bitmap选入这个DC:dcCompatible.SelectObject(&bitmap);,从而确定这个兼容DC的显示表面的大小。这里要搞清楚一个关系。做了以上各步骤之后,其实与那个位图对象已经没多少关系了,bitmap这个位图对象的相关信息已经在dcCompatible这个保存着了,而要显示的目标区域则由当前DC:pDC所指示出来,这也就是为什么要创建兼容DC,只有两个DC兼容,才能顺利的把图像从dcCompatible复制到pDC中进行显示。我们看到最后的那句

pDC->StretchBlt(0,0,rect.Width(),rect.Height(), &dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

实际上就是起到将dcCompatible中的图像在pDC的区域上显示的作用。这句话中还有有一个参数rect,它是一个CRect对象,用来得到客户区的大小,也就是我们所要显示的区域的大小,在这里也就是静态文本框,一个矩形的区域,所以调用pStatic的成员函数GetClientRect()来获取客户区域。

这样,一幅位图就显示了出来。上述这段程序是对话框中的一个按钮的响应函数。我之前看到有人说,要把画图程序放在OnDraw或者OnPaint之类的函数中去。我觉得其实放在哪里都无所谓,只要知道了要显示位图需要计算机做什么工作,就能顺利将位图显示出来。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐