BitBlt函数用法

来源:互联网 发布:c语言do while的用法 编辑:程序博客网 时间:2024/05/23 10:09

BitBlt函数用法  

2010-03-05 10:25:51|  分类: VC学习|举报|字号 订阅

  下载LOFTER我的照片书  |

(一)

BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );

返回值:函数成功,返回非零值,否则为0。

参数: x 指定目标矩形左上角的逻辑x坐标。

y 指定目标矩形左上角的逻辑y坐标。

nWidth 指定目标矩形和源位图的宽度(逻辑单位)。

nHeight 指定目标矩形和源位图的高度(逻辑单位)。

pSrcDC 指向CDC对象的指针,标识待拷贝位图的设备上下文。假如dwRop指定不包括源的光栅操作,则它必须为NULL。

xSrc 指定源位图左上角的逻辑X坐标。

ySrc 指定源位图左上角的逻辑Y坐标。

dwRop 指定要执行的光栅操作。光栅操作代码定义GDC如何合并输出操作中的颜色,包括当前画刷、可能的源位图和目标位图。

下面对dwRop列出光栅操作代码及其描述:

BLACKNESS 所有输出变黑。

DSTINVERT 反转目标位图。

MERGECOPY 使用布尔AND操作符合并特征与源位图。

MERGEPAINT 使用布尔OR操作符合并特征与源位图。

NOTSRCCOPY 拷贝反转源位图到目标。

NOTSRCERASE 反转使用布尔OR操作符合并源和目标位图的结果。

PATCOPY 拷贝特征到目标位图。

PATINVERT 使用布尔XOR操作符合并目标位图和特征。

PATPAINT 使用布尔OR操作符合并反转源位图和特征。用布尔OR操作符合并这项操作结果与目标位图。

SRCAND 使用布尔AND操作符合并目标像素和源位图。

SRCCOPY 拷贝源位图到目标位图。

SRCERASE 反转目标位图并用布尔AND操作符合并这个结果和源位图。

SRCINVERT 使用布尔XOR操作符合并目标像素和源位图。

SRCPAINT 使用布尔OR操作符合并目标像素和源位图。

WHITENESS 所有输出变白。

有关光栅操作代码的完整列表,请参阅联机文档“Win32 SDK程序员参考”附录节中的“关于光栅操作代码”。

说明:

从源设备上下文拷贝位图到这个当前设备上下文。

应用可以在字节边界上对齐窗口或客户区域,保证BitBlt操作发生在以字节对齐的矩形上(登记窗口类时设置设备CS_BYTEALLGNWINDOW或CS_BYTEALIGHCLIENT标记)。

在字节对齐矩形上的BitBlt操作比未经字节对齐的矩形上的BitBlt操作快许多。假如想对自己的设备上下文指定字节对齐类风格,必须登记窗口类而不要依靠Microsoft基本类。可使用全局函数AfxRegisterWndClass。

一旦使用目标设备上下文和使用源设备上下文,GDI变形nWidth和nHeight。假如结果延伸不匹配,必要时GDI使用Windows StretchBlt函数压缩或拉伸源位图。

假如目标、源和特征位图颜色格式不同,BitBlt转换源和特征位图以匹配目标。转换中使用目标位图的前景和背景色。

BitBlt函数把单色位图转换为彩色时,它设置白色(1)为背景色,黑色(0)作为前景色。使用目标设备上下文的背景和前景色。要把彩色转换为单色,BitBlt把与背景色匹配的像素设置为白色,其余所有像素设置为黑色。在从彩色到单色的转换中,BitBlt使用彩色设备上下文的前景和背景色。

注重,并非所有的设备上下文都支持BitBlt。为检查给定设备上下文是否支持BitBlt,使用GetDeviceCaps成员函数并指定RASTERCAPS索引。

网友回复: CDC::BitBlt

MFC里面的,GDI第一个是目的DC,MFC里面的目的DC是....p,例如(p-> bitblt(...))

网友回复: pDC-> BitBlt(0, 0, rect.right, rect.bottom, &dc, 0, 0, SRCCOPY);

一般里面的参数用的不是很多,重要的就这几个.自己看看用.

网友回复: 给个例子看看吧:

void CDianChangView::OnDraw(CDC* pDC)

{

CDianChangDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

//显示欢迎界面

CBitmap bitmap;

bitmap.LoadBitmap(IDB_BITMAP_PIC);

BITMAP bmp;

bitmap.GetBitmap(&bmp);

CDC pCompatableDC;

pCompatableDC.CreateCompatibleDC(pDC);

pCompatableDC.SelectObject(&bitmap);

CRect rect;

GetClientRect(&rect);//选定绘图区域

pDC-> StretchBlt(0,0,rect.Width(),rect.Height(),

&pCompatableDC,0,0,bmp.bmWidth,

bmp.bmHeight,SRCCOPY);

}

 

 

实例二:

void MYBITMAP::Show(int x,int y)
{
 xpos=x;
 ypos=y;
 SelectObject(hdcsrc,hBm);
 BitBlt(hdcdest,xpos,ypos,width,height,hdcsrc,0,0,SRCCOPY); 
}

void MYBITMAP::ShowCenter(int y)
{
 xpos=(screenwidth-width)/2;
 ypos=y;

 SelectObject(hdcsrc,hBm);
 BitBlt(hdcdest,xpos,ypos,width,height,hdcsrc,0,0,SRCCOPY); 
}

void MYBITMAP::ShowLoop(int left,int top,int right,int bottom,int iframe)
{
 int i,j;

 SelectObject(hdcsrc,hBm);
 for(j=top;j<bottom;j+=height)
 {
  for(i=left;i<right;i+=width)
  {
   BitBlt(hdcdest,i,j,width,height,hdcsrc,iframe*width,0,SRCCOPY); 
  }
    //  BitBlt(hdcdest,,i,j,width,height,hdcsrc,iframe*width,0,SRCCOPY);
 }
}

void MYBITMAP::ShowNoBack(int x,int y,int iFrame)
{
 xpos=x;
 ypos=y;
 SelectObject(hdcsrc,hBm);
 BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,iFrame*width,height/2,SRCAND); 
 BitBlt(hdcdest,xpos,ypos,width,height/2,hdcsrc,iFrame*width,0,SRCPAINT);  
}

 

(二)

在VC中显示位图常用取BitBlt()方法,它是将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容。
今天要将一些位图显示到窗口中,所以学习了一下。
我已经将要用的位图导入到工程资源中,所以我可以用:
        CBitmap cbmp;
        cbmp.LoadBitmap(IDB_BMP1);
这样得到一个CBitmap对象。
然后:
        BITMAP bitmap;
        cbmp.GetBitmap(&bitmap);
这样得到一个BITMAP对象,之所以要得到此对象是因为从其中可以得到位图的大小数据。
然后计算得到要在什么位置显示此位图(可以放在一个CRect rect;对象中)。

然后显示此位图,这是最重要的一步:
         CDC dcMemory;
         dcMemory.CreateCompatibleDC(pDC);
         hOldBitmap = dcMemory.SelectObject(&cbmp);
          pDC->BitBlt(rect.left,
                             rect.top,
                             bitmap.bmWidth,
                             bitmap.bmHeight,
                             &dcMemory,
                             0,0,
                             SRCCOPY);
其中pDC是一个CDC*,是将要在其中显示位图的设备环境。

这样位图就已经显示出来了,但是还要释放资源:
        cbmp.DeleteObject();
        dcMemory.SelectObject(hOldBitmap);
        dcMemory.DeleteDC();
其中,要将临时设备环境选择入初始时位图,否则将不能正确释放!!

总结:
要在一个设备环境中显示位图,不能直接在上面“画”(目前我是我么觉得的),需要创建一个与之相兼容的新设备环境然后将位图选择入些新设备环境,然后再从些新设备环境中拷备位图以显示到正确的设备环境中。而选入这个动作相当与已经将位图“画在了临时设备环境中”(实际上并没有画,否则就可以直接选入要画图的CDC了),而且选入后位图在临时设备环境中的位置是左上角

BitBlt怎么转换一个单色位图到彩色位图,彩色位图怎么转换为单色位图的问题?

 When   the   BitBlt   function   converts   a   monochrome   bitmap   to   color,   it   sets   white   bits   (1)   to   the   background   color   and   black   bits   (0)   to   the   foreground   color.   The   foreground   and   background   colors   of   the   destination   device   context   are   used.   To   convert   color   to   monochrome,   BitBlt   sets   pixels   that   match   the   background   color   to   white   and   sets   all   other   pixels   to   black.   BitBlt   uses   the   foreground   and   background   colors   of   the   color   device   context   to   convert   from   color   to   monochrome.   
    
  在BitBlt的时候,一个单色的位图把是1的地方设置为背景色,而0为前景色,而转换彩色位图到单色位图的时候,BitBlt设置与背景色相同的象素为白色,而其他的颜色为黑色.BitBlt用背景色和前景色来处理单色位图与彩色位图间的问题.(
CDC::BitBlt的说明上,作为API的BltBit的文档上反而没有这段说明)

1 0
原创粉丝点击