В 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-окна.