|
::Главная страница :: С++/Си :: Статьи ___ Как разрешить перетаскивание окна за любую точку? |
Еще раз о перетаскивании мышью окна за любую точку
Алексей Фоголь.
Увидев статью Алексея Кирюшкина "Как разрешить перетаскивание окна за любую точку?" я заинтересовался его решением этой задачи и решил прочитать. Второй способ, несомненно, представляет интерес. И, скорее всего, я применю именно его в своем приложении. На данный момент я решил подобную задачу "в лоб", т.е. по первому методу, описанному в статье.
Но хочу добавить некоторые комментарии, основанные на опыте "вылизывания" кода и использования его совместно с другими разработанными механизмами.
Итак, первая моя реализация была подобна предложенной Алексеем Кирюшкиным. Главноеотличие состояло в том, что я запрашивал положение окна не в начале перетаскивания, а каждый раз при перемещении мыши. Хорошо это или плохо? Плохо - приходится затрачивать дополнительные ресурсы. Хорошо - я перемещаю окно независимо от того, кто там его еще перемещает. Хотя, попытка подставить этот код себе в программу показала, что он работает ни чуть ни хуже моего...
Используемый на данный момент мной код выглядит так:
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
Тематические
ссылки
|
Ваша ссылка | Ваша ссылка |
Обмен кнопками, ведение статистики, реклама. |
|||