CDC::PatBlt 函数详解。

来源:互联网 发布:广东省网络问政的现状 编辑:程序博客网 时间:2024/05/17 22:11

 

PatBlt

  函数功能:该函数使用当前选入指定设备环境中的刷子绘制给定的矩形区域。通过使用给出的光栅操作来对该刷子的颜色和表面颜色进行组合。

 
  函数原型:BOOL PatBlt(HDC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, DWORD dwRop);

  参数:
  hdc:设备环境句柄。
  nXLeft:指定要填充的矩形左上角的X轴坐标,坐标按逻辑单位表示。
  nYLeft:指定要填充的矩形左上角的Y轴坐标,坐标按逻辑单位表示。
  nWidth:指定矩形的宽度,按逻辑单位表示宽度。
  nHeight:指定矩形的高度,按逻辑单位表示高度。
  dwRop:指定光栅操作码。该操作码可以取下列值,这些值的含义如下:
  PATCOPY:将指定的模式拷贝到目标位图中。
  PATINVERT:使用布尔OR(或)操作符将指定模式的颜色与目标矩形的颜色进行组合。
  DSTINVERT:将目标矩形反向。
  BLACKNESS:使用物理调色板中与索引0相关的颜色填充目标矩形。(对于缺省的物理调色板而言,该颜色为黑色)。
  WHITENESS:使用物理调色板中与索引1有关的颜色来填充目标矩形。(对于缺省的物理调色板而言,该颜色为白色)。
  返回值:如果函数执行成功,则返回值为非零;如果函数执行失败,则返回值为0。
  Windows NT:若想获得更多错误信息,请调用GetLastError函数。
  备注:该函数的参数dwRop取值限定为全部256个三元光栅操作有限子集。特别地,涉及源矩形的操作码不能使用。
  并非所有设备都支持PalBlt函数。有关更多的信息,请参考函数GetDeviceCaps中有关RC_BITBLT特性的描述。

 
 
 

BitBlt

  函数功能:该函数对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。
  函数原型:BOOL BitBlt(HDC hdcDest,int nXDest,int nYDest,int nWidth,int nHeight,HDC hdcSrc,int nXSrc,int nYSrc,DWORD dwRop);
  参数:
  hdcDest:指向目标设备环境的句柄。
  nXDest:指定目标矩形区域左上角的X轴逻辑坐标。
  nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。
  nWidth:指定源和目标矩形区域的逻辑宽度。
  nHeight:指定源和目标矩形区域的逻辑高度。
  hdcSrc:指向源设备环境的句柄。
  nXSrc:指定源矩形区域左上角的X轴逻辑坐标。
  nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。
  dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
  下面列出了一些常见的光栅操作代码:
  BLACKNESS:表示使用与物理调色板的索引0相关的色彩来填充目标矩形区域,(对缺省的物理调色板而言,该颜色为黑色)。
  DSTINVERT:表示使目标矩形区域颜色取反。
  MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。
  MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。
  NOTSRCCOPY:将源矩形区域颜色取反,于拷贝到目标矩形区域。
  NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值,然后将合成的颜色取反。
  PATCOPY:将特定的模式拷贝到目标位图上。
  PATPAINT:通过使用布尔OR(或)操作符将源矩形区域取反后的颜色值与特定模式的颜色合并。然后使用OR(或)操作符将该操作的结果与目标矩形区域内的颜色合并。
  PATINVERT:通过使用XOR(异或)操作符将源和目标矩形区域内的颜色合并。
  SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。
  SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
  SRCERASE:通过使用AND(与)操作符将目标矩形区域颜色取反后与源矩形区域的颜色值合并。
  SRCINVERT:通过使用布尔型的XOR(异或)操作符将源和目标矩形区域的颜色合并。
  SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。
  WHITENESS:使用与物理调色板中索引1有关的颜色填充目标矩形区域。(对于缺省物理调色板来说,这个颜色就是白色)。
  返回值:如果函数成功,那么返回值非零;如果函数失败,则返回值为零。
  Windows NT:若想获取更多错误信息,请调用GetLastError函数。
  备注:如果在源设备环境中可以实行旋转或剪切变换,那么函数BitBlt返回一个错误。如果存在其他变换(并且目标设备环境中匹配变换无效),那么目标设备环境中的矩形区域将在需要时进行拉伸、压缩或旋转。
  如果源和目标设备环境的颜色格式不匹配,那么BitBlt函数将源场景的颜色格式转换成能与目标格式匹配的格式。当正在记录一个增强型图元文件时,如果源设备环境标识为一个增强型图元文件设备环境,那么会出现错误。如果源和目标设备环境代表不同的设备,那么BitBlt函数返回错误。
  Windows CE:在Windows CE 1.0版中,参数dwRop只可以指定为下列值:SRCCOPY、SRCAND、SRCPAINT、SRCINVERT。在Windows CE 2.0版中,参数dwRop可以是任何光栅操作代码值。

Invalidate

  void Invalidate( BOOL bErase = TRUE );

 
  该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PAINT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由OnDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。

 
  它和 UpdateWindow( )区别在于:
  UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。
 
 


 

OnPaint()与OnEraseBkgnd()区别与联系

 

 

 

在MFC中 任何一个window组件的绘图 都是放在这两个member function中

在设定上 OnEraseBkgnd()是用来画底图的 而OnPaint()是用来画主要对象的

举例说明 一个按钮是灰色的 上面还有文字

则OnEraseBkgnd()所做的事就是把按钮画成灰色

而OnPaint()所做的事就是画上文字

 

既然这两个member function都是用来画出组件的

那为何还要分OnPaint() 与 OnEraseBkgnd() 呢

其实OnPaint() 与 OnEraseBkgnd() 特性是有差的:

1.         OnEraseBkgnd()的要求是快速 在里面的绘图程序最好是不要太耗时间因为每当window组件有任何小变动 都会马上呼叫OnEraseBkgnd()

2.         OnPaint() 是只有在程序有空闲的时候才会被呼叫

3.         OnEraseBkgnd() 是在 OnPaint() 之前呼叫的

所以 OnPaint()被呼叫一次之前 可能会呼叫OnEraseBkgnd()好几次

如果我们是一个在做图形化使用者接口的人,常需要把一张美美的图片设为我们dialog的底图,把绘图的程序代码放在OnPaint() 之中,可能会常碰到一些问题,比方说拖曳一个窗口在我们做的dialog上面一直移动,则dialog会变成灰色直到动作停止才恢复,这是因为每次需要重绘的时候 程序都会马上呼叫OnEraseBkgnd(), OnEraseBkgnd()就把dialog画成灰色而只有动作停止之后 程序才会呼叫OnPaint() 这时才会把我们要画的底图贴上去这个问题的解法 比较差点的方法是把OnEraseBkgnd() 改写成不做事的function如下所示:

BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)

{

     return TRUE;

}

以上本来是会呼叫CDialog::OnEraseBkgnd() 但是如果我们不呼叫的话程序便不会画上灰色的底色了比较好的做法是直接将绘图的程序从OnPaint()移到OnEraseBkgnd()来做如下所示:

// m_bmpBKGND 為一CBitmap物件且事先早已載入我們的底圖

// 底圖的大小與我們的視窗client大小一致

BOOL CMyDlg::OnEraseBkgnd(CDC* pDC)

{

     CRect rc;

     GetUpdateRect(&rc);

     CDC srcDC;

     srcDC.CreateCompatibleDC(pDC);

     srcDC.SelectObject(m_bmpBKGND);

 

     pDC->BitBlt(rc.left,rc.top,rc.GetWidth(),

          rc.GetHeight(),&srcDC,rc.left,rc.top,SRCCOPY);

     return TRUE;

}


 

      每当重新绘画窗口的一个无效区域时,Windows就给窗口传递一条WM_ERASEBKGND消息。当窗口没有处理给消息时,DefWindowProc()就自动擦除窗口的背景,使用的是与该窗口关联的WNDCLASS结构中的hbrBackground字段确定的刷子。

      这样,在自己的代码中处理WM_ERASEBKGND消息,我们可以动态的选择窗口背景的颜色。