void CClientDlg::OnOK() 
{
CDC* pDeskDC =  GetDesktopWindow()->GetDC(); //获取桌面画布对象
CRect rc;
GetDesktopWindow()->GetClientRect(rc); //获取屏幕的客户区域 int width  = 300; //获取屏幕的宽度
int height = 300; //获取屏幕的高度 CDC  memDC; //定义一个内存画布
memDC.CreateCompatibleDC(pDeskDC); //创建一个兼容的画布
CBitmap bmp;
bmp.CreateCompatibleBitmap(pDeskDC,width,height); //创建兼容位图
memDC.SelectObject(&bmp); //选中位图对象

BITMAP bitmap;
bmp.GetBitmap(&bitmap);

int panelsize  = 0; //记录调色板大小
if (bitmap.bmBitsPixel<16) //判断是否为真彩色位图
panelsize = pow(2,bitmap.bmBitsPixel*sizeof(RGBQUAD)); BITMAPINFO *pBInfo = (BITMAPINFO*)LocalAlloc(LPTR,sizeof(BITMAPINFO)+panelsize);
pBInfo->bmiHeader.biBitCount = bitmap.bmBitsPixel;
pBInfo->bmiHeader.biClrImportant  = 0;
pBInfo->bmiHeader.biCompression   = 0;
pBInfo->bmiHeader.biHeight        = height;
pBInfo->bmiHeader.biPlanes        = bitmap.bmPlanes;
pBInfo->bmiHeader.biSize          = sizeof(BITMAPINFO);
pBInfo->bmiHeader.biSizeImage     = bitmap.bmWidthBytes*bitmap.bmHeight;
pBInfo->bmiHeader.biWidth         = width;
pBInfo->bmiHeader.biXPelsPerMeter = 0;
pBInfo->bmiHeader.biYPelsPerMeter = 0;
m_X = m_RecvX;
m_Y = m_RecvY;
memDC.BitBlt(0,0,width,height,pDeskDC,m_X,m_Y,SRCCOPY);
char* pData = new char[bitmap.bmWidthBytes* bitmap.bmHeight];
::GetDIBits(memDC.m_hDC,bmp,0,bitmap.bmHeight,pData,pBInfo,DIB_RGB_COLORS); int BufSize = panelsize+ sizeof(BITMAPINFO)+bitmap.bmWidthBytes* bitmap.bmHeight; memcpy(pSendBuf,pBInfo,sizeof(BITMAPINFO));
char* pHead = pSendBuf;
pSendBuf += sizeof(BITMAPINFO);
memcpy(pSendBuf,pData,bitmap.bmWidthBytes* bitmap.bmHeight); pSendBuf = pHead; addr1.sin_family = AF_INET;
addr1.sin_port   = htons(5002);
addr1.sin_addr.S_un.S_addr = inet_addr(m_ServerIP);
//定义数据报的格式
/*序号2位||结记束标2位||位图数据||位图数据大小4位||屏幕X坐标2位||屏幕Y坐标2位||数据报大小4位*/ //定义每次发送位图数据的大小
bmpsize = GraphSize;
//计算每个位图发送的次数
count = BufSize / GraphSize;
mod   = BufSize % GraphSize;
if ( mod != 0)
count+=1; m_FrameIndex = 0;
int ret = SendData(m_FrameIndex,mod,bmpsize,count,pSendBuf,addr1); pSendBuf = pHead;
delete []pData;
LocalFree(pBInfo); pDeskDC->DeleteDC();
bmp.DeleteObject();
memDC.DeleteDC();
}
问题:
1。
其中有三句: CBitmap bmp; 
BITMAP bitmap;
bmp.GetBitmap(&bitmap);
bitmap只是个声明,没有东西,为什么bmp可以得到位图的信息呢
2。
int panelsize  = 0;//记录调色板大小
if (bitmap.bmBitsPixel<16)//判断是否为真彩色位图
这两句的意思是什么
3。
BITMAPINFO 结构体的第二个参数RGBQCAD bmiColors[1]不是调色板吗,为什么还要多加一个调色板panelsize
注意:
本人做一个远程监控,是个菜鸟
希望各位高手能讲的详细一点,考虑一下我的接受能力
谢谢

解决方案 »

  1.   

    1 BITMAP bitmap; 
    bmp.GetBitmap(&bitmap); 这个是获取bmp的信息,具体看msdn2、int panelsize  = 0;//记录调色板大小 
    if (bitmap.bmBitsPixel <16)//判断是否为真彩色位图 第二句是判断是否是16位位图,大于16位才是真彩色的3。 
    BITMAPINFO 结构体的第二个参数RGBQCAD bmiColors[1]不是调色板吗,为什么还要多加一个调色板panelsize 
    有调色板当然要填写size
      

  2.   


    1、
    BITMAP bitmap; 
    bmp.GetBitmap(&bitmap); bitmap是个结构体好不好,里面保存着相关的信息2、int panelsize  = 0;//记录调色板大小 
    if (bitmap.bmBitsPixel <16)//判断是否为真彩色位图 判断是不是16位位图,大于16位才是真彩色的 3、
    BITMAPINFO 结构体的第二个参数RGBQCAD bmiColors[1]不是调色板吗,为什么还要多加一个调色板panelsize 调色板难道不需要大小尺寸?后面的缓冲区大小也要依赖它的