pDcMemory->StretchBlt(0,0,lWidthOrg,lHeightOrg,m_pDcShapeTmp,pImgSelInfo->ptDest.x,pImgSelInfo->ptDest.y
,m_rcStaticImage.Width()/wndSplit.x
,m_rcStaticImage.Height()/wndSplit.y
,NOTSRCCOPY);

m_pDcShapePrint->BitBlt(0
, 0
, m_rcStaticImage.Width()/wndSplit.x
, m_rcStaticImage.Height()/wndSplit.y
, m_pDcShapeTmp
, 0
, 0
, SRCCOPY   );

pDcMemory->StretchBlt(0,0,lWidthOrg,lHeightOrg,m_pDcShapePrint,pImgSelInfo->ptDest.x,pImgSelInfo->ptDest.y
,m_rcStaticImage.Width()/wndSplit.x
,m_rcStaticImage.Height()/wndSplit.y
,NOTSRCCOPY);为什么不能达到一样的效果
补充两个DC的创建代码
m_pBmpShapeTmp = new CBitmap;
if (!m_pBmpShapeTmp->CreateCompatibleBitmap(pDC, iWidth,iHeight))
{
return FALSE;
}
m_pDcShapeTmp->SelectObject(m_pBmpShapeTmp);
::SetStretchBltMode(m_pDcImageTmp->GetSafeHdc(),COLORONCOLOR); m_pDcShapePrint = new CDC;
if (!m_pDcShapePrint->CreateCompatibleDC(m_pDcShapeTmp))
{
return FALSE;
} m_pBmpShapePrint = new CBitmap;
if (!m_pBmpShapePrint->CreateCompatibleBitmap(m_pDcShapeTmp, iWidth,iHeight))
{
return FALSE;
}
m_pDcShapePrint->SelectObject(m_pBmpShapePrint);
::SetStretchBltMode(m_pDcShapePrint->GetSafeHdc(),COLORONCOLOR);请大家帮忙看看什么原因,真的不能理解 竟然会出现这样的情况?

