Создать свою windows form для arcgis

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
ratgunter
Новоприбывший
Сообщения: 11
Зарегистрирован: 01 июл 2011, 09:53
Репутация: 0

Создать свою windows form для arcgis

Сообщение ratgunter »

Здравствуйте! как созданную обычную windows form запустить в аркгис? у меня есть созданная с помощью примера кнопка в аркгис, при нажатии на которую карта увеличивается. возможно ли в данный код еще и вставить что-то типа myform->show(), чтобы показалась моя форма?
Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: Создать свою windows form для arcgis

Сообщение Филиппов Владислав »

обязательно можно. я этим несколько лет занимался.

Код: Выделить всё

SomeForm frm = new SomeForm();
frm.Show(); // или как там в .NET
или я что-то вопроса не понял...

а так вообще вот - http://help.arcgis.com/en/sdk/10.0/arco ... _home.html
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Создать свою windows form для arcgis

Сообщение Дмитрий Барышников »

По моему, похожая тема viewtopic.php?f=16&t=9006&start=30
Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 1035
Зарегистрирован: 17 фев 2006, 06:28
Репутация: 144
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: Создать свою windows form для arcgis

Сообщение Филиппов Владислав »

кнопка уже есть и запускает готовую команду ArcMap'а, так?
вместо вызова этой команды, нужно вызывать свой код, типа что я нацарапал.
понятно, что нужно "подключить" пространство имён, в котором ваша WinForm (её класс) описана, через using, чтоб её видно было в коде кнопки, ну и запустить.
ratgunter
Новоприбывший
Сообщения: 11
Зарегистрирован: 01 июл 2011, 09:53
Репутация: 0

Re: Создать свою windows form для arcgis

Сообщение ratgunter »

все спасибо!
ratgunter
Новоприбывший
Сообщения: 11
Зарегистрирован: 01 июл 2011, 09:53
Репутация: 0

Re: Создать свою windows form для arcgis

Сообщение ratgunter »

Подскажите, как в первый код в STDMETHODIMP CZoomIn::OnClick() сделать так чтобы вызывалась форма. 2 код это основа. Просто поле builder тяжко на visual переходить...

Код: Выделить всё

// ZoomIn.cpp : Implementation of CZoomIn
#include "stdafx.h"
#include "ZoomIn.h"
#include "MyForm.h"
// CZoomIn
STDMETHODIMP CZoomIn::get_Enabled(VARIANT_BOOL * Enabled)
{
  if (Enabled == NULL)
    return E_POINTER;
  *Enabled = VARIANT_TRUE;   // Enable the tool always
  return S_OK;
}
STDMETHODIMP CZoomIn::get_Checked(VARIANT_BOOL * Checked)
{
  if (Checked == NULL)
  return E_POINTER;
}
STDMETHODIMP CZoomIn::get_Name(BSTR * Name)
{
  if (Name == NULL)
    return E_POINTER;
  *Name = ::SysAllocString(L"ZoomIn x 0.5 VC8");
  return S_OK;
}
STDMETHODIMP CZoomIn::get_Caption(BSTR * Caption)
{
  if (Caption == NULL)
    return E_POINTER;
  *Caption = ::SysAllocString(L"ZoomIn x 0.5 VC8");
  return S_OK;
}
STDMETHODIMP CZoomIn::get_Tooltip(BSTR * Tooltip)
{
  if (Tooltip == NULL)
	  return E_POINTER;
  *Tooltip = ::SysAllocString(L"увеличить");
  return S_OK;
}
STDMETHODIMP CZoomIn::get_Message(BSTR * Message)
{
  if (Message == NULL)
    return E_POINTER; 
  *Message = ::SysAllocString(L"This is my custom tool");
  return S_OK;
}
STDMETHODIMP CZoomIn::get_HelpFile(BSTR * HelpFile)
{
  if (HelpFile == NULL)
    return E_POINTER;
  return E_NOTIMPL;
}
STDMETHODIMP CZoomIn::get_HelpContextID(long * helpID)
{
  //if (HelpContextID == NULL)
    return E_POINTER;
}
STDMETHODIMP CZoomIn::get_Category(BSTR * Category)
{
  if (Category == NULL)
    return E_POINTER;
  *Category = ::SysAllocString(L"Developer Samples");
  return S_OK;
}
STDMETHODIMP CZoomIn::get_Bitmap(OLE_HANDLE * Bitmap)
{
  if (Bitmap == NULL)
    return E_POINTER;
  *Bitmap = (OLE_HANDLE) m_hBitmap;
   return S_OK;
}
STDMETHODIMP CZoomIn::OnCreate(IDispatch * hook)
{
  m_ipHookHelper.CreateInstance(CLSID_HookHelper);
  HRESULT hr = m_ipHookHelper->putref_Hook(hook);
  return hr;
}
STDMETHODIMP CZoomIn::OnClick()
{
  //HRESULT checking omitted for clarity
  IActiveViewPtr ipActiveView;
  m_ipHookHelper->get_ActiveView(&ipActiveView);
  IEnvelopePtr ipEnv;
  ipActiveView->get_Extent(&ipEnv);
  ipEnv->Expand(0.5, 0.5,VARIANT_TRUE);
  ipActiveView->put_Extent(ipEnv);
  ipActiveView->Refresh();
  //MyForm->Show();
  return S_OK;
}

ОСНОВА:

Код: Выделить всё

// ZoomIn.h : Declaration of the CZoomIn
#pragma once
#include "resource.h"       // main symbols
#include "C:\Program Files (x86)\ArcGIS\include\CatIDs\ArcCATIDs.h"
#include "MyForm.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
#endif
// IZoomIn
[
  object,
  uuid("29B86643-9195-427B-9894-1C73C1F2A680"),
  helpstring("IZoomIn Interface"),
  pointer_default(unique)
]
__interface IZoomIn : IUnknown
{
};
// CZoomIn
[
  coclass,
  default(IZoomIn),
  threading(apartment),
  vi_progid("Walkthrough1VC8.ZoomIn"),
  progid("Walkthrough1VC8.ZoomIn.1"),
  version(1.0),
  uuid("B74AA17B-2192-48E3-B0C2-BF0396AFC98C"),
  helpstring("ZoomIn Class"),
  implements_category(__uuidof(CATID_MxCommands)),
  implements_category(__uuidof(CATID_ControlsCommands))
]
class ATL_NO_VTABLE CZoomIn :
  public IZoomIn,
  public ICommand
{
  private:
    HBITMAP    m_hBitmap;
	IHookHelperPtr    m_ipHookHelper;
  public:
	//CZoomIn()
	//{
	//}
	CZoomIn::CZoomIn()
    {
      m_hBitmap = ::LoadBitmap(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDB_BITMAP1));
    }
    CZoomIn::~CZoomIn()
    {
      DeleteObject(m_hBitmap);
    }
	DECLARE_PROTECT_FINAL_CONSTRUCT()
	HRESULT FinalConstruct()
	{
      return S_OK;
	}
	void FinalRelease()
	{
	}
  // ICommand Methods
  public:
    STDMETHOD(get_Enabled)(VARIANT_BOOL * Enabled);
	STDMETHOD(get_Checked)(VARIANT_BOOL * Checked);
	STDMETHOD(get_Name)(BSTR * Name);
	STDMETHOD(get_Caption)(BSTR * Caption);
	STDMETHOD(get_Tooltip)(BSTR * Tooltip);
	STDMETHOD(get_Message)(BSTR * Message);
	STDMETHOD(get_HelpFile)(BSTR * HelpFile);
	STDMETHOD(get_HelpContextID)(long * helpID);
	STDMETHOD(get_Bitmap)(OLE_HANDLE * Bitmap);
	STDMETHOD(get_Category)(BSTR * categoryName);
	STDMETHOD(OnCreate)(LPDISPATCH hook);
	STDMETHOD(OnClick)();
};
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Создать свою windows form для arcgis

Сообщение Дмитрий Барышников »

Какая такая форма?
MessageBox подойдет?
ratgunter
Новоприбывший
Сообщения: 11
Зарегистрирован: 01 июл 2011, 09:53
Репутация: 0

Re: Создать свою windows form для arcgis

Сообщение ratgunter »

не подойдет. обычная форма с кнопками.
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Создать свою windows form для arcgis

Сообщение Дмитрий Барышников »

Ну так давайте код формы в студию или я должен догадаться какие кнопки и поля ввода вам нужны? Или хотябы описание ентой формы (типа, кнопка ОК и поле ввода).
ratgunter
Новоприбывший
Сообщения: 11
Зарегистрирован: 01 июл 2011, 09:53
Репутация: 0

Re: Создать свою windows form для arcgis

Сообщение ratgunter »

главное вывести просто форму. это код формы:

Код: Выделить всё

#pragma once
#include "ZoomIn.h" 
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;


namespace Walkthrough1VC8 {

	/// <summary>
	/// Summary for MyForm
	///
	/// WARNING: If you change the name of this class, you will need to change the
	///          'Resource File Name' property for the managed resource compiler tool
	///          associated with all .resx files this class depends on.  Otherwise,
	///          the designers will not be able to interact properly with localized
	///          resources associated with this form.
	/// </summary>
	public ref class MyForm : public System::Windows::Forms::Form
	{
	public:
		MyForm(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
		}

	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~MyForm()
		{
			if (components)
			{
				delete components;
			}
		}

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			this->components = gcnew System::ComponentModel::Container();
			this->Size = System::Drawing::Size(300,300);
			this->Text = L"MyForm";
			this->Padding = System::Windows::Forms::Padding(0);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
        }
#pragma endregion
	};
}
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Создать свою windows form для arcgis

Сообщение Дмитрий Барышников »

Попробуйте так, но предупреждаю что вы мешаете вместе управляемый (managed) и неуправляемый (unmanaged) код.

Код: Выделить всё


STDMETHODIMP CZoomIn::OnClick()
{
MyForm^ frm = gcnew MyForm;
#ifdef 1
frm->ShowDialog();
#else
frm->Show();
#ednif

//HRESULT checking omitted for clarity
IActiveViewPtr ipActiveView;
m_ipHookHelper->get_ActiveView(&ipActiveView);
IEnvelopePtr ipEnv;
ipActiveView->get_Extent(&ipEnv);
ipEnv->Expand(0.5, 0.5,VARIANT_TRUE);
ipActiveView->put_Extent(ipEnv);
ipActiveView->Refresh();

return S_OK;
}
ratgunter
Новоприбывший
Сообщения: 11
Зарегистрирован: 01 июл 2011, 09:53
Репутация: 0

Re: Создать свою windows form для arcgis

Сообщение ratgunter »

