高手请回答!!!如何使SetMapMode()情况下以下代码能够正确显示

scmsir 2004-04-21 04:23:28
void CUuuuView::OnDraw(CDC* pDC)
{//pDC->SetMapMode(MM_ISOTROPIC);//参数类似
CBitmap bmp;
CDC mDC;
mDC.CreateCompatibleDC(pDC);
CRect r;
GetClientRect(&r);
CRect rD;
rD.CopyRect(&r);
pDC->LPtoDP(&rD);
bmp.CreateCompatibleBitmap(pDC,rD.Size().cx,rD.Size().cy);
mDC.SelectObject(&bmp);
CBrush myBrush;
myBrush.CreateSolidBrush(RGB(255,0,0));
mDC.FillRect(&r,&myBrush);
mDC.TextOut(50,50,"aaaa");
pDC->BitBlt(r.left,r.top,r.Size().cx,r.Size().cy,&mDC,0,0,SRCCOPY);
}
...全文
259 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2004-04-22
  • 打赏
  • 举报
回复
设置MapMode之后,视口的原点变了,TextOut的坐标也要改变。
zhaogaojian 2004-04-22
  • 打赏
  • 举报
回复
To Mackz(在相互):我把你上边的代码放进去还只是一条小红线,
最好的解决方法是加上
mDC.SetMapMode(MM_HIMETRIC);
即将内存的也设为这个模式
我先声明:上面的贴子是同学帮我发的,不是我一个人两个号!!!!!!!!!!!,我已
经没有分数了,55555555555555555
zhaogaojian 2004-04-22
  • 打赏
  • 举报
回复
其实是这样的,因为我是在别人的程序基础上修改的,
CSize sizeTotal(30000,30000);
m_bResistor=0;
SetScrollSizes(MM_HIMETRIC,sizeTotal,sizePage,sizeLine);

因为他已经在OnInitUpdate()中设置了,整个程序中用的都是这个模式
我在OnDraw()中必须用他的模式,我如果改变了,就有可能产生别的错误
zhaogaojian 2004-04-22
  • 打赏
  • 举报
回复
刚才忘了注释掉了,本来用的是pDC->SetMapMode(MM_ISOTROPIC);
所以有这两句话
菜牛 2004-04-22
  • 打赏
  • 举报
回复
你显然没有看我上面的代码。去掉SetMapMode,没有改变MapMode,当然能显示,所以设置了之后要设置回来。
其实MSDN里解释的很清楚,但是你不理解。
你的代码上下左右风格很乱,比如:
pDC->SetMapMode(MM_LOENGLISH);
pDC->SetWindowExt ( 1000, 1000) ;
...
::SetViewportExtEx(pDC->m_hDC, gcWidth,gcHeight,NULL);
::SetViewportOrgEx(pDC->m_hDC, gcWidth>>1,gcHeight>>1,NULL);
我改写的代码优化了变量使用,你没必要多次转化CRect,设计好了可以少使用变量。
你的关键就是对MapMode改变之后要改回来不清楚,LPtoDP也可以,但是增加了不少开销,比如你创建的bmp所需rD,作了多次操作,完全是浪费。
zhaogaojian 2004-04-22
  • 打赏
  • 举报
回复
找到解决办法!!!!!!!
mDC.CreateCompatibleDC(pDC);并不会改变mDC的显示模式
zhaogaojian 2004-04-22
  • 打赏
  • 举报
回复
我感觉 ColderRain(一切尽在不言中)的方法挺不错的!!!
zhaogaojian 2004-04-22
  • 打赏
  • 举报
回复
To Mackz(在相互):猩猩大哥!!!!销毁GDI不是关键,你去掉SetMapMode()试一下,照样能显示!!!题目是为了简化一下,你用下面的代码试一下!!!!但是换成pDC->SetMapMode(MM_LOENGLISH)就又显示不太正常了,MSDN上面好像没有讲这方面的
CBitmap bmp;
CDC mDC;
mDC.CreateCompatibleDC(pDC);
CRect r;
GetClientRect(&r);
CRect rD;
rD.CopyRect(&r);
pDC->LPtoDP(&rD);
CRect rect;
int gcWidth,gcHeight;
pDC->SetMapMode(MM_LOENGLISH);
pDC->SetWindowExt ( 1000, 1000) ;
GetClientRect(&rect);
gcWidth=rect.Width();
gcHeight=rect.Height();
::SetViewportExtEx(pDC->m_hDC, gcWidth,gcHeight,NULL);
::SetViewportOrgEx(pDC->m_hDC, gcWidth>>1,gcHeight>>1,NULL);
bmp.CreateCompatibleBitmap(pDC,rD.Size().cx,rD.Size().cy);
mDC.SelectObject(&bmp);
CBrush myBrush;
myBrush.CreateSolidBrush(RGB(255,0,0));
mDC.FillRect(&r,&myBrush);
mDC.TextOut(50,50,"aaaa");
pDC->DPtoLP(&r);
pDC->BitBlt(r.left,r.top,r.Size().cx,r.Size().cy,&mDC,0,0,SRCCOPY);
菜牛 2004-04-22
  • 打赏
  • 举报
