Хитро-Тул

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

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

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

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


22 Ответы

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

Да вот и пример из ArcObjects Developer Help:

STDMETHODIMP CDisplayOptions::OnCreate(IDispatch * hook)
{
  if (hook == NULL)
    return E_FAIL;

  // Hold on to the application object and initialize the dialog
  m_ipApp = hook;

  m_dlgDisplayOptions.Create(NULL);
  m_dlgDisplayOptions.Put_Application(m_ipApp);
  m_bDialogInitialized = true;

  return S_OK;
}

// IToolControl
STDMETHODIMP CDisplayOptions::get_hWnd(OLE_HANDLE * hWnd)
{
  if (hWnd == NULL)
    return E_POINTER;

  // return the top leve window of the dialog
  *hWnd = (OLE_HANDLE) m_dlgDisplayOptions.GetTopLevelWindow();

  return S_OK;
}

0 голосов
ответил 15 Март, 04 от dios (5,300 баллов)
Что-то не срастается.

это код диалога

IMPLEMENT_DYNAMIC(FORM1, CDialog)

FORM1::FORM1(CWnd* pParent /*=NULL*/)
     : CDialog(FORM1::IDD, pParent)

{
}

FORM1::~FORM1()
{
}

void FORM1::DoDataExchange(CDataExchange* pDX)
{
     CDialog::DoDataExchange(pDX);
          DDX_Control(pDX, IDC_COMBO1, Combo1);
          
}
BEGIN_MESSAGE_MAP(FORM1, CDialog)
END_MESSAGE_MAP()

это header файл

#pragma once

class FORM1 : public CDialog
{
     DECLARE_DYNAMIC(FORM1)

public:
     FORM1(CWnd* pParent = NULL);           // protected constructor used by dynamic creation
     virtual ~FORM1();

public:
     enum { IDD = IDD_FORMVIEW };
protected:
     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

     DECLARE_MESSAGE_MAP()
public:
     CComboBox Combo1;
};


собственно

STDMETHODIMP CXXX::OnCreate(LPDISPATCH hook)
     {
          m_pApp = hook;
          dlg.Create(NULL,NULL);
          return S_OK;
     }

dlg это - FORM1 dlg;

Create не работает с NULL значением

У Вас переменная m_dlgDisplayOptions какой тип?
0 голосов
ответил 16 Март, 04 от Andranic (2,620 баллов)

Посмотрите пример:

<Ваш диск>:\arcgis\arcexe83\ArcObjects Developer Kit\Samples\ArcMap\Extensions\Display Extension\Visual CPP

Кусок кода мною был приведен из этого примера.

Там показана работа в том числе и с IToolControl.

Незабудьте прочитать также описание в ArcObjects Developer Help о том как запускать пример:

Закладка Содержание (Content), Samples->ArcMap->Extensions->Display Extension

0 голосов
ответил 18 Март, 04 от dios (5,300 баллов)
Это все хорошо, только как кнопки в этот combobox загнать, я имею в виду, чтобы это смотрелось не как комбобокс с кучей надписей типа кнопка1 и тд., а чтобы были реальные кнопки, как например на панели инструментов DRAW, там, где выбор чего рисовать (точки линии многоугольноки)???
0 голосов
ответил 19 Март, 04 от Andranic (2,620 баллов)

Теперь понятно что вам нужно, только причем здесь комбобокс :).

Вообщем смотрите пример Samples->Application Framework->Command Menu Control.

 

0 голосов
ответил 19 Март, 04 от dios (5,300 баллов)
Ну да. Я собственно с этого и начал.
Спасибо за попутное понимание работы с комбобоксом.
0 голосов
ответил 22 Март, 04 от Andranic (2,620 баллов)

Так проблема решена ? Или есть еще проблемы ?

0 голосов
ответил 22 Март, 04 от dios (5,300 баллов)
Принципиально я думаю путь найден, остались технические тонкости.
уз примера,
все хорошо, кроме:
CComModule _Module;

выдает при компиляции (на регистрации) (класс с iextension n iextensionconfig)

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

Program: C:\WINDOWS\system32\regsvr32.exe
File: c:\program files\microsoft visual studio .net 2003\vc7\atlmfc\include\atlbase.h
Line: 2619

Expression: _pAtlModule == 0

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

(Press Retry to debug the application)
---------------------------
Abort   Retry   Ignore   
---------------------------


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

У меня все скомплилировалось без проблем в Visual Studio 6.0.

0 голосов
ответил 23 Март, 04 от dios (5,300 баллов)
тут у меня лажа в чем:

объявлен

class CИмяклассаModule: public CAtlDllModuleT< CИмяклассаModule >
{
public:
     DECLARE_LIBID(LIBID_ИмяклассаLib)
     DECLARE_REGISTRY_APPID_RESOURCEID(IDR_Имякласса, "{4CFF05FA-B990-4524-9377-AAFC1150246C}")
};

ИмяклассаModule _AtlModule;



в Имякласса.cpp файле, причем Имякласса.h соответственно генериться автоматом.

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