为什么我用BitBlt到客户区中的图形,在打印预览中不能正确显示,分不多,大家帮帮我

zhaogaojian 2004-04-29 09:40:49
如果直接用pDC->TextOut(33,3434,"asdfds");可以在打印预览中显示
但我用pDC->BitBlt(r.left,r.top,r.Size().cx,r.Size().cy,&mDC,r.left,r.top,SRCCOPY);
只会显示一小块,显示的一小块不是那种客户区缩小形的,是残缺的那种一小块!!
是不是BitBlt根本就不能打印预览???请指教,谢谢
/////////////////////////////////////////////////////////
CBitmap bmp;
CDC mDC;
mDC.CreateCompatibleDC(pDC);
CRect r;
GetClientRect(&r);
CRect rD;
rD.CopyRect(&r);
pDC->LPtoDP(&rD);
CRect rect;
int gcWidth,gcHeight;
GetClientRect(&rect);
gcWidth=rect.Width();
gcHeight=rect.Height();
mDC.SetMapMode(MM_HIMETRIC);
bmp.CreateCompatibleBitmap(pDC,2000,1000);
mDC.SelectObject(&bmp);
CBrush myBrush;
myBrush.CreateSolidBrush(RGB(255,0,0));
pDC->DPtoLP(&r);
mDC.FillRect(&r,&myBrush);
CElecDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rectBound(1000,-1000,28500,-18500), rectShadow(rectBound);
CBrush *oldBrush, bkBrush(m_rgbBoardColor), bkShadowBrush(RGB(192,192,192));//bkBrush(&bmpBK), bkShadowBrush(RGB(192,192,192));
CPen *pOldPen, penShadow(PS_NULL, 0, RGB(0, 0, 0));
pOldPen = mDC.SelectObject(&penShadow);
oldBrush = mDC.SelectObject(&bkShadowBrush);
pOldPen = pDC->SelectObject(&penShadow);
oldBrush = pDC->SelectObject(&bkShadowBrush);
rectShadow.OffsetRect(150, -150);
mDC.Rectangle(rectShadow);
mDC.SelectObject(&bkBrush);
mDC.Rectangle(rectBound);
//pDC->Rectangle(rectBound);
mDC.SelectObject(pOldPen);
mDC.SelectObject(oldBrush);
/*绘制链表中的各个元器件*/
POSITION pos = pDoc->m_ChipObList.GetHeadPosition();
CObject *pObject;
CResistor *pResistor;
CLine *pLine;
CComponent *pComponent;
CBrush fillBrush(m_rgbFillColor);
oldBrush = mDC.SelectObject(&fillBrush);
//pDC->TextOut(3434,-1434,"sdfsdfkjsdfjask");////注意这句话
while (pos != NULL)
{
pObject = pDoc->m_ChipObList.GetAt(pos);
pComponent = (CComponent *)pObject;
if (pObject->IsKindOf(RUNTIME_CLASS(CResistor)))
{
pResistor = (CResistor *)pObject;
pResistor->m_RectTracker.m_rect = pResistor->m_RectLP;
mDC.LPtoDP(pResistor->m_RectTracker.m_rect);
if (pResistor->GetIsSelected())
{
pResistor->m_RectTracker.Draw(&mDC);
}
}
if (pObject->IsKindOf(RUNTIME_CLASS(CLine)))
{
pLine = (CLine *)pObject;


}
pComponent->Draw(&mDC);
//pComponent->Draw(pDC);
pDoc->m_ChipObList.GetNext(pos);
}

point1.x=r.left;
point1.y=r.top;
mDC.LPtoDP(&point1);
pDC->BitBlt(r.left,r.top,r.Size().cx,r.Size().cy,&mDC,r.left,r.top,SRCCOPY);
mDC.SelectObject(oldBrush);
...全文
148 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
countryboy 2004-04-30
  • 打赏
  • 举报
回复
顺便问一下,预览的时候坐标上移了,是为什么???
就是在获得控件里的图形的时候,多获得了空件上面一点点其他区域的,而控件本身下面却少了那么一块~~!!!1
这是为什么????
zhaogaojian 2004-04-30
  • 打赏
  • 举报
回复
我用了逻辑模式
void CElecView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
m_rgbBoardColor = RGB(167,157,150);
CSize sizeTotal(20000,30000);//这里的值是逻辑坐标,20cm,30cm
CSize sizePage(sizeTotal.cx/5,sizeTotal.cy/6);
CSize sizeLine(sizeTotal.cx/50,sizeTotal.cy/50);
//MM_HIMETRIC映射模式的y轴方向是向下减的
SetScrollSizes(MM_HIMETRIC,sizeTotal,sizePage,sizeLine);

}
我的不是缺一小块,而是只能显示一小块,比如我在客户区能看到一个人的图像
但我在打印预览时就只能看到一个人头,并且人头的大小和客户区的比例是一样的
只是在打印预览得上边能显示
swbreath 2004-04-29
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/TopicView1.asp?id=3022521
这个帖子你看过了吧,我就不贴过来了,否则又要说我粘来粘去的了

另外问一下你所说的却一小块是指缺什么?我估计原因多半是内存DC没有选择进入足够大的位图导致的,内存DC选择进入的位图相当于一个画布,只有画在这个不上面的东西才可以BitBlt到真正的DC上面
zhaogaojian 2004-04-29
  • 打赏
  • 举报
回复
我将BitBlt改为StretchDIBits还是一样
zhaogaojian 2004-04-29
  • 打赏
  • 举报
回复
上边的代码是在OnDraw()中写的
zhaogaojian 2004-04-29
  • 打赏
  • 举报
回复
楼上的能说为什么?我程序应该怎样改,才能又能显示,又能打印??
swbreath 2004-04-29
  • 打赏
  • 举报
回复
别用BitBlt,打印的时候就使用StretchDIBits

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