2016-07-07 113 views
1

一开始,我的英语很抱歉。为什么我的鼠标光标坐标突然缩放?

我现在正在学习如何在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) 

所以基本上,这两个点,他们在传递之前上述比例进行放大。难道我不小心更改任何配置?有没有什么办法解决这一问题?我相信我没有改变我的代码。

+0

你有没有打过电话'的setTransform()' –

+0

我不约的Direct2D,但在GDI有时它发生在我忘记转换从设备坐标到逻辑坐标或反之亦然('CDC :: DPToLP'和'CDC :: LPToDP'方法)。我看到一个页面 - http://d.hatena.ne.jp/sugarontop/20121006 - 不幸的是它不是英文的,可能有一些信息给你。 – sergiol

+0

@DavidThomas我初始化时调用了这个函数,它看起来不像我的程序的原因。问题解决了,问题是我没有转换我的坐标。谢谢! – Jacob

回答

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); 
+0

谢谢!!!!!!你提供的链接解释了一切!鼠标坐标以物理像素给出,但点坐标使用Direct2D在DIP中传递给DrawLine()。问题在于我使用2个屏幕,我的系统显示设置中的文本大小为200%,另一个为100%。当我运行我的程序时,应用程序窗口出现在我的主显示屏中,并将主屏幕从100%屏幕更改为200%屏幕。这就是它突然出错的原因。我只是将尺寸从200%改为100%,然后重新启动。问题解决了。我想我会添加一个缩放转换功能。 – Jacob