我通过GetClipboardData(CF_DIB)获得了剪贴板上的位图结构BITMAPINFO,请问我要如何才能将这个位图通过StretchDIBits显示在指定的DC中?已知剪贴板中确实存在CF_DIB的位图且读出正确最好有部分源程序万分感谢

解决方案 »

  1.   

    没有调色板的情况
    CFileStatus fstatus;
    CFile file;
    LONG cb;
    HGLOBAL hGlobal;
    if(file.Open("c:\\start2.bmp",CFile::modeRead)&&
    file.GetStatus("c:\\start2.bmp",fstatus)&&((cb =fstatus.m_size)!= -1))
    {
    hGlobal = GlobalAlloc(GPTR,cb);
    file.Seek(sizeof(BITMAPFILEHEADER), CFile::begin );
    file.ReadHuge(hGlobal,cb);
    file.Close();
    }
    if (hGlobal == NULL)
    return;
    OpenClipboard();
    EmptyClipboard(); HANDLE h = ::SetClipboardData( CF_DIB, (BITMAPINFO *)hGlobal) ;
    HANDLE hdib = ::GetClipboardData(CF_DIB);

    if (hdib == NULL)
    return;
    BITMAPINFOHEADER *pbih = (BITMAPINFOHEADER *)hdib;
    CDC *pDC = GetDC();
    ::StretchDIBits(pDC->m_hDC,0,0,pbih->biWidth,pbih->biHeight,
    0,0,pbih->biWidth,pbih->biHeight,
    (BYTE *)pbih+sizeof(BITMAPINFOHEADER),(BITMAPINFO *)pbih,DIB_RGB_COLORS,SRCCOPY);
    ReleaseDC(pDC);
    CloseClipboard();
    GlobalFree(hGlobal);