荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: 2.4 在窗口中绘制设备相关位图,图标,设备无关位图
发信站: 荔园晨风BBS站 (Wed May 30 01:09:23 2001), 转信

2.4 在窗口中绘制设备相关位图,图标,设备无关位图

在Windows中可以将预先准备好的图像复制到显示区域中,这种内存拷贝执行起来是非常
快的。在Windows中提供了两种使用图形拷贝的方法:通过设备相关位图(DDB)和设备
无关位图(DIB)。

DDB可以用MFC中的CBitmap来表示,而DDB一般是存储在资源文件中,在加载时只需要通
过资源ID号就可以将图形装入。BOOL CBitmap::LoadBitmap( UINT nIDResource )可以
装入指定DDB,但是在绘制时必须借助另一个和当前绘图DC兼容的内存DC来进行。通过C
DC::BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, in
t ySrc, DWORD dwRop )绘制图形,同时指定光栅操作的类型。BitBlt可以将源DC中位图
复制到目的DC中,其中前四个参数为目的区域的坐标,接下来是源DC指针,然后是源DC
中的起始坐标,由于BitBlt为等比例复制,所以不需要再次指定长宽,(StretchBlt可
以进行缩放)最后一个参数为光栅操作的类型,可取以下值:

BLACKNESS 输出区域为黑色   Turns all output black.
DSTINVERT 反色输出区域   Inverts the destination bitmap.
MERGECOPY 在源和目的间使用AND操作   Combines the pattern and the source bitm
ap using the Boolean AND operator.
MERGEPAINT 在反色后的目的和源间使用OR操作   Combines the inverted source bit
map with the destination bitmap using the Boolean OR operator.
NOTSRCCOPY 将反色后的源拷贝到目的区   Copies the inverted source bitmap to t
he destination.
PATINVERT 源和目的间进行XOR操作   Combines the destination bitmap with the p
attern using the Boolean XOR operator.
SRCAND 源和目的间进行AND操作   Combines pixels of the destination and source
 bitmaps using the Boolean AND operator.
SRCCOPY 复制源到目的区   Copies the source bitmap to the destination bitmap.

SRCINVERT 源和目的间进行XOR操作   Combines pixels of the destination and sou
rce bitmaps using the Boolean XOR operator.
SRCPAINT 源和目的间进行OR操作   Combines pixels of the destination and sourc
e bitmaps using the Boolean OR operator.
WHITENESS 输出区域为白色   Turns all output white.
下面用代码演示这种方法:
CYourView::OnDraw(CDC* pDC)
{
 CDC memDC;//定义一个兼容DC
 memDC.CreateCompatibleDC(pDC);//创建DC
 CBitmap bmpDraw;
 bmpDraw.LoadBitmap(ID_BMP);//装入DDB
 CBitmap* pbmpOld=memDC.SelectObject(&bmpDraw);//保存原有DDB,
并选入新DDB入DC
 pDC->BitBlt(0,0,20,20,&memDC,0,0,SRCCOPY);//将源DC中(0,0,20,20)
复制到目的DC(0,0,20,20)
 pDC->BitBlt(20,20,40,40,&memDC,0,0,SRCAND);//将源DC中(0,0,20,20)
和目的DC(20,20,40,40)中区域进行AND操作
 memDC.SelectObject(pbmpOld);//选入原DDB
}
(图标并不是一个GDI对象,所以不需要选入DC)在MFC中没有一个专门的图标类,因为
图标的操作比较简单,使用HICON CWinApp::LoadIcon( UINT nIDResource )或是HICON
 CWinApp::LoadStandardIcon( LPCTSTR lpszIconName ) 装入后就可以利用BOOL CDC:
:DrawIcon( int x, int y, HICON hIcon )绘制。由于在图标中可以指定透明区域,所
以在某些需要使用非规则图形而且面积不大的时候使用图标会比较简单。下面给出简单
的代码:

OnDraw(CDC* pDC)
{
 HICON hIcon1=AfxGetApp()->LoadIcon(IDI_I1);
 HICON hIcon2=AfxGetApp()->LoadIcon(IDI_I2);
 pDC->DrawIcon(0,0,hIcon1);
 pDC->DrawIcon(0,40,hIcon2);
 DestroyIcon(hIcon1);
 DestroyIcon(hIcon2);
}
同样在MFC也没有提供一个DIB的类,所以在使用DIB位图时我们需要自己读取位图文件中
的头信息, 并读入数据,并利用API函数StretchDIBits绘制。位图文件以BITMAPFILEH
EADER结构开始,然后是BITMAPINFOHEADER 结构和调色版信息和数据,其实位图格式是
图形格式中最简单的一种,而且也是Windows可以理解的一种。我不详细 讲解DIB位图的
结构,提供一个CDib类供大家使用,这个类包含了基本的功能如:Load,Save,Draw。

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店