Создать свою windows form для arcgis
- 
				ratgunter
 - Новоприбывший
 - Сообщения: 11
 - Зарегистрирован: 01 июл 2011, 09:53
 - Репутация: 0
 
Создать свою windows form для arcgis
Здравствуйте! как созданную обычную windows form запустить в аркгис? у меня есть созданная с помощью примера кнопка в аркгис, при нажатии на которую карта увеличивается. возможно ли в данный код еще и вставить что-то типа myform->show(), чтобы показалась моя форма?
			
			
									
						
										
						- Филиппов Владислав
 - Гуру
 - Сообщения: 1035
 - Зарегистрирован: 17 фев 2006, 06:28
 - Репутация: 144
 - Ваше звание: Геннадич
 - Откуда: Новосибирск
 - Контактная информация:
 
Re: Создать свою windows form для arcgis
обязательно можно. я этим несколько лет занимался.
или я что-то вопроса не понял...
а так вообще вот - http://help.arcgis.com/en/sdk/10.0/arco ... _home.html
			
			
									
						
										
						Код: Выделить всё
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, чтоб её видно было в коде кнопки, ну и запустить.
			
			
									
						
										
						вместо вызова этой команды, нужно вызывать свой код, типа что я нацарапал.
понятно, что нужно "подключить" пространство имён, в котором ваша WinForm (её класс) описана, через using, чтоб её видно было в коде кнопки, ну и запустить.
- 
				ratgunter
 - Новоприбывший
 - Сообщения: 11
 - Зарегистрирован: 01 июл 2011, 09:53
 - Репутация: 0
 
Re: Создать свою windows form для arcgis
все спасибо!
			
			
									
						
										
						- 
				ratgunter
 - Новоприбывший
 - Сообщения: 11
 - Зарегистрирован: 01 июл 2011, 09:53
 - Репутация: 0
 
Re: Создать свою windows form для arcgis
Подскажите, как в первый код в 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
 - Откуда: Москва
 
- 
				ratgunter
 - Новоприбывший
 - Сообщения: 11
 - Зарегистрирован: 01 июл 2011, 09:53
 - Репутация: 0
 
Re: Создать свою windows form для arcgis
не подойдет. обычная форма с кнопками.
			
			
									
						
										
						- Дмитрий Барышников
 - Гуру
 - Сообщения: 2572
 - Зарегистрирован: 17 ноя 2009, 19:17
 - Репутация: 261
 - Откуда: Москва
 
Re: Создать свою windows form для arcgis
Ну так давайте код формы в студию или я должен догадаться какие кнопки и поля ввода вам нужны? Или хотябы описание ентой формы (типа, кнопка ОК и поле ввода).
			
			
									
						
										
						- 
				ratgunter
 - Новоприбывший
 - Сообщения: 11
 - Зарегистрирован: 01 июл 2011, 09:53
 - Репутация: 0
 
Re: Создать свою windows form для arcgis
главное вывести просто форму. это код формы:
			
			
									
						
										
						Код: Выделить всё
#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
вот такие ошибки появились 
 
			
			
									
						
										
						Код: Выделить всё
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 языки и как программировать.
			
			
									
						
										
						Последняя - потому что я вам предложил на выбор два варианта показа окна - нужно было один оставить.
Здесь копипаст не поможет и надо включить мозг. Вы бы хоть почитали про managed языки и как программировать.
- 
				ratgunter
 - Новоприбывший
 - Сообщения: 11
 - Зарегистрирован: 01 июл 2011, 09:53
 - Репутация: 0
 
Re: Создать свою windows form для arcgis
так вот же есть #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;
Например:
			
			
									
						
										
						Тут 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;
}Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей