【问题标题】:Why is my mouse cursor coordinates suddenly scaled?为什么我的鼠标光标坐标突然缩放?
【发布时间】:2016-11-10 09:00:42
【问题描述】:

一开始,对不起我的英语。

我现在正在学习如何在 Visual Studio 2015 中构建 MFC 应用程序。我正在使用 Direct2D 在窗口中绘制线条。

当左键按下时,我的 OnLbuttonDown() 函数被调用:

void CMyProjectNameView::OnLButtonDown(UINT nFlags, CPoint point)
{
    startPoint = point;   // start point of the line, a gloable variable.
    pRenderTarget->BeginDraw();
    CView::OnLButtonDown(nFlags, point);
}

当左键向上时,我的 OnLButtonUp() 函数被调用:

void CMyProjectNameView::OnLButtonUp(UINT nFlags, CPoint point)
{
    pRenderTarget->DrawLine(startPoint, point, m_pbrush, 1.0f); // draw the line
    pRenderTarget->EndDraw();
    CView::OnLButtonUp(nFlags, point);
}

所以当我拖动鼠标时它会在窗口中画一条线,昨天它工作正常。

问题是我今天运行它,突然变得异常。起点坐标和终点坐标是之前的两倍。所以当我画线时,与它应该的位置相比,这条线显示在右下角的位置。

例如,如果我画一条从 (100,100) 到 (500,500) 的线,屏幕上会出现一条从 (100,100) 到 (500,500) 的线,但是当我在 (100,100) 处单击鼠标左键时,将其移动到 (500,500) 并释放左键,将绘制一条从 (200,200) 到 (1000,1000) 的线。

OnLButtonDown(UINT nFlags, CPoint point)
OnLButtonUp(UINT nFlags, CPoint point)

所以基本上,上面的这两点是在传入之前缩放的。我是否不小心更改了任何配置?有没有什么办法解决这一问题?我确定我没有更改我的代码。

【问题讨论】:

  • 你试过打电话给SetTransform()
  • 我不关心 Direct2D,但在 GDI 中,有时我碰巧忘记了从设备坐标到逻辑坐标的转换,反之亦然(CDC::DPToLPCDC::LPToDPmethods)。我看过一个页面——d.hatena.ne.jp/sugarontop/20121006——不幸的是它不是英文的,可能有一些信息给你。
  • @DavidThomas 我在初始化时调用了这个函数,这似乎不是我的程序的原因。问题解决了,问题是我没有转换我的坐标。谢谢!
  • @sergiol 你是对的,我没有转换我的坐标。谢谢!

标签: c++ visual-studio visual-c++ mfc direct2d


【解决方案1】:

DrawLine 的坐标以与设备无关的像素为单位。另见DPI and Device-Independent Pixels

您可能更改了客户矩形的大小,需要对其进行调整。还可以尝试调整窗口大小,看看它是否获得了正确的坐标。

CRect rc;
GetClientRect(&rc);

D2D1_SIZE_F size = pRenderTarget->GetSize();
const float x = size.width / rc.right;
const float y = size.height / rc.bottom;

D2D1_POINT_2F p1;
D2D1_POINT_2F p2;

p1.x = 100 * x;
p1.y = 100 * y;

p2.x = 500 * x;
p2.y = 500 * y;

pRenderTarget->DrawLine(p1, p2, brush);

【讨论】:

  • 谢谢!!!!!!您提供的链接解释了一切!鼠标坐标以物理像素为单位,但点坐标使用 Direct2D 在 DIP 中传递给 DrawLine()。问题是我使用的是 2 个屏幕,我的系统显示设置中的文本大小是一个 200%,另一个是 100%。当我运行我的程序时,应用程序窗口出现在我的主显示屏中,我将主显示屏从 100% 屏幕更改为 200% 屏幕。这就是为什么它突然出错了。我只是将大小从 200% 更改为 100% 并重新启动。问题解决了。我想我会添加一个比例转换功能。
猜你喜欢
  • 2012-07-15
  • 1970-01-01
  • 2011-07-08
  • 2014-08-27
  • 2015-03-13
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-07
相关资源
最近更新 更多