改了映射模式后,客户区就变了。。

yz19971123 2019-08-21 06:43:41
第一张图是代码,第二张是界面。
...全文
87 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2019-08-24
  • 打赏
  • 举报
回复
给 你 写 了一个

void CLoEnglishView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
static BOOL sw=FALSE;
CClientDC dc(this);
//back color
CRect rect;
GetClientRect(&rect);
dc.SetMapMode(MM_TEXT);
SetWindowOrgEx(dc, 0, 0,NULL);
SetViewportOrgEx(dc, 0, 0,NULL);
if(sw)
dc.FillSolidRect(0, 0, rect.Width(),rect.Height(), RGB(255, 128, 255));
else
dc.FillSolidRect(0, 0, rect.Width(),rect.Height(), RGB(255, 255, 128));
if(!sw)
{
sw=TRUE;
dc.SetMapMode(MM_LOENGLISH);
SetWindowOrgEx(dc, 0, 0, NULL);
SetViewportOrgEx(dc, rect.right/2, rect.bottom/2,NULL);
}
else
{
sw=FALSE;
dc.SetMapMode(MM_TEXT);
SetWindowOrgEx(dc, 0, 0 ,NULL);
SetViewportOrgEx(dc, rect.right/2, rect.bottom/2,NULL);
}
CPoint pp;
GetViewportOrgEx(dc,&pp);//
rect.OffsetRect(pp.x,pp.y);//
dc.DPtoLP(&rect);

dc.MoveTo(0,0);
dc.LineTo(-rect.Width() / 2, -(rect.Height() / 2));
dc.MoveTo(0,0);
dc.LineTo(rect.Width() / 2, (rect.Height() / 2));
dc.MoveTo(0, 0);
dc.LineTo(-rect.Width() / 2, (rect.Height() / 2));
dc.MoveTo(0, 0);
dc.LineTo(rect.Width() / 2, -(rect.Height() / 2));

CRect rc(-80,-80,80,80);
rc.OffsetRect(pp.x,pp.y);//
dc.DPtoLP(&rc);//
dc.SelectObject(GetStockObject(NULL_BRUSH));
dc.Ellipse(rc);
// CScrollView::OnLButtonDown(nFlags, point);
}
zgl7903 2019-08-22
  • 打赏
  • 举报
回复
客户区变了是什么意思? 原来是什么样的 SDI, MID 客户区的绘制应该在 CXXXXView View类中进行, 是不是选错处理的类了?
yz19971123 2019-08-22
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster的回复:
"MM_LOENGLISH模式下使用双缓冲绘制窗口"
https://download.csdn.net/download/schlafenhamster/9427265
本程序演示如何在MM_LOENGLISH模式下用双缓冲绘制窗口。重点在 MM_TEXT 和 MM_LOENGLISH 模式时 BitBlt 的调用。
只不过我不会用而已。
yz19971123 2019-08-22
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster的回复:
"MM_LOENGLISH模式下使用双缓冲绘制窗口"
https://download.csdn.net/download/schlafenhamster/9427265
本程序演示如何在MM_LOENGLISH模式下用双缓冲绘制窗口。重点在 MM_TEXT 和 MM_LOENGLISH 模式时 BitBlt 的调用。
还有你这个好像有些复杂,我看书上或者网上有个简单的方法,就是用setwindowExt 和setviewExt改变逻辑单位的大小。
yz19971123 2019-08-22
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster的回复:
"MM_LOENGLISH模式下使用双缓冲绘制窗口"
https://download.csdn.net/download/schlafenhamster/9427265
本程序演示如何在MM_LOENGLISH模式下用双缓冲绘制窗口。重点在 MM_TEXT 和 MM_LOENGLISH 模式时 BitBlt 的调用。
我不用这个模式了。。我用自定义模式或者LOM开头的。
schlafenhamster 2019-08-22
  • 打赏
  • 举报
回复
"MM_LOENGLISH模式下使用双缓冲绘制窗口"
https://download.csdn.net/download/schlafenhamster/9427265
本程序演示如何在MM_LOENGLISH模式下用双缓冲绘制窗口。重点在 MM_TEXT 和 MM_LOENGLISH 模式时 BitBlt 的调用。
schlafenhamster 2019-08-22
  • 打赏
  • 举报
回复
// Convert size in points to device coordinate
void CLoEnglishView::PointToDevice(CDC *pDC, SIZE & size)
{
int dpix = pDC->GetDeviceCaps(LOGPIXELSX);// 144
int dpiy = pDC->GetDeviceCaps(LOGPIXELSY);// 144

size.cx = size.cx * dpix / 72;// 11737 * 144 / 72=20
size.cy = size.cy * dpiy / 72;// 4
}
// Convert size in device coordinate to logical coordinate
void CLoEnglishView::DeviceToLogical(CDC *pDC, SIZE & size)
{
POINT p[2] = { 0, 0, size.cx, size.cy };

pDC->DPtoLP(p, 2);

size.cx = abs(p[1].x - p[0].x);
size.cy = abs(p[1].y - p[0].y);
}
yz19971123 2019-08-21
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster的回复:
代码 不要用 图 !
afx_msg void cmainwindw::OnLButtonDown(UINT nFlags, CPoint point) { CClientDC dc(this); CRect rect; GetClientRect(&rect); dc.SetMapMode(MM_LOENGLISH); CPoint pp(rect.Width()/2,-(rect.Height()/2)); dc.LPtoDP(&pp); dc.SetViewportOrg(pp); dc.MoveTo(0,0); dc.LineTo(-rect.Width() / 2, -(rect.Height() / 2)); dc.MoveTo(0,0); dc.LineTo(rect.Width() / 2, (rect.Height() / 2)); dc.MoveTo(0, 0); dc.LineTo(-rect.Width() / 2, (rect.Height() / 2)); dc.MoveTo(0, 0); dc.LineTo(rect.Width() / 2, -(rect.Height() / 2)); dc.Ellipse(-200,200,200,-200); }
yz19971123 2019-08-21
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster的回复:
代码 不要用 图 !
afx_msg void cmainwindw::OnLButtonDown(UINT nFlags, CPoint point){ CClientDC dc(this); CRect rect; GetClientRect(&rect); dc.SetMapMode(MM_LOENGLISH); CPoint pp(rect.Width()/2,-(rect.Height()/2)); dc.LPtoDP(&pp); dc.SetViewportOrg(pp); dc.MoveTo(0,0); dc.LineTo(-rect.Width() / 2, -(rect.Height() / 2)); dc.MoveTo(0,0); dc.LineTo(rect.Width() / 2, (rect.Height() / 2)); dc.MoveTo(0, 0); dc.LineTo(-rect.Width() / 2, (rect.Height() / 2)); dc.MoveTo(0, 0); dc.LineTo(rect.Width() / 2, -(rect.Height() / 2)); dc.Ellipse(-200,200,200,-200);}
schlafenhamster 2019-08-21
  • 打赏
  • 举报
回复
MM_TEXT 与 MM_LOENGLISH 单位 不同
schlafenhamster 2019-08-21
  • 打赏
  • 举报
回复
代码 不要用 图 !

19,468

社区成员

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

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