На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

t3dOpen()

Поиск  Пользователи  Правила  Войти
Форум » Linux » Средства разработки ГИС-приложений для Linux
Страницы: Пред. 1 2
RSS
t3dOpen()
 
Не могу понять никак зачем он Вам нужен?
В Linux-версиях при вызове функции MSGHANDLER в параметр hwnd указывается 0.
Этот параметр оставлен для совместимости исходных текстов с Windows: там это идентификатор окна, которому посылается сообщение.
 
В Linux MSGHANDLER определен следующим образом:
Код
typedef long int (* MSGHANDLER)(long int hwnd, long int code, long int p1, long int p2, long int typemsg);
То есть этот указатель на функцию, которая вызывается при  поступлении сообщений от 3D окна. Типы обрабатываемых сообщений определяются типом синхронизации (CREATETASK3D::MoveAdjust), а идентифицируются они в обработчике кодами, которые задаются в следующих параметрах: CREATETASK3D::CmStop3d, CREATETASK3D::CmMove3d и др. По заданным в вышеуказанных параметрах кодам сообщения дифференцируются при обработке. Пример заполнения CREATETASK3D:
Код
CREATETASK3D parmtask3d;
memset(&parmtask3d,0,sizeof(CREATETASK3D));
parmtask3d.MoveAdjust       = sync;
parmtask3d.Area             = 2;
parmtask3d.CmStop3d         = FINISH_3D;
parmtask3d.CmMove3d         = MOVE_3D;
parmtask3d.CmScale3d        = SCALE_3D;
parmtask3d.CmSelectFrame3d  = SELECT_FRAME_3D;
parmtask3d.CmSelectObject3d = SELECT_OBJECT_3D;

enum MESSAGE_3D {FINISH_3D=3012, MOVE_3D, SCALE_3D,
                 SELECT_FRAME_3D, SELECT_OBJECT_3D};
У меня есть необходимость знать о закрытии 3D-окна (когда это делается при помощи крестика в правом верхнем углу или при помоши Alt-F4). Для этого я передаю в MSGHANDLER свою функцию, который будет вызываться для обработки сообщений. Этот функция является методом класса MapWidget (MapWidget::Handler3D()). Внутри этого метода происходит вызов
this->close3Dwindow(), который призван корректно завершить работу 3D окна (в частности вызвать t3dClose()). Однако при автоматическом вызове этого метода по указателю, переданному 3D окну, this == null.
Я решил сохранять указатель this в статическую переменную. Однако я предполагаю, что прикладная задача может использовать несколько объектов классса MapWidget => мне нуже статический контейнер, содержащий набор указателей this для всех объектов класса MapWidget. Тоесть имеем следующую ситуацию Есть объекты класса MapWidget: mw1, mw2 и тд. Для каждого из них может быть открыто отдельное 3D-окно.
Теперь появился следующий вопрос: при вызове MapWidget::Handler3D, мне надо понять какое из открытых 3D окон закрывается. В этот  метод передается hwnd - идентификатор окна. Далее мне по hwnd надо определить какой из объектов MapWidget соответствует данному hwnd. Для этого я хочу при создании каждого нового 3D-окна сохранять пары {hwnd, MapWidget*}, чтобы при попадании  в MapWidget::Handler3D() просто осуществить поиск по hwnd, получить нужный объект MapWidget и для него вызвать метод, завершающий работу окна.
Вот почему мне необходимо получить hwnd при создании 3D-окна.
 
Понял смысл.
К сожалению на один момент времени может существовать только один экземпляр 3D-окна. При попытке повторно открыть 3D-окно будет удален экземпляр предыдущего окна и создано новое.
 
Каждый объект класса MapWidget работает со совей картой, то есть имеет свой HMAP. Для разных HMAP все равно будет только одно 3D окно?
Страницы: Пред. 1 2
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности