VC有没有在屏幕寻找颜色获得坐标的函数

解决方案 »

  1.   

    先用BitBlt拍屏转换为CBitmap对象,然后对位图操作。
    BitBlt一般用法是将物理内存的内容绘制到屏幕,如果把那两个参数反一下,就将屏幕内存的内容绘制到了物理内存,即排屏的基本原理
      

  2.   

    /***********************************************************
    编写人:Ivy
    功  能:将屏幕内存复制到物理内存
    参  数:无
    返回值:HBITMAP 复制到物理内存的位图信息
    ************************************************************/
    HBITMAP CScrnCapture::CopyScreenToBitmap() 

    // 屏幕内存和物理内存
    HDC hScrDC, hMemDC; 
    // 位图句柄 
    HBITMAP hBitmap, hOldBitmap; 
    // 位图宽度和高度 
    int nWidth, nHeight;  //为屏幕创建设备描述表 
    hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL); //为屏幕设备描述表创建兼容的内存设备描述表 
    hMemDC = CreateCompatibleDC(hScrDC);  // 获得屏幕的宽度和高度,作为位图的宽度和高度 
    nWidth = GetDeviceCaps(hScrDC, HORZRES); 
    nHeight = GetDeviceCaps(hScrDC, VERTRES);  // 创建一个与屏幕设备描述表兼容的位图 
    hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);  // 把新位图选到内存设备描述表中 
    hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);  // 把屏幕设备描述表拷贝到内存设备描述表中 
    BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, 0, 0, SRCCOPY);  //得到屏幕位图的句柄 
    hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);  //清除 
    DeleteDC(hScrDC); 
    DeleteDC(hMemDC);  // 返回位图句柄 
    return hBitmap; 
    }
      

  3.   

    下面将hBitmap转为字节数组的函数是从别人那里拷贝来的:
    BOOL CScrnCapture::SaveBitmap(HBITMAP hBitmap , CString FileName) 
    {
        BITMAP bm;
        BITMAPINFO bmInfo;
        BITMAPINFOHEADER *bmHeadInfo;
        BITMAPFILEHEADER bmFileHead;
        int width,height,bits,bmSize;
        BYTE *lpbmBits; //得到位图头信息指针
        bmHeadInfo=&(bmInfo.bmiHeader);
        if(hBitmap)
        {
    //得到对象
            GetObject(hBitmap,sizeof(BITMAP),&bm); //位图宽度和高度
            width=bm.bmWidth;
            height=bm.bmHeight; //色深
            bits=bm.bmBitsPixel;
            if(bits>=16) //RGB系统
            {
    //将宽度补成4的倍数
                width*=3;
                bits=width%4;
    width+=bits;
    //计算位图尺寸
                bmSize=height*width;            //填充位图文件头信息
                bmFileHead.bfSize=sizeof(bmFileHead)+sizeof(BITMAPINFO)+bmSize;
                bmFileHead.bfType=(WORD)(('M'<<8)|'B');     // it must be "BM"
                bmFileHead.bfReserved1=0;                   //must be 0
                bmFileHead.bfReserved2=0;                   //must be 0
                bmFileHead.bfOffBits=sizeof(bmFileHead)+sizeof(BITMAPINFOHEADER);  //the bitmap bits offset.            //填充位图头信息
                memset(&bmInfo,0,sizeof(bmInfo));
                bmHeadInfo->biSize=sizeof(BITMAPINFOHEADER);
                bmHeadInfo->biBitCount=24;                    //24bits color. I only support this in this version.
                bmHeadInfo->biHeight=height;
                bmHeadInfo->biWidth=bm.bmWidth;
                bmHeadInfo->biCompression=BI_RGB;             //not compressed.
                bmHeadInfo->biPlanes=1;                       //must be 1.
                lpbmBits=new BYTE[bmSize];              //allocate the memory.            //将位图字节拷贝进缓冲区
                GetDIBits(GetDC(NULL),hBitmap,0,height,lpbmBits,&bmInfo,DIB_RGB_COLORS);            //字节已存入lpbmBits,做你想做的就行了            delete []lpbmBits;
            }
            else
            {
                //AfxMessageBox("256 colors or lower is not supported.");
            }
        } return TRUE;
    }