WINCE双缓冲绘图 Win32和MFC

都要放在背景里搞~

 

Win32:

 

case WM_ERASEBKGND:
   {
    HDC hDC = (HDC)wParam;
    ShowPic(hDC);
   }

void ShowPic(HDC hDC)
{
 TCHAR strFileName[] = TEXT("//My Documents//我的图片//Flower.jpg");
 int size = 2;

 //设置缓冲区区域
 HDC hdcMem = CreateCompatibleDC(hDC);
 //加载图片区 todo: 判断图片加载是否成功
 //HBITMAP bitMap = SHLoadDIBitmap(strFileName);
 HBITMAP bitMap = SHLoadImageFile(strFileName);
 //将图片区加载到缓冲区,并保存原缓冲区图片区用于恢复缓存区
 HBITMAP oldBitMap = (HBITMAP)SelectObject(hdcMem, bitMap);
 //将缓冲区图片区内容赋给图片变量
 BITMAP bmp;
 GetObject(bitMap, sizeof(BITMAP), &bmp);


 //设置双缓冲区区域
 HDC hdcMemCatch = CreateCompatibleDC(hDC);
 //设置双缓冲区图片区域
 HBITMAP bitMapCatch=CreateCompatibleBitmap(hDC,240,320);
 //将图片区加载到双缓冲区 此时二者皆无值
 SelectObject(hdcMemCatch, bitMapCatch);

 
 //设置缩放大小
 if (0 == bmWidth && 0 == bmHeight)
 {
  bmWidth = bmp.bmWidth;
  bmHeight = bmp.bmHeight;
 }
 else if (bmWidth >= 2 && bmHeight >= 2)
 {
  if (0 == flag)
  {
   bmWidth /= size;
   bmHeight /= size;
  }
  else
  {
   bmWidth *= size;
   bmHeight *= size;
  }
 }

 //将缓冲区Copy到双缓冲区
 StretchBlt(hdcMemCatch, 0, 0, bmWidth, bmHeight, hdcMem, 0, 0,bmp.bmWidth, bmp.bmHeight, SRCCOPY);
 //用双缓冲区的值给设备区赋值
 BitBlt(hDC, 0, 0, 240,320, hdcMemCatch, 0, 0, SRCCOPY);
 //恢复缓冲区的值为加载图片前的值
 SelectObject(hdcMem, oldBitMap);
 DeleteDC(hdcMemCatch);
 DeleteDC(hdcMem);
}

 

MFC:

BOOL CPhotoViewerMFCDlg::OnEraseBkgnd(CDC* pDC)
{
 // TODO: 在此添加消息处理程序代码和/或调用默认值
 CDC *cDC=GetDC();
  
 TCHAR strFileName[] = TEXT("//My Documents//我的图片//Flower.jpg");
 int size = 20;

 CDC bitmapDC;
 bitmapDC.CreateCompatibleDC(cDC);
 CBitmap   bitmap;
 bitmap.Attach(SHLoadImageFile(strFileName));
 CBitmap* pOldBitmap = bitmapDC.SelectObject(&bitmap);
 BITMAP bmpInfo;
 bitmap.GetBitmap(&bmpInfo);
 

 CDC bitmapDCCatch;
 bitmapDCCatch.CreateCompatibleDC(NULL);
 CBitmap bitmapCatch;
 bitmapCatch.CreateCompatibleBitmap(cDC,240,320);
 bitmapDCCatch.SelectObject(&bitmapCatch);
 //bitmapDCCatch.FillSolidRect(0,0,240,320,RGB(255,255,255)); 

 //设置缩放大小
 if (0 == m_bmWidth && 0 == m_bmHeight)
 {
  m_bmWidth = bmpInfo.bmWidth;
  m_bmHeight = bmpInfo.bmHeight;
 }
 else if (m_bmWidth >= 2 && m_bmHeight >= 2)
 {
  if (0 == m_flag)
  {
   m_bmWidth -= size;
   m_bmHeight -= size;
  }
  else
  {
   m_bmWidth += size;
   m_bmHeight += size;
  }
 }

 bitmapDCCatch.StretchBlt(0, 0, m_bmWidth, m_bmHeight, &bitmapDC,
  0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, SRCCOPY);
 cDC->BitBlt(0, 0, 240, 320, &bitmapDCCatch,
  0, 0, SRCCOPY);

 bitmapDC.SelectObject(pOldBitmap);
 bitmap.DeleteObject();
 bitmapDCCatch.DeleteDC();
 bitmapDC.DeleteDC();
  
 //return CDialog::OnEraseBkgnd(cDC);
 return TRUE;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L_serein

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值