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);请大家帮忙看看什么原因,真的不能理解 竟然会出现这样的情况?
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->CreateCompatibleDC(m_pDcShapeTmp))的
也就是说,如果位图的原始width和height不等于m_rcStaticImage.Width()/wndSplit.x和
_rcStaticImage.Height()/wndSplit.y这两个值的话,那么位图在BitBlt和StretchBlt要进行两次拉伸,或者压缩,肯定效果与一步到位不一样
不知道是不是这样,可以跟踪一下看看
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的来保存相同的内容
而现在就出现了这个奇怪的情况。
内存问题也不像
参数问题?就不知道了
不过我认为也不像
应该m_pDcShapeTmp和m_pDcShapePrint两个DC,大小是一致的
都是iWidth和iHeight也就是,
m_rcStaticImage.Width()/wndSplit.x和m_rcStaticImage.Height()/wndSplit.y
这点不用怀疑。难道我问的这个问题就这么难么?
, 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);
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 的显示区域大小,明显不成比例啊,很显然不合适。
但你在12楼说过"应该m_pDcShapeTmp和m_pDcShapePrint两个DC,大小是一致的,都是,iWidth和iHeight也就是,"
如果w,h都一样,就应该没有问题.
, 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);
m_rcStaticImage.Width()/wndSplit.x是相等的
/* 我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参数应该是 目标大小, 而不是原始大小.