MFC中位图的显示

分析:

      首先,我们要明确一点,窗口的绘制包括两个步骤,首先:擦除窗口背景,然后再对窗口重新进行绘制;当擦除窗口背景时,程序会发生一个WM_ERASEBKGND消息,因此可以在此响应函数中完成位图的显示。代码如下:

 1 BOOL CGraphicView::OnEraseBkgnd(CDC* pDC)
 2 {
 3     // TODO: 在此添加消息处理程序代码和/或调用默认值
 4     CBitmap bitmap;
 5     bitmap.LoadBitmapA( IDB_BITMAP1 );
 6 
 7     BITMAP bmp;        
 8     bitmap.GetBitmap( &bmp );   // 该结构体bmp可以获取有关位图的信息
 9 
10 
11     CDC dcCompatible;
12     dcCompatible.CreateCompatibleDC( pDC );  // 创建与当前DC(pDC)兼容的DC
13     dcCompatible.SelectObject( &bitmap );
14 
15     CRect rect;
16     GetClientRect( &rect );
17 
18     /** 法一:将兼容DC中的位图复制到目的DC中,该函数是1:1复制的,不会伸缩和压缩位图;
19     pDC->BitBlt( 0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, SRCCOPY );
20     */
21     
22     // 法二:可以按照指定大小实现位图的伸缩和拉伸
23     pDC->StretchBlt( 0, 0, rect.Width(), rect.Height(), &dcCompatible, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY );
24 
25     // return CView::OnEraseBkgnd(pDC);   // 不要调用基类的方法,否则会擦除背景
26     return TRUE;
27 }

      上述代码是在窗口显示更新的第一步,即擦除窗口背景这一步实现位图的显示,在实现时,也可以在窗口显示更新的第二步,即重绘窗口时实现这个功能。即将上述代码放在OnDraw函数中实现,可以发现结果都是一样的,但是效果稍有差别,当窗口尺寸发送变化时,程序窗口会有闪烁现象,这是因为当窗口尺寸变化时,会引起窗口重绘操作,它会首先擦除背景,然后在OnDraw函数中再重新贴上位图,而第一种实现方式下,窗口闪烁比较小,因为我们没有擦除背景,而是直接贴上位图

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值