Создать свою windows form для arcgis
-
- Новоприбывший
- Сообщения: 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, чтоб её видно было в коде кнопки, ну и запустить.
-
- Новоприбывший
- Сообщения: 11
- Зарегистрирован: 01 июл 2011, 09:53
- Репутация: 0
Re: Создать свою windows form для arcgis
все спасибо!
-
- Новоприбывший
- Сообщения: 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
- Откуда: Москва
-
- Новоприбывший
- Сообщения: 11
- Зарегистрирован: 01 июл 2011, 09:53
- Репутация: 0
Re: Создать свою windows form для arcgis
не подойдет. обычная форма с кнопками.
- Дмитрий Барышников
- Гуру
- Сообщения: 2572
- Зарегистрирован: 17 ноя 2009, 19:17
- Репутация: 261
- Откуда: Москва
Re: Создать свою windows form для arcgis
Ну так давайте код формы в студию или я должен догадаться какие кнопки и поля ввода вам нужны? Или хотябы описание ентой формы (типа, кнопка ОК и поле ввода).
-
- Новоприбывший
- Сообщения: 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;
}
-
- Новоприбывший
- Сообщения: 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 языки и как программировать.
-
- Новоприбывший
- Сообщения: 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;
}
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость