现在的位置: 首页 > 综合 > 正文

利用双缓冲技术将位图像素数据写到DIB位图中并在指定的窗口显示(主要使用CreateDIBSection和BitBlt方法)

2013年08月18日 ⁄ 综合 ⁄ 共 1300字 ⁄ 字号 评论关闭

至于为什么要使用双缓冲技术,大家可以查阅相关的资料,这里我只提一点,就是解决屏幕刷新频繁导致闪烁的问题。

下面是相关的代码实现:(这里我保存的DIB位图的大小为320*240,深度为24位)

  1. void SaveToBmpAndBlend(BYTE *buffer)  
  2. {  
  3.     HDC hdc;  
  4.     //获取屏幕显示DC          
  5.     hdc = GetDC(m_hWnd);  
  6.     //创建内存DC  
  7.     HDC hdcMem = CreateCompatibleDC(hdc);  
  8.     //创建一个bmp内存空间  
  9.     HBITMAP hBmp;  
  10.       
  11.     BITMAPINFO bmpinfo;  
  12.     bmpinfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);  
  13.     bmpinfo.bmiHeader.biWidth=320;  
  14.     bmpinfo.bmiHeader.biHeight=240;  
  15.     bmpinfo.bmiHeader.biPlanes=1;  
  16.     bmpinfo.bmiHeader.biBitCount=24;  
  17.     bmpinfo.bmiHeader.biCompression=BI_RGB;  
  18.     bmpinfo.bmiHeader.biSizeImage=320*240*3;  
  19.     bmpinfo.bmiHeader.biXPelsPerMeter=0;  
  20.     bmpinfo.bmiHeader.biClrImportant=0;  
  21.     bmpinfo.bmiHeader.biClrUsed=0;  
  22.     BYTE* pDibs = NULL;  
  23.         //需要注意,当第5个参数为NULL时,PDibs指向的是一块新申请的内存,需要在外部将缓冲数据复制到这块新内存中。  
  24.     hBmp=CreateDIBSection(hdcMem,&bmpinfo,DIB_RGB_COLORS,(void**) &pDibs,NULL,0);  
  25.     for (int i=0;i<320*240*3;i++)  
  26.     {  
  27.         pDibs[i]=buffer[i];  
  28.           
  29.     }  
  30.     //将bmp内存空间分配给内存DC  
  31.     HGDIOBJ hOldSel = SelectObject(hdcMem,hBmp);  
  32.     //将内存DC的内容复制到屏幕显示DC中,完成显示  
  33.     BitBlt(hdc,0,0,320,240,hdcMem,0,0,SRCCOPY);//SRCCOPY 完全覆盖  
  34.     //清除资源  
  35.     SelectObject(hdcMem,hOldSel);      
  36.     DeleteDC(hdcMem);   
  37.     ReleaseDC(m_hWnd, hdc);  
  38. }  


抱歉!评论已关闭.