调用SetDIBits修改位图内容 from http://blog.csdn.net/iamshuke/article/details/5749933

通过调用SetDIBits直接修改位图数据。下面的示例在黑色背景上画了一个十字。

 

  1. void CTest5Dlg::OnOK()   
  2. {  
  3.     // TODO: Add extra validation here  
  4.     CClientDC dc(this);  
  5.     CDC memDC;  
  6.     memDC.CreateCompatibleDC(&dc);  
  7.   
  8.     CBitmap bmp;  
  9.     bmp.CreateCompatibleBitmap(&dc, 300, 200);  
  10.     memDC.SelectObject(&bmp);  
  11.   
  12.     BITMAPINFO bmpInfo;  
  13.     bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);  
  14.     bmpInfo.bmiHeader.biWidth = 300;  
  15.     bmpInfo.bmiHeader.biHeight = -200;  
  16.     bmpInfo.bmiHeader.biPlanes = 1;  
  17.     bmpInfo.bmiHeader.biBitCount = 24;  
  18.     bmpInfo.bmiHeader.biCompression = BI_RGB;  
  19.     bmpInfo.bmiHeader.biSizeImage = 0;  
  20.     bmpInfo.bmiHeader.biXPelsPerMeter = 3000;  
  21.     bmpInfo.bmiHeader.biYPelsPerMeter = 3000;  
  22.     bmpInfo.bmiHeader.biClrUsed = 0;  
  23.     bmpInfo.bmiHeader.biClrImportant = 0;  
  24.       
  25.     long nLnBytes = (bmpInfo.bmiHeader.biWidth*3+3)/4*4;  
  26.     BYTE *pData = new BYTE[nLnBytes*abs(bmpInfo.bmiHeader.biHeight)];  
  27.       
  28.     //清成黑色  
  29.     memset(pData,0,nLnBytes*abs(bmpInfo.bmiHeader.biHeight));  
  30.   
  31.     //画一个十字  
  32.     for(int i=10; i<90; i++)  
  33.     {  
  34.         //横线, 黄色  
  35.         pData[50*nLnBytes+i*3+1] = 255; //g  
  36.         pData[50*nLnBytes+i*3+2] = 255; //r  
  37.   
  38.         //竖线, 蓝色  
  39.         pData[i*nLnBytes+50*3] = 255; //b  
  40.     }  
  41.   
  42.     SetDIBits(dc.m_hDC, bmp, 0, abs(bmpInfo.bmiHeader.biHeight), pData, &bmpInfo, DIB_RGB_COLORS);  
  43.   
  44.     delete []pData;  
  45.   
  46.     dc.BitBlt(0, 0, bmpInfo.bmiHeader.biWidth, abs(bmpInfo.bmiHeader.biHeight), &memDC, 0, 0, SRCCOPY);  
  47. }  

 

 效果图:

posted @ 2012-12-21 17:03  songtzu  阅读(620)  评论(0编辑  收藏  举报