win32 双缓存

基本代码:

 INT i;
 PAINTSTRUCT ps;
 HDC   hdc, hdcMem,hdcMemCopy;
 HBITMAP  hBmp, hBmpOld,hBmpCopy,hBmpCopyOld;
 HFONT   hFont,hOldFont;
 POINT  pt;

 hdc = BeginPaint(hWnd, &ps);
 
 hdcMem = CreateCompatibleDC(hdc);
 hdcMemCopy = CreateCompatibleDC(hdc);
 SetBkMode(hdcMem, TRANSPARENT);

 hBmpCopy = CreateCompatibleBitmap(hdc,BG_WIDTH,BG_HEIGHT);

 //Draw Main background

 hBmp = g_ExploreWallPaper;
 hBmpCopyOld = (HBITMAP)SelectObject(hdcMemCopy, hBmp);   
 hBmpOld = (HBITMAP)SelectObject(hdcMem,hBmpCopy);

 BitBlt(hdcMem,   0, 0,
     BG_WIDTH,
     BG_HEIGHT,
     hdcMemCopy, 0, 0,
     SRCCOPY);

 pt.x = ps.rcPaint.left ;
 pt.y = ps.rcPaint.top;

 SetTextColor(hdcMem, TITLE_COLOR);
 
 hFont = MyCreateFont(24,FW_HEAVY);
 hOldFont = (HFONT)SelectObject(hdcMem,hFont);

 DrawFileBrowseTitle(hdcMem);
 SelectObject(hdcMem,hOldFont);
 DeleteObject(hFont);

 hFont = MyCreateFont(LITTLE_FONT_SIZE,FW_NORMAL);
 SelectObject(hdcMem,hFont);
 
 for(i = 0;i < NORMAL_EXPLORE_DRAW_COUNT;i ++)
  Explore_DrawButton(hdcMem,hdcMemCopy,i,TRUE);
 #if (INTSON_APP_TYPE == INTSON_SEL_EBOOK)
 if(g_curFuncType == FUNCTION_EBOOK)
 {
  for(i = 0; i< BROWSE_NUMBER; i++)
  {
   if(m_ebookIndexInScreen == i)
    continue;
   DrawItemIcon(hdcMem,hdcMemCopy,i);
  }
  DrawItemIcon(hdcMem,hdcMemCopy,m_ebookIndexInScreen);
 }
  BitBlt(ps.hdc,   ps.rcPaint.left, ps.rcPaint.top,
         ps.rcPaint.right - ps.rcPaint.left,
      ps.rcPaint.bottom - ps.rcPaint.top,
      hdcMem, pt.x, pt.y,
      SRCCOPY);

 SelectObject(hdcMem,hOldFont);
 DeleteObject(hFont);

 SelectObject(hdcMem,hBmpOld);
 SelectObject(hdcMemCopy,hBmpCopyOld);

 DeleteObject(hBmpCopy);
 DeleteDC(hdcMemCopy);
 DeleteDC(hdcMem);  

 EndPaint(hWnd, &ps);

代码分析:

1 步踌:

 1) 创建内存dc:hdcMem, hdcMemcopy,为什么我门要创建两个在以上的代码中,原因是:一个全屏显示的也面中,可能有不同图片组成,如何把在同一个页面中的所有图片合成一张图片,第一个hdcMem就是一整张图片,hdcMemcopy就将不同的图片数据写入到hdcMem中。

2) 创建一个空的bitmap 大小跟屏幕大小一致, hBmpCopy = CreateCompatibleBitmap(hdc,BG_WIDTH,BG_HEIGHT);
3) 将数据写入内存dc :  BitBlt(hdcMem,   0, 0, BG_WIDTH,BG_HEIGHT, hdcMemCopy, 0, 0,SRCCOPY);hdcMemCopy 里面数据的来源是通过: hBmpCopyOld = (HBITMAP)SelectObject(hdcMemCopy, hBmp)得到 。

4) 将内存dc的数据显示出来: BitBlt(ps.hdc,   ps.rcPaint.left, ps.rcPaint.top,  ps.rcPaint.right - ps.rcPaint.left, ps.rcPaint.bottom,ps.rcPaint.top,hdcMem, pt.x, pt.y,SRCCOPY);

5) 恢复设备dc

6) 删除资源。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值