2016-07-07 110 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