解决方案 »

  1.   


       pDcMemory->StretchBlt(0,0,lWidthOrg,lHeightOrg,m_pDcShapeTmp,pImgSelInfo->ptDest.x,pImgSelInfo->ptDest.y
            ,m_rcStaticImage.Width()/wndSplit.x
            ,m_rcStaticImage.Height()/wndSplit.y
            ,NOTSRCCOPY);
    //这样的实现是显示正常的
    //为什么另一种显示就有问题呢
      

  2.   

    m_pBmpShapePrint->CreateCompatibleBitmap(pDC
    这样试试
      

  3.   

    不行啊
    我本来就是你这样写的,发现不行,所以该成
    m_pDcShapePrint->CreateCompatibleDC(m_pDcShapeTmp))的
      

  4.   

    感觉上可能是在进行BitBlt那一步,图象可能是被拉伸或者压缩了,
    也就是说,如果位图的原始width和height不等于m_rcStaticImage.Width()/wndSplit.x和
    _rcStaticImage.Height()/wndSplit.y这两个值的话,那么位图在BitBlt和StretchBlt要进行两次拉伸,或者压缩,肯定效果与一步到位不一样
    不知道是不是这样,可以跟踪一下看看
      

  5.   

    位图的原始大小
    if (!m_pBmpShapePrint->CreateCompatibleBitmap(m_pDcShapeTmp, iWidth,iHeight))
    iWidth和iHeight的值在这里是
    m_rcStaticImage.Width()/wndSplit.x和m_rcStaticImage.Height()/wndSplit.y
    这点不用怀疑。用第1种方法 就可以显示出图形内容
    就第2种就不能显示了
    因为第1种那个DC是一个临时的DC,如果显示的的DC多于一个 ,那它的内容就是最后一个DC的内容了
    所以我想获得中间某1个DC 的内容就不能做到,我只能用一个大小一致的m_pBmpShapePrint的来保存相同的内容
    而现在就出现了这个奇怪的情况。
      

  6.   

    不是图片问题吧
    内存问题也不像
    参数问题?就不知道了
    不过我认为也不像
    应该m_pDcShapeTmp和m_pDcShapePrint两个DC,大小是一致的
    都是iWidth和iHeight也就是,
    m_rcStaticImage.Width()/wndSplit.x和m_rcStaticImage.Height()/wndSplit.y 
    这点不用怀疑。难道我问的这个问题就这么难么?
      

  7.   

    这样改    m_pDcShapePrint->BitBlt(0
            , 0
            , m_rcStaticImage.Width()/wndSplit.x
            , m_rcStaticImage.Height()/wndSplit.y
            , m_pDcShapeTmp
            , pImgSelInfo->ptDest.x
            , pImgSelInfo->ptDest.y
            , SRCCOPY   );
        
        pDcMemory->StretchBlt(0,0,lWidthOrg,lHeightOrg,m_pDcShapePrint
            ,0
            ,0
            ,m_rcStaticImage.Width()/wndSplit.x
            ,m_rcStaticImage.Height()/wndSplit.y
            ,NOTSRCCOPY);
      

  8.   

    表达的意思不对
     m_pDcShapePrint->BitBlt(0
            , 0
            , m_rcStaticImage.Width()/wndSplit.x
            , m_rcStaticImage.Height()/wndSplit.y
            , m_pDcShapeTmp
            , pImgSelInfo->ptDest.x
            , pImgSelInfo->ptDest.y
            , SRCCOPY   );
        你这个表达的是什么意思?
       m_pDcShapeTmp和m_pDcShapePrint大小是一样的
       你这样虽然把我的那段区域是截取过去了,那另一个部分只能是空白了。
        pDcMemory->StretchBlt(0,0,lWidthOrg,lHeightOrg,m_pDcShapePrint
            ,0
            ,0
            ,m_rcStaticImage.Width()/wndSplit.x
            ,m_rcStaticImage.Height()/wndSplit.y
            ,NOTSRCCOPY);    你这里参数填的就更有问题了lWidthOrg和lHeightOrg是某一副图的原始大小
       
    m_rcStaticImage.Width()/wndSplit.x  和m_rcStaticImage.Height()/wndSplit.y
        是临时DC 的显示区域大小,明显不成比例啊,很显然不合适。
      

  9.   

    那就是对了. 老兄,我是通过你的代码猜测你的意图...老兄,我是通过你的代码猜测你的意图...是哪个部分?比例不对是因为BitBlt()没有变比.
    但你在12楼说过"应该m_pDcShapeTmp和m_pDcShapePrint两个DC,大小是一致的,都是,iWidth和iHeight也就是,"
    如果w,h都一样,就应该没有问题.
      

  10.   

    再试这个,应该没问题了    m_pDcShapePrint->BitBlt(0 
            , 0 
            , lWidthOrg 
            , lHeightOrg
            , m_pDcShapeTmp 
            , pImgSelInfo->ptDest.x 
            , pImgSelInfo->ptDest.y 
            , SRCCOPY  ); 
        
        pDcMemory->StretchBlt(0,0,lWidthOrg,lHeightOrg,m_pDcShapePrint 
            ,0 
            ,0 
            ,m_rcStaticImage.Width()/wndSplit.x 
            ,m_rcStaticImage.Height()/wndSplit.y 
            ,NOTSRCCOPY);
      

  11.   

    我觉得13楼就是对的.你好象新改了参数的形式, 用 lwidth 代替了 m_rcStaticImage.Width()/wndSplit.x你看看是否没有都替换?
      

  12.   

    其实lwidth 和
    m_rcStaticImage.Width()/wndSplit.x是相等的
      

  13.   


      /* 我13楼的代码应该跟你在1楼写的这段代码效果是一样滴 */
      pDcMemory->StretchBlt(0,0,lWidthOrg,lHeightOrg,m_pDcShapeTmp,pImgSelInfo->ptDest.x,pImgSelInfo->ptDest.y
            ,m_rcStaticImage.Width()/wndSplit.x
            ,m_rcStaticImage.Height()/wndSplit.y
            ,NOTSRCCOPY);  // 你说 lWidthOrg,lHeightOrg 是原始大小, 那么你上面的代码应该也错了
      // StretchBlt()的第3,4参数应该是 目标大小, 而不是原始大小.