我自定义一个可以显示BMP图片的控件(派生CStatic),是从剪切板里读取的图片
void CGMapCtrl::GetGMapCtrlMapFmClipBd()
{
if(!toClipboard(m_pWebCtrl->m_hWnd))
return;
CPaintDC dc(this);
CRect rect;
GetClientRect(rect); CPaintDC* pDC = &dc;
pDC->SetViewportOrg(0,0);
    if (IsClipboardFormatAvailable(CF_DIB))
//  if (IsClipboardFormatAvailable(CF_BITMAP))
    {
        // a DIB is in the clipboard, draw it out
        GLOBALHANDLE    hGMem;
        LPBITMAPINFO    lpBI;
        BYTE*           pDIBBits;
CDC memdc;        OpenClipboard();
        hGMem = GetClipboardData(CF_DIB);
//  hGMem = GetClipboardData(CF_BITMAP);
        lpBI = (LPBITMAPINFO)GlobalLock(hGMem); 
        // point to DIB bits after BITMAPINFO object
pDIBBits = (BYTE*)(lpBI);
    pDIBBits += sizeof(BITMAPINFO) -4;
       
if (m_hBitmap) 
::DeleteObject(m_hBitmap);
m_hBitmap = ::CreateCompatibleBitmap(pDC->m_hDC, lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight); memdc.CreateCompatibleDC(&dc);
HANDLE  pOld = memdc.SelectObject(m_hBitmap);
memdc.SetMapMode(MM_TEXT);        ::StretchDIBits(memdc.m_hDC,
            0, 0, lpBI->bmiHeader.biWidth/*rect.Width()*/, lpBI->bmiHeader.biHeight/*rect.Height()*/,
            0, 0, lpBI->bmiHeader.biWidth, lpBI->bmiHeader.biHeight,
            pDIBBits, lpBI, DIB_RGB_COLORS, SRCCOPY);        GlobalUnlock(hGMem);
        CloseClipboard();
memdc.SelectObject(pOld); }
Invalidate();}void CGMapCtrl::OnPaint() 
{
CPaintDC dc(this); // device context for painting

CPaintDC* pDC = &dc; CDC MemDC;
MemDC.CreateCompatibleDC(&dc);

// pDC->SetViewportOrg(0,0);
if (!m_hBitmap)
return; CBitmap bitMap;
bitMap.Attach(m_hBitmap); BITMAP bmpInfo;
bitMap.GetBitmap(&bmpInfo); HANDLE pOld = MemDC.SelectObject(m_hBitmap); pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &MemDC, 0, 0, SRCCOPY);
bitMap.Detach(); MemDC.SelectObject(pOld);
}虽然图片能显示出来,但整体向左移了几个象素,在这几个象素的区域却填充了图片最右边的几排象素的图像,百思不得其解。