Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Окно, перемещающее само себя  (Прочитано 4981 раз)
0 Пользователей и 1 Гость смотрят эту тему.
djan
Гость
« : 14-05-2008 17:12 » 

Хочу описать окно, перемещаее само себя внутри диалога (по таймеру).

Код: (C++)
class CMyBall : public CWnd
{
....
public:
        void StepIt(); // функция, которая вызываться в обработчике таймера для перемещения
.....
}

void CMyBall::StepIt()
{
        CRect rc;
        GetClientRect(rc);
        ClientToScreen(rc)
        rc.left+=5; // сдвиг на 5 пикселей
        rc.right+=5;
        MoveWindow(rc);
}
но что -то запутался в координатах. Подскажите в чем проблема?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 14-05-2008 17:52 » 

djan, я тоже парился раньше с координатами Улыбаюсь  Вывел для себя такое правило:

GetWindowRect() возвращает координаты абсолютные (то есть в "координатах монитора")
GetClientRect() возвращает координаты клиентской области окна, координаты относительные , то есть отсчитываются от левого верхнего угла окна.

Очень удобна оказалась функция АПИ
::MapWindowPoints

при помощи её хорошо проектировать координаты одного окна на координаты другого.

----------
1) всё, что требуется, сначала считаем в абсолютных координатах (если координаты - какие то другие, то для расчётов приводим к абсолютным)
2) перед MoveWindow прямоугольник приводим к относительным координатам (если дитё двигается по родителю) или оставляем как есть (для окон - диалогом, мейнфреймов)

перевести прямоугольник прямоугольник чайлда из абсолютных координат к координатам родителя можно так:
Код:
CRect a_ChildRect;
pChildWindow->GetWindowRect(&a_ChildRect);

a_ChildRect.left++;
a_ChildRect.right++;


MapWindowPoints(
 0                   //"хендл" рабочего стола
,MyParent->m_hWnd   //хендл родительского окна
,(CPoint*)&a_ChildRect  //прямоугольник чайлда в абсолютных координатах
,2
);

pChildWindow->MoveWindow(a_ChildRect,1);

- в примере контрол двинется на 1 пиксел вправо

ps кстати, не компилировал, может и наврал чего, писал по памяти , ну по ходу дела поправим, если что )
« Последнее редактирование: 14-05-2008 17:55 от Алексей1153++ » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines