::Главная страница :: С++/Си :: Статьи ___ Как разрешить перетаскивание окна за любую точку?

Еще раз о перетаскивании мышью окна за любую точку

Алексей Фоголь.

Увидев статью Алексея Кирюшкина "Как разрешить перетаскивание окна за любую точку?" я заинтересовался его решением этой задачи и решил прочитать. Второй способ, несомненно, представляет интерес. И, скорее всего, я применю именно его в своем приложении. На данный момент я решил подобную задачу "в лоб", т.е. по первому методу, описанному в статье.

Но хочу добавить некоторые комментарии, основанные на опыте "вылизывания" кода и использования его совместно с другими разработанными механизмами.

Итак, первая моя реализация была подобна предложенной Алексеем Кирюшкиным. Главноеотличие состояло в том, что я запрашивал положение окна не в начале перетаскивания, а каждый раз при перемещении мыши. Хорошо это или плохо? Плохо - приходится затрачивать дополнительные ресурсы. Хорошо - я перемещаю окно независимо от того, кто там его еще перемещает. Хотя, попытка подставить этот код себе в программу показала, что он работает ни чуть ни хуже моего...

Используемый на данный момент мной код выглядит так:

void CCoolDialog::OnLButtonDown(UINT nFlags, CPoint point)
{
if(!m_bMove)
{
// Begin moving window
m_bMove = TRUE;
SetCapture();
// ClientToScreen(&point);
m_cDownPos = point;

m_pDockingLayout->Begin(GetSafeHwnd());
}

CDialog::OnLButtonDown(nFlags, point);
}

void CCoolDialog::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_bMove)
{
// End moving window
ReleaseCapture();
m_bMove = FALSE;
m_pDockingLayout->End(GetSafeHwnd());
}

CDialog::OnLButtonUp(nFlags, point);
}

void CCoolDialog::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bMove)
{
// ClientToScreen(&point);

// Move window
CRect rect;
GetWindowRect(&rect);
rect.OffsetRect(point - m_cDownPos);
MoveWindow(&rect);
// m_cLastPos = point;
}

CDialog::OnMouseMove(nFlags, point);
}

Как видите, в нем еще остались следы старого кода. В чем основное отличие? Я не привожу положение мыши к экранным координатам! Первоначальный вариант моего кода работал "в лоб": на сколько надо переместить окно? На столько, на сколько мышь переместилась относительно своего последнего положения. Причем, положение в экранных координатах. Вот только это несколько неккоректно работало... После чего, доволно долго подумав, я пришел к решению, что смещение можно считать и относительно клиентской части окна! Т.е. надо "подтягивать" окно, так чтобы мышь находилась всегда над той точкой, над которую она кликнула.

Какой вариант лучше? Смотрите сами...

С уважением, Алексей Фоголь.
alex_fogol@mail.ru

Тематические ссылки
Ваша ссылка Ваша ссылка

Обмен кнопками, ведение статистики, реклама.