解决位图失真-SetStretchBltMode

当用以下函数加载一张位图时,当窗口发生重绘更改大小时,位图将失真:


BOOL CGraphicView::OnEraseBkgnd(CDC* pDC)
{
  // TODO: Add your message handler code here and/or call default
  CBitmap bitmap;
  bitmap.LoadBitmap(IDB_BITMAP2);

  BITMAP bmp;
  bitmap.GetBitmap(&bmp);

  CDC dcCompatible;
  dcCompatible.CreateCompatibleDC(pDC);

  dcCompatible.SelectObject(&bitmap);

  CRect rect;
  GetClientRect(&rect);
  pDC-> SetStretchBltMode(COLORONCOLOR); //设置在指定设备内容中的伸展模式。解决失真问题。
    
  //pDC->BitBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY);
  pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&dcCompatible,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);

  return TRUE;
}

SetStretchBltMode函数设置在指定设备内容中的伸展模式。

int SetStretchBltMode(

  HDC hdc,           // DC的HANDLE

  int iStretchMode   // 位图伸展模式

);

Hdc:输入,设备内容的HANDLE

iStretchMode:输入,指定的伸展模式,参数可以下面值之一:


 描述


 
BLACKONWHITE


 执行一个布尔AND操作在要删除的存在的图素上。如果位图是一个单色位图,这个模式保留黑色的像素为白色的像素。


 
COLORONCOLOR


 删除像素,这个模式删除所有待删除的像素行,而不保留他们的信息。


 
HALFTONE


 从源矩形映射像素到指定的目标矩形。目标和源矩形的平均颜色是相似的。

在设置HALFTON伸展模式之后,应用程序必须调用SetBrushOrgEx函数来设置刷源。如果该调用失败了,刷子将不对齐。

This option is not supported on Windows 95/98/Me.


 
STRETCH_ANDSCANS


 Same as BLACKONWHITE.


 
STRETCH_DELETESCANS


 Same as COLORONCOLOR.


 
STRETCH_HALFTONE


 Same as HALFTONE.


 
STRETCH_ORSCANS


 Same as WHITEONBLACK.


 
WHITEONBLACK


 执行一个布尔或操作,使用待删除的存在的像素的颜色。如果位图是一个单色的位图,这个模式将保留白色的像素为黑色像素。


 

返回值:

如果函数成功,返回先前的伸展模式

如果失败,返回0

WINDOWS NT/2000/XP:使用GetLastError可以得到更多的信息,下面是其中之一:


 意义


 
ERROR_INVALID_PARAMETER


 一到多个参数无效


 


 


备注:

伸展模式定义了程序调用StretchBlt函数的时候怎么样在显示设备上用存在的像素合并位图行或列。

BLACKONWHITE (STRETCH_ANDSCANS)和WHITEONBLACK (STRETCH_ORSCANS)典型的用来保留单色位图的前景像素。COLORONCOLOR (STRETCH_DELETESCANS)模式通常用来保留彩色位图中的颜色。

HALFTONE相对较慢,并要求更多的源图象处理,但提供较高的图像质量。同样SetBrushOrgEx也不惜是HALFTON模式以免刷子不对齐。

另外,伸展模式也依赖于设备驱动器的能力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值