想用UDP传送位图。因此想知道位图的那些必要信息是要传送的。我就写了一个测试程序。
(1)自定义了一副位图,通过GetDIBits是可以得到位图的实际数据
void CDeskTopDlg::OnButton3() 
{
// TODO: Add your control notification handler code here
CClientDC dc(this); CBitmap bm; 
bm.LoadBitmap(IDB_BITMAP1);
BITMAP bmpInfo; 
bm.GetBitmap(&bmpInfo); 
char *lpBits = NULL; 
int biSizeImage = bmpInfo.bmWidthBytes * bmpInfo.bmHeight; //计算位图数据需要多少字节 
lpBits =new char[biSizeImage];
bm.GetBitmapBits(biSizeImage, lpBits);//获取位图的实际数据 

BITMAPINFO   BitmapInfo; 
BitmapInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
BitmapInfo.bmiHeader.biWidth=bmpInfo.bmWidth;    
BitmapInfo.bmiHeader.biHeight=bmpInfo.bmHeight;    
BitmapInfo.bmiHeader.biPlanes=1;    
BitmapInfo.bmiHeader.biBitCount=32;//这里是位图的颜色位数,如果你的位图不是真彩色的,也就是小于等于8位,那就麻烦了,你还要编程实现BitmapInfo.bmiColors结构,所以建议将位图设计成真彩色的,不要吝惜那点空间! 
BitmapInfo.bmiHeader.biCompression=BI_RGB;    
BitmapInfo.bmiHeader.biClrUsed=0;   
BitmapInfo.bmiHeader.biSizeImage=0;    
BitmapInfo.bmiHeader.biXPelsPerMeter=0;    
BitmapInfo.bmiHeader.biYPelsPerMeter=0;    
BitmapInfo.bmiHeader.biClrImportant=0;

CRect rc;
GetDlgItem(IDC_DT)->GetWindowRect(&rc);
ScreenToClient(&rc);
StretchDIBits(dc.m_hDC,rc.left,rc.top+rc.Height(),rc.Width(),-rc.Height(), 
0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,lpBits,&BitmapInfo,DIB_RGB_COLORS,SRCCOPY);

delete [] lpBits;
}
(2)但是当我用获取桌面的位图时就不能正确显示位图了,而是全黑色。为了做对比,放置了两个picture控件,一个可以正常显示 StretchBlt,另一个全是黑色GetDIBits。我调试查看信息发现执行GetDIBits语句后,pData指向的内容全是0
CClientDC  dc(this); CDC* pDeskDC =  GetDesktopWindow()->GetDC(); //获取桌面画布对象
int width  = 1440; //获取屏幕的宽度
int height = 900;

CDC  memDC; //定义一个内存画布
memDC.CreateCompatibleDC(&dc);//创建一个兼容的画
CBitmap bmp;
// bmp.LoadBitmap(IDB_BITMAP1);
bmp.CreateCompatibleBitmap(pDeskDC,width,height); //创建兼容位图
memDC.SelectObject(&bmp); //选中位图对象

BITMAP bitmap;
bmp.GetBitmap(&bitmap);
CRect rc;
GetDlgItem(IDC_DT)->GetWindowRect(&rc);
ScreenToClient(&rc);
dc.StretchBlt(rc.left,rc.top,rc.Width(),rc.Height(),pDeskDC,0,0,bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);//显示桌面位图正常
//////////////////////////////////////////////////////////
//定义位图信息
BITMAPINFO   BInfo; 
BInfo.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
BInfo.bmiHeader.biWidth=bitmap.bmWidth;    
BInfo.bmiHeader.biHeight=bitmap.bmHeight;    
BInfo.bmiHeader.biPlanes=1;    
BInfo.bmiHeader.biBitCount=32;//这里是位图的颜色位数,如果你的位图不是真彩色的,也就是小于等于8位,那就麻烦了,你还要编程实现BitmapInfo.bmiColors结构,所以建议将位图设计成真彩色的,不要吝惜那点空间! 
BInfo.bmiHeader.biCompression=BI_RGB;    
BInfo.bmiHeader.biClrUsed=0;   
BInfo.bmiHeader.biSizeImage=0;    
BInfo.bmiHeader.biXPelsPerMeter=0;    
BInfo.bmiHeader.biYPelsPerMeter=0;    
BInfo.bmiHeader.biClrImportant=0;
//定义一个位图数据指针
char* pData = new char[bitmap.bmWidthBytes*bitmap.bmHeight];
::GetDIBits(memDC.m_hDC,bmp,0,bitmap.bmHeight,pData,&BInfo,DIB_RGB_COLORS); CRect rc2;
GetDlgItem(IDC_DT2)->GetWindowRect(&rc2);
ScreenToClient(&rc2); int ret = StretchDIBits(dc.m_hDC,rc2.left,rc2.top+rc2.Height(),rc2.Width(),-rc2.Height(), 
0,0,bitmap.bmWidth,bitmap.bmHeight,pData,&BInfo,DIB_RGB_COLORS,SRCCOPY);//显示桌面位图不正常

解决方案 »

  1.   

    你说显示桌面时全是黑色,我想问题可能在这里:
    CDC memDC; //定义一个内存画布
    memDC.CreateCompatibleDC(&dc);//创建一个兼容的画
    CBitmap bmp;
    // bmp.LoadBitmap(IDB_BITMAP1);
    bmp.CreateCompatibleBitmap(pDeskDC,width,height); //创建兼容位图
    memDC.SelectObject(&bmp); //选中位图对象
    //应该再用BitBlt把桌面上的内容复制到memDC
    memDC.BitBlt(..., pDeskDC,..);
      

  2.   

    我这样加的
    CDC memDC; //定义一个内存画布
    memDC.CreateCompatibleDC(&dc);//创建一个兼容的画
    CBitmap bmp;
    // bmp.LoadBitmap(IDB_BITMAP1);
    bmp.CreateCompatibleBitmap(pDeskDC,width,height); //创建兼容位图
    memDC.SelectObject(&bmp); //选中位图对象memDC.BitBlt(0,0,width,height, pDeskDC,width,height,SRCCOPY);还是不行。。
      

  3.   

    http://blog.csdn.net/VisualEleven/archive/2010/12/23/6093484.aspx