我当前的DC中选入了一幅图,我想剪切它中间的一块,然后用另外的图片来代替这一块,该如何做呢?谢谢

解决方案 »

  1.   

    CBitmap bm;
    CBitmap *pOld;
    int Width,Height;
    CDC tdc;
    BITMAP btm;
    DWORD size;
    CDC dc;

    RECT Rect;
           
    dc.CreateDC("DISPLAY",NULL,NULL,NULL);

    Width=Rect.right-Rect.left;
    Height=Rect.bottom-Rect.top;

    bm.CreateCompatibleBitmap(&dc,Width,Height);

    tdc.CreateCompatibleDC(&dc);
    pOld=tdc.SelectObject(&bm);

    tdc.BitBlt(  0 ,  0 ,  Width,  Height,  &dc,   Rect.left   ,   Rect.top    ,   SRCCOPY);
    //BOOL  BitBlt(int x,int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );

    tdc.SelectObject(pOld);
    bm.GetBitmap(&btm);
    size=btm.bmWidthBytes*btm.bmHeight;
    LPSTR lpData=(LPSTR)GlobalAllocPtr(GPTR,size);

    /////////////////////////////////////////////
    BITMAPINFOHEADER bih;
    bih.biBitCount=btm.bmBitsPixel;
    bih.biClrImportant=0;
    bih.biClrUsed=0;
    bih.biCompression=0;
    bih.biHeight=btm.bmHeight;
    bih.biPlanes=1;
    bih.biSize=sizeof(BITMAPINFOHEADER);
    bih.biSizeImage=size;
    bih.biWidth=btm.bmWidth;
    bih.biXPelsPerMeter=0;
    bih.biYPelsPerMeter=0;
    ///////////////////////////////////

    GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);

           

    if (OpenClipboard())      //hWnd为程序窗口句柄
    {
    //清空剪贴板
    EmptyClipboard();
    //把屏幕内容粘贴到剪贴板上,bm为刚才的屏幕位图句柄
    SetClipboardData(CF_BITMAP, bm);
    //关闭剪贴板
    CloseClipboard();

    }这可以剪掉想要的一块。并贴制剪贴板
      

  2.   

    再生成一MemDC,选入另一图片,然后用BitBlt拷贝到你想的位置即可
      

  3.   

    已经搞定了,不过好像没有那么复杂,我在最开始选入位图后将其保留到一个内存DC中,然后搽除的时候从这个内存DC中截取相应位置,复制到当前的DC中
    CPoint pt_Start;
    if ((point.x-10)>=0)
    {
    pt_Start.x = point.x-10;
    }
    else
    {
    pt_Start.x = 0;
    }
    if ((point.y-10)>=0)
    {
    pt_Start.y = point.y-10;
    }
    else
    {
    pt_Start = 0;
    } m_pCurDC->BitBlt(pt_Start.x,pt_Start.y,20,20,&Memdc,pt_Start.x,pt_Start.y,SRCCOPY);
    m_nMemDC.BitBlt(pt_Start.x,pt_Start.y,20,20,&Memdc,pt_Start.x,pt_Start.y,SRCCOPY);