вот такие ошибки появились :(

Код: Выделить всё

1>.\ZoomIn.cpp(79) : error C2065: 'MyForm' : undeclared identifier
1>.\ZoomIn.cpp(79) : error C2065: 'frm' : undeclared identifier
1>.\ZoomIn.cpp(79) : error C2061: syntax error : identifier 'MyForm'
1>.\ZoomIn.cpp(80) : fatal error C1016: #if[n]def expected an identifier
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Создать свою windows form для arcgis

Сообщение Дмитрий Барышников »

Первые три ошибки потому что вы #include "где у вас лежит хэдер кода с формой" не сделали.
Последняя - потому что я вам предложил на выбор два варианта показа окна - нужно было один оставить.
Здесь копипаст не поможет и надо включить мозг. Вы бы хоть почитали про managed языки и как программировать.
ratgunter
Новоприбывший
Сообщения: 11
Зарегистрирован: 01 июл 2011, 09:53
Репутация: 0

Re: Создать свою windows form для arcgis

Сообщение ratgunter »

так вот же есть #include "MyForm.h" :?: в 4 строке

Код: Выделить всё

// ZoomIn.cpp : Implementation of CZoomIn
#include "stdafx.h"
#include "ZoomIn.h"
#include "MyForm.h"
// CZoomIn
STDMETHODIMP CZoomIn::get_Enabled(VARIANT_BOOL * Enabled)
{
  if (Enabled == NULL)
    return E_POINTER;
  *Enabled = VARIANT_TRUE;   // Enable the tool always
  return S_OK;
}
STDMETHODIMP CZoomIn::get_Checked(VARIANT_BOOL * Checked)
{
  if (Checked == NULL)
  return E_POINTER;
}
STDMETHODIMP CZoomIn::get_Name(BSTR * Name)
{
  if (Name == NULL)
    return E_POINTER;
  *Name = ::SysAllocString(L"ZoomIn x 0.5 VC8");
  return S_OK;
}
STDMETHODIMP CZoomIn::get_Caption(BSTR * Caption)
{
  if (Caption == NULL)
    return E_POINTER;
  *Caption = ::SysAllocString(L"ZoomIn x 0.5 VC8");
  return S_OK;
}
STDMETHODIMP CZoomIn::get_Tooltip(BSTR * Tooltip)
{
  if (Tooltip == NULL)
     return E_POINTER;
  *Tooltip = ::SysAllocString(L"увеличить");
  return S_OK;
}
STDMETHODIMP CZoomIn::get_Message(BSTR * Message)
{
  if (Message == NULL)
    return E_POINTER; 
  *Message = ::SysAllocString(L"This is my custom tool");
  return S_OK;
}
STDMETHODIMP CZoomIn::get_HelpFile(BSTR * HelpFile)
{
  if (HelpFile == NULL)
    return E_POINTER;
  return E_NOTIMPL;
}
STDMETHODIMP CZoomIn::get_HelpContextID(long * helpID)
{
  //if (HelpContextID == NULL)
    return E_POINTER;
}
STDMETHODIMP CZoomIn::get_Category(BSTR * Category)
{
  if (Category == NULL)
    return E_POINTER;
  *Category = ::SysAllocString(L"Developer Samples");
  return S_OK;
}
STDMETHODIMP CZoomIn::get_Bitmap(OLE_HANDLE * Bitmap)
{
  if (Bitmap == NULL)
    return E_POINTER;
  *Bitmap = (OLE_HANDLE) m_hBitmap;
   return S_OK;
}
STDMETHODIMP CZoomIn::OnCreate(IDispatch * hook)
{
  m_ipHookHelper.CreateInstance(CLSID_HookHelper);
  HRESULT hr = m_ipHookHelper->putref_Hook(hook);
  return hr;
}
STDMETHODIMP CZoomIn::OnClick()
{
  //HRESULT checking omitted for clarity
  IActiveViewPtr ipActiveView;
  m_ipHookHelper->get_ActiveView(&ipActiveView);
  IEnvelopePtr ipEnv;
  ipActiveView->get_Extent(&ipEnv);
  ipEnv->Expand(0.5, 0.5,VARIANT_TRUE);
  ipActiveView->put_Extent(ipEnv);
  ipActiveView->Refresh();
  //MyForm->Show();
  return S_OK;
}
Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Создать свою windows form для arcgis

Сообщение Дмитрий Барышников »

Сорри - не обратил внимание, что у вас форма в namespace.
Тут 2 варианта:
1) using namespace Walkthrough1VC8;
2) Walkthrough1VC8::MyForm ^frm = gcnew Walkthrough1VC8::MyForm;

Например:

Код: Выделить всё


using namespace Walkthrough1VC8;
#define SD
STDMETHODIMP CZoomIn::OnClick()
{
MyForm ^frm = gcnew MyForm;
#ifdef SD
frm->ShowDialog();
#else
frm->Show();
#ednif

//HRESULT checking omitted for clarity
IActiveViewPtr ipActiveView;
m_ipHookHelper->get_ActiveView(&ipActiveView);
IEnvelopePtr ipEnv;
ipActiveView->get_Extent(&ipEnv);
ipEnv->Expand(0.5, 0.5,VARIANT_TRUE);
ipActiveView->put_Extent(ipEnv);
ipActiveView->Refresh();

return S_OK;
}
Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость