求解CreateDIBSection函数的第四个参数

CHAR BindBack(HWND Hwnd)//连接窗口
{
    /*--------------------------------------------*/
    DeleteDC(MemoryDCDIB);
    ReleaseDC(GratingHWND, EqualpmentDCIntercept);
    ReleaseDC(NULL, EqualpmentDCIntercept);

    /*----------------------------------------------    */
    if (Hwnd)
    {

        GratingHWND = Hwnd;
        GetWindowRect(GratingHWND, &GratingHWNDXY);
        GratingHWNDW = GratingHWNDXY.right - GratingHWNDXY.left;
        GratingHWNDH = GratingHWNDXY.bottom - GratingHWNDXY.top;
    }
    EqualpmentDCIntercept = GetDC(GratingHWND);
    MemoryDCDIB = CreateCompatibleDC(0);
    return 0;

}
VOID SetIntercept(WORD InterceptX, WORD InterceptY, WORD InterceptW, WORD InterceptH)
{

    DeleteObject(HDIBITMAP);
    GratingInterceptX = InterceptX;
    GratingInterceptY = InterceptY;
    GratingInterceptW = InterceptW;
    GratingInterceptH = InterceptH;
    单行存储字节 = GratingInterceptW * 4;
    /*-----------初始化虚拟位图----------------------------*/
    DIBITMAPINFO = {0 };
    DIBITMAPINFO.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); 
    DIBITMAPINFO.bmiHeader.biWidth = GratingInterceptW;
    DIBITMAPINFO.bmiHeader.biHeight = -GratingInterceptH;
    DIBITMAPINFO.bmiHeader.biPlanes = 1;
    DIBITMAPINFO.bmiHeader.biBitCount = 32;
    DIBITMAPINFO.bmiHeader.biCompression = BI_RGB;
    DIBITMAPINFO.bmiHeader.biSizeImage = GratingInterceptW * 4 * GratingInterceptH;
    DIBITMAPINFO.bmiHeader.biClrImportant = 0;
    DIBITMAPINFO.bmiHeader.biClrUsed = 0;
    /*创建一个与设备无关的DIB位图,此时是一个空画布,显存指针的顺序是RGBA*/
    HDIBITMAP =  CreateDIBSection(NULL, &DIBITMAPINFO, DIB_RGB_COLORS, (LPVOID*)&DIB颜色指针, NULL, 0);
    SelectObject(MemoryDCDIB/*画笔*/, HDIBITMAP/*画布*/);
    DIB颜色指针长度 = DIBITMAPINFO.bmiHeader.biSizeImage;
    BitBlt(MemoryDCDIB, 0, 0, GratingInterceptW, GratingInterceptH, EqualpmentDCIntercept, GratingInterceptX, GratingInterceptY, SRCCOPY);
}
//原本的数据传到内存DC里面去
VOID InterceptGrating()
{
    /*---------------------------------------------*/
    ReleaseDC(GratingHWND, EqualpmentDCIntercept);
    ReleaseDC(NULL, EqualpmentDCIntercept);
    /*--------------------------------------------------*/
    EqualpmentDCIntercept = GetDC(NULL);
    BitBlt(MemoryDCDIB, 0, 0, GratingInterceptW, GratingInterceptH, EqualpmentDCIntercept, GratingInterceptX, GratingInterceptY, SRCCOPY);
}

大们:这个CreateDIBSection函数的第四个参数(LPVOID*)&DIB颜色指针显示了地址,但提示说里面的字符无效。读取不到里面的BGR值。求解,,谢谢

思路:
流程应该是:
1.创建DIB(使用CreateDIBSection),得到的第四个参数的指针我们姑且称pDibBits。
2.打开一个位图(使用CreateFile和ReadFile),按我说的方法得到像素数据的指针,姑且称pFileBits。
3.memcpy(pDibBits,pFileBits,图像大小×3像素);
4.将DIB对象选入内存设备内容,并使用BitBlt函数显示。
5.然后对于你想取的像素值,操作pDibBits和操作pFileBits现在是一样的了,当然为了节约内存,在第3步过后,第2步读入内存的bmp文件应该已经可以释放掉了。你想对DIB的数据做这样那样的事就使用pDibBits就行了

下面是部分代码参考:

// CPng_ce_TestDlg 消息处理程序
BOOL CPng_ce_TestDlg::OnInitDialog()
{
        CDialog::OnInitDialog();

        // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
        //  执行此操作
        SetIcon(m_hIcon, TRUE);                        // 设置大图标
        SetIcon(m_hIcon, FALSE);                // 设置小图标

        //读取png图片
        CoInitializeEx(NULL ,COINIT_MULTITHREADED);

        if(FAILED(CoCreateInstance(CLSID_ImagingFactory,NULL,CLSCTX_INPROC_SERVER,IID_IImagingFactory ,(void **) &m_pImageFactory)))
        {
                MessageBox(_T("创建COM接口失败!"));
        }

        if(!SUCCEEDED(m_pImageFactory->CreateImageFromFile(_T("\\ResidentFlash\\image.png"),&pImage)))
        {
                MessageBox(_T("从文件读取图片失败!"));
        }
        return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

#if defined(_DEVICE_RESOLUTION_AWARE) && !defined(WIN32_PLATFORM_WFSP)
void CPng_ce_TestDlg::OnSize(UINT /*nType*/, int /*cx*/, int /*cy*/)
{
        if (AfxIsDRAEnabled())
        {
                DRA::RelayoutDialog(
                        AfxGetResourceHandle(),
                        this->m_hWnd,
                        DRA::GetDisplayMode() != DRA::Portrait ?
                        MAKEINTRESOURCE(IDD_PNG_CE_TEST_DIALOG_WIDE) :
                        MAKEINTRESOURCE(IDD_PNG_CE_TEST_DIALOG));
        }
}
#endif


void CPng_ce_TestDlg::OnPaint()
{
        CPaintDC dc(this); // device context for painting
        CRect rect;
        this->GetClientRect(&rect);//获取对话框的大小
        if(pImage!=NULL)
        {
                pImage->Draw(this->GetDC()->m_hDC ,rect,NULL);
        }
}

void CPng_ce_TestDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
        m_downX=point.x;
        m_downY=point.y;
        UpdateData(FALSE);

        if(m_Rectangle)
        {
                CPng_ce_TestDlg::OnPaint();//Invalidate();//重绘区域
                //lpData=NULL;
                m_Rectangle=FALSE;
               
        }
        CDialog::OnLButtonDown(nFlags, point);
}

void CPng_ce_TestDlg::OnMouseMove(UINT nFlags, CPoint point)
{
        //获得鼠标当前位置
        m_Rectangle=TRUE;
        m_CreateBmp=TRUE;

        m_moveX=point.x;
        m_moveY=point.y;
                 
        /*r = GetRValue(lpData[0]);
        g = GetGValue(lpData[0]);
        b = GetBValue(lpData[0]);
        r1 = GetRValue(lpData[1]);
        g1 = GetGValue(lpData[1]);
        b1 = GetBValue(lpData[1]);*/
        CClientDC dc(this);
                COLORREF ref1 = GetPixel(dc,m_downX,m_downY);
        r1 = GetRValue(ref1);
        g1 = GetGValue(ref1);
        b1 = GetBValue(ref1);
        UpdateData(FALSE);

        CDialog::OnMouseMove(nFlags, point);
}
void CPng_ce_TestDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
        CClientDC dc(this);
        CBrush *pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
        //CBrush brush(RGB(123,150,200));
        CBrush *pOldBrush=dc.SelectObject(pBrush);
        CRect rect(m_downX,m_downY,m_moveX,m_moveY);

        dc.Rectangle(&rect);
        dc.SelectObject(pOldBrush);

        if(m_CreateBmp)
        {
                CFileDialog fileDlg(FALSE,_T("*.bmp"),_T("image.bmp"),OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT ,_T("Save Fiel(*.bmp)|*.bmp||"));
                if(IDOK == fileDlg.DoModal())
                {
                        CreateBMPFile(fileDlg.GetPathName().GetBuffer(MAX_PATH),rect);
                       
                }
                GetPixel1();
        }
        r=*lpbit;
        CDialog::OnLButtonUp(nFlags, point);
}