回复
void CUuuuView::OnDraw(CDC* pDC)
{
GetClientRect(r);
CBitmap bmp;
CDC mDC;
mDC.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC,r.Width(),r.Height());
CBitmap *oldbmp = mDC.SelectObject(&bmp);
mDC.SetMapMode(MM_ISOTROPIC);//参数类似
CBrush myBrush;
myBrush.CreateSolidBrush(RGB(255,0,0));
CRect rD(&r);
mDC.DPtoLP(&rD);
mDC.FillRect(&rD,&myBrush);
mDC.TextOut(50,50,"aaaa");
mDC.SetMapMode(MM_TEXT);
pDC->BitBlt(r.left,r.top,r.Size().cx,r.Size().cy,&mDC,0,0,SRCCOPY);
...下面还有一大堆销毁GDI资源的代码,非常重要。
}
zhaogaojian 2004-04-22
  • 打赏
  • 举报
回复
多谢ColderRain(一切尽在不言中) Mackz(在相互)两位大猩猩前辈帮助,小弟水平不高
言语不当之处多多包涵,十分感谢!!!!以后有机会请你们吃饭!!
ColderRain 2004-04-21
  • 打赏
  • 举报
回复
if (m_bOpenLayout)
{
clrBack = RGB(255,255,255);
}
else
{
clrBack = ::GetSysColor(COLOR_3DDKSHADOW);
}

这段代码是用来填充背景颜色的,不用管这段代码。
如果你想不闪烁,鼠标选中,移动,缩放你所画的图形,我的方法适合你。
zhaogaojian 2004-04-21
  • 打赏
  • 举报
回复
现在的高手太少了,有一个高手发的贴子又看不懂!!!!!!!!!
scmsir 2004-04-21
  • 打赏
  • 举报
回复
m_bOpenLayout是什么东西呢?
ColderRain 2004-04-21
  • 打赏
  • 举报
回复
如果要在图形中选中,移动其中的图形,使用StrechBlt就很麻烦了,你就得自己来计算比例进行坐标转换了。

下面是我的解决方法:


void CLayoutEditView::OnDraw(CDC* pDC)
{
CDC dc;
CDC* pDrawDC = pDC;
CBitmap bmp;
CBitmap* pOldBmp = NULL;

CRect rcWnd;
GetClientRect(&rcWnd);
CRect rcPos;

pDC->GetClipBox(&rcWnd);
CRect rect = rcWnd;
OnPrepareDC(pDC, NULL);
pDC->LPtoDP(rect);
rect.NormalizeRect();

if (!pDC->IsPrinting())
{
dc.CreateCompatibleDC(pDC);
bmp.CreateCompatibleBitmap(pDC, rect.Width(), rect.Height());

OnPrepareDC(&dc, NULL);
pDrawDC = &dc;

// 避免屏幕不刷新
dc.OffsetViewportOrg(-rect.left, -rect.top);

pOldBmp = dc.SelectObject(&bmp);
dc.SetBrushOrg(rect.left % 8, rect.top % 8);

dc.IntersectClipRect(rcWnd);
}

// 填充背景
CBrush brush;
COLORREF clrBack;
if (m_bOpenLayout)
{
clrBack = RGB(255,255,255);
}
else
{
clrBack = ::GetSysColor(COLOR_3DDKSHADOW);
}
if (!brush.CreateSolidBrush(clrBack))
return;

// 原点被改变,重新安排调色板
brush.UnrealizeObject();
pDrawDC->FillRect(rcWnd, &brush);

if (!pDC->IsPrinting())
{
MemDraw(pDrawDC); // 在这个函数里改变映射模式,其实改变的是内存DC的映射模式
}

if (pDrawDC != pDC)
{
// 恢复原来的映射模式,不然部分图形显示不出来
//

pDC->SetViewportOrg(0, 0);
pDC->SetWindowOrg(0,0);
pDC->SetMapMode(MM_TEXT);
dc.SetViewportOrg(0, 0);
dc.SetWindowOrg(0,0);
dc.SetMapMode(MM_TEXT);

pDC->BitBlt( rect.left,
rect.top,
rect.Width(),
rect.Height(),
&dc,
0,
0,
SRCCOPY);
dc.SelectObject(pOldBmp);
bmp.DeleteObject();
dc.DeleteDC();
}
}



//==================================================
// 在内存DC中绘制
//==================================================
void CLayoutEditView::MemDraw(CDC* pDC)
{
// 按比例设置映射模式
pDC->SetMapMode(MM_ANISOTROPIC);
pDC->SetWindowExt(m_iScaleWidth + m_nRuleWidth, m_iScaleHeight + m_nRuleWidth);

......
}
zhaogaojian 2004-04-21
  • 打赏
  • 举报
回复
不对,有本事贴出代码让我试一下!!!!!!!!!!!!

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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