Хитро-Тул

0 голосов
спросил 09 Март, 04 от dios (5,300 баллов) в категории Программные продукты Esri
Утро/День/Вечер/Ночь добрый(ое,ая)

Вопрос таков:

Чтобы создать инструмет необходимы два интерфейса: ITOOL & ICOMMAND.

А что необходимо, чтобы создать элемент управления, такой, как выбор фигуры(new rectancle, new polygon etc.) или выбор подписи(new text, new label etc.) на панели "DRAW". Несколько инструментов, объединенных в один элемент управления с выбором?


22 Ответы

0 голосов
ответил 09 Март, 04 от dios (5,300 баллов)
Какой для этого служит интерфейс?
0 голосов
ответил 09 Март, 04 от Andranic (2,620 баллов)
IToolControl
0 голосов
ответил 10 Март, 04 от dios (5,300 баллов)
А можно по-подробнее.

Приварил я к инструменту (ITOOL + ICOMMAND) ITOOLCONTROL

     STDMETHODIMP CCLASS::get_hWnd(esriCore::OLE_HANDLE * hWnd)
     {
          return S_OK;
     }
     STDMETHODIMP CCLASS::OnFocus(esriCore::ICompletionNotify * complete)
     {
          return S_OK;
     }

     STDMETHODIMP CCLASS::OnDrop(esriCore::esriCmdBarType barType, VARIANT_BOOL * bValid)
     {
          return S_OK;
     }

как мне повесить три инструмента в одну кнопку с выбором на панели инструментов?
0 голосов
ответил 10 Март, 04 от Andranic (2,620 баллов)

В методе интерфейса IToolControl hWnd (get_hWnd) передайте Hwnd вашего комбобокса.

Дальше обрабытывая события вашего комбобокса, OnClick скажем, анализируем выбранное в комбобоксе значение и активируем соответствующий инструмент.

А вот приваривать IToolControl к ITool не надо.

Имплементируйте два интерфейса ICommand и IToolControl. и посмотрите наконец примеры в документации (ArcObject Developer Help) :).

 

0 голосов
ответил 10 Март, 04 от dios (5,300 баллов)
Ok сделал ICOMMAND + ITOOLCONTROL

с hWnd запарка.

Как это все на сях сделать.
я сделал форму, повесил на нее CCOMBOBOX
только как с него hWnd получить?

(а хелп я уще задолбался читать, с моим англицким)
0 голосов
ответил 10 Март, 04 от Andranic (2,620 баллов)

Чего же вы на С полезли писать если не знаете как hwnd получить. Может быть имеет смысл тогда перейти на Basic :) ?

Вы переменную типа CComboBox объявили ?

У нее есть m_hwnd это и есть handle этого комбобокса.

0 голосов
ответил 10 Март, 04 от dios (5,300 баллов)
     STDMETHODIMP CCLASS::get_hWnd(esriCore::OLE_HANDLE * hWnd)
     {
          FORM1 ddd;
          * hWnd = (esriCore::OLE_HANDLE)ddd.Combo1.m_hWnd;
          return S_OK;
     }
ddd не инициализированна, соответственно hWnd пустой
0 голосов
ответил 10 Март, 04 от Andranic (2,620 баллов)
Потому что, для того что вы написали ddd - есть просто объект. Для того чтобы это стало окном и система выдала ему hwnd необходимо его создать. Есть несколько способов создания окна. См. например. функцию Create класса СWnd или CDialog например.
0 голосов
ответил 11 Март, 04 от dios (5,300 баллов)
FORM1 это класс CFormView на котором висит combobox
можно и CDialog создать, только как его инициализировать?

FORM1 ddd;
          ddd.Create;
          * hWnd = (esriCore::OLE_HANDLE)ddd.Combo1.m_hWnd;
          return S_OK;

hWnd = 0x00000000
0 голосов
ответил 11 Март, 04 от Andranic (2,620 баллов)

Я же написал, используте Create для создания CDialog, после вызова этой функции посмотрите в дебагере что вашему диалогу присвоен hwnd. CFormView я вообще не понимаю зачем вам нужен в вашей задаче. Вы какой вообще проект в С++ создаете ?

Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...