Почему координаты курсора мыши внезапно масштабируются?

Вначале извините за мой английский.

Сейчас я учусь создавать приложение MFC в Visual Studio 2015. Я использую 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)

Итак, по сути, эти два пункта выше масштабируются перед их передачей. Могу ли я случайно изменить какие-либо конфигурации? Есть ли способ исправить это? Я уверен, что не менял свой код.


person Jacob    schedule 07.07.2016    source источник
comment
Вы пробовали позвонить SetTransform()   -  person David Thomas    schedule 08.07.2016
comment
Я не про Direct2D, но в GDI иногда случается, что я забываю преобразование координат устройства в логические координаты или наоборот (CDC::DPToLP и CDC::LPToDPmethods). Я видел страницу - d.hatena.ne.jp/sugarontop/20121006 - к сожалению, он не на английском языке, поэтому здесь может быть некоторая информация для вас.   -  person sergiol    schedule 08.07.2016
comment
@DavidThomas Я вызвал эту функцию при инициализации, это не похоже на причину моей программы. Проблема решена, проблема в том, что я не преобразовал свои координаты. Спасибо!   -  person Jacob    schedule 08.07.2016
comment
@sergiol вы правы, я не конвертировал свои координаты. Спасибо!   -  person Jacob    schedule 08.07.2016


Ответы (1)


Координаты для DrawLine указаны в независимых от устройства пикселях. См. Также DPI и независимые от устройства пиксели

Вероятно, вы изменили размер клиентского прямоугольника, его нужно скорректировать. Попробуйте также изменить размер окна и посмотреть, правильно ли оно получает координаты.

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);
person Barmak Shemirani    schedule 07.07.2016
comment
Спасибо!!!!!! Ссылка, которую вы предоставили, все объясняет! Координаты мыши задаются в физических пикселях, но координаты точек передаются в DrawLine () в DIP с помощью Direct2D. Проблема в том, что я использую 2 экрана, размер текста в настройках отображения моей системы составляет 200% для одного и 100% для другого. Окно приложения появляется на моем основном дисплее, когда я запускаю свою программу, и я изменил основной дисплей с экрана 100% на экран 200%. Вот почему все вдруг пошло не так. Я просто изменил размер с 200% на 100% и перезапустил. Проблема решена. Думаю добавлю функцию преобразования масштаба. - person Jacob; 08.07.2016