About the Multivariate renderer Sample
[C#]
MultivariateRendPropPage.cs
using System; using System.Collections; using System.Data; using System.Diagnostics; using System.Drawing; using System.Runtime.InteropServices; using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.CartoUI; using ESRI.ArcGIS.Framework; using ESRI.ArcGIS.esriSystem; using ESRI.ArcGIS.ADF.BaseClasses; using ESRI.ArcGIS.ADF.CATIDs; namespace MultivariateRenderers { [Guid("FE338F20-B39C-49B8-9F28-FAC2F0DE0C0D")] [ClassInterface(ClassInterfaceType.None)] [ComVisible(true)] [ProgId("MultiVariateRenderers.MultivariateRendPropPageCS")] public class MultivariateRendPropPageCS : IComPropertyPage, IComEmbeddedPropertyPage, IRendererPropertyPage { // custom renderer property page class for MultivariateRenderer // a renderer property page must implement these interfaces: [DllImport("gdi32.dll")] private extern static bool DeleteObject(IntPtr hObject); private PropPageForm m_Page; private IFeatureRenderer m_pRend; private long m_Priority; private System.Drawing.Bitmap m_bitmap; private IntPtr m_hBitmap; public MultivariateRendPropPageCS() { //'MsgBox("New (color prop page)") m_Page = new PropPageForm(); m_Priority = 550; // 5th category is for multiple attribute renderers string[] res = typeof(MultivariateRendPropPageCS).Assembly.GetManifestResourceNames(); if (res.GetLength(0) > 0) { try { string bitmapResourceName = GetType().Name + ".bmp"; //creating a new bitmap m_bitmap = new Bitmap(GetType(), bitmapResourceName); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap"); } if (m_bitmap != null) { m_bitmap.MakeTransparent(m_bitmap.GetPixel(1, 1)); m_hBitmap = m_bitmap.GetHbitmap(); } } } ~MultivariateRendPropPageCS() { if (m_hBitmap.ToInt32() != 0) DeleteObject(m_hBitmap); } #region Component Category Registration [ComRegisterFunction()] public static void Reg(string regKey) { RendererPropertyPages.Register(regKey); } [ComUnregisterFunction()] public static void Unreg(string regKey) { RendererPropertyPages.Unregister(regKey); } #endregion public int Activate() { return m_Page.Handle.ToInt32(); } public bool Applies(ESRI.ArcGIS.esriSystem.ISet objects) { object pObj = null; if (objects.Count <= 0) { return false; return false; } objects.Reset(); pObj = objects.Next(); while (! (pObj is IFeatureRenderer)) { pObj = objects.Next(); if (pObj == null) { return false; return false; } } return (pObj is IMultivariateRenderer); } public void Apply() { QueryObject(m_pRend); } public void Cancel() { // doing nothing discards any changes made on the page since last Apply. this is // what we want. } public void Deactivate() { // Unload m_Page in VB6 } public int Height { get { //MsgBox("Height") return m_Page.Height; } } public int get_HelpContextID(int controlID) { return 0; } public string HelpFile { get { return null; } } public void Hide() { m_Page.Hide(); } public bool IsPageDirty { get { // check flag on form to see if page is dirty // this tells the property sheet whether or not to redraw page return m_Page.IsDirty; } } public IComPropertyPageSite PageSite { set { m_Page.PageSite = value; } } public int Priority { get { return (int)m_Priority; } set { m_Priority = value; } } public void SetObjects(ESRI.ArcGIS.esriSystem.ISet objects) { // supplies the page with the object(s) to be edited including the map, feature layer, // feature class, and renderer // note: the feature renderer passed in as part of Objects is the one created // in CreateCompatibleObject object pObj = null; if (objects.Count <= 0) return; objects.Reset(); pObj = objects.Next(); IMap pMap = null; IGeoFeatureLayer pGeoLayer = null; // in this implementation we need info from the map and the renderer while (pObj != null) { if (pObj is IMap) pMap = pObj as IMap; if (pObj is IGeoFeatureLayer) pGeoLayer = pObj as IGeoFeatureLayer; if (pObj is IFeatureRenderer) m_pRend = pObj as IFeatureRenderer; pObj = objects.Next(); } if ((pMap != null) & (pGeoLayer != null) & (m_pRend != null)) { m_Page.InitControls(m_pRend as IMultivariateRenderer, pMap, pGeoLayer); } } public void Show() { m_Page.Show(); } public string Title { get { return m_Page.Name; } set { m_Page.Name = value; } } public int Width { get { return m_Page.Width; } } public object CreateCompatibleObject(object kind) { // check to see if the renderer is compatible with the property page... // ...if so, return the renderer. If not, create a new one. IFeatureRenderer pFeatRend = null; if ((kind is IMultivariateRenderer) & (kind != null)) pFeatRend = kind as IFeatureRenderer; else { // create a new MultivariateRenderer pFeatRend = new MultivariateRenderer(); } return pFeatRend; } public void QueryObject(object theObject) { // triggered when OK or Apply is pressed on the property page IFeatureRenderer pRend = null; if ((theObject is IMultivariateRenderer) & (theObject != null)) { pRend = theObject as IFeatureRenderer; m_Page.InitRenderer(pRend as IMultivariateRenderer); } } public bool CanEdit(IFeatureRenderer obj) { return (obj is IMultivariateRenderer); } ESRI.ArcGIS.esriSystem.UID IRendererPropertyPage.ClassID { get { return ClassID1; } } public ESRI.ArcGIS.esriSystem.UID ClassID1 { get { // return prog id of the property page object UID pUID = new UID(); pUID.Value = "MultivariateRenderers.MultivariateRendPropPageCS"; return pUID; } } public string Description { get { // appears on ArcMap symbology property page return "Display features with multivariate symbology"; } } public string Name { get { return "Multivariate Renderer CS"; } } public int PreviewImage { get { return m_hBitmap.ToInt32(); } } public ESRI.ArcGIS.esriSystem.UID RendererClassID { get { UID pUID = new UID(); pUID.Value = "MultivariateRenderers.MultivariateRendererCS"; return pUID; } } public string Type { get { // text that appears for category in "Show" tree view // on symbology property page return "Multiple Attributes"; } } } } //end of root namespace
[Visual Basic .NET]
MultivariateRendPropPage.vb
Imports System.Drawing Imports System.Runtime.InteropServices Imports ESRI.ArcGIS.Carto Imports ESRI.ArcGIS.CartoUI Imports ESRI.ArcGIS.Framework Imports ESRI.ArcGIS.esriSystem Imports ESRI.ArcGIS.ADF.BaseClasses Imports ESRI.ArcGIS.ADF.CATIDs <ComClass(MultivariateRendPropPage.ClassId, MultivariateRendPropPage.InterfaceId, MultivariateRendPropPage.EventsId)> _ Public Class MultivariateRendPropPage ' custom renderer property page class for MultivariateRenderer ' a renderer property page must implement these interfaces: Implements IComPropertyPage Implements IComEmbeddedPropertyPage Implements IRendererPropertyPage <DllImport("gdi32.dll")> _ Private Shared Function DeleteObject(ByVal hObject As IntPtr) As Boolean End Function Private m_Page As PropPageForm Private m_pRend As IFeatureRenderer Private m_Priority As Long Private m_bitmap As System.Drawing.Bitmap Private m_hBitmap As IntPtr Public Sub New() ''MsgBox("New (color prop page)") m_Page = New PropPageForm m_Priority = 550 ' 5th category is for multiple attribute renderers Dim res() As String = GetType(MultivariateRendPropPage).Assembly.GetManifestResourceNames() If (res.GetLength(0) > 0) Then Try Dim bitmapResourceName As String = Me.GetType().Name + ".bmp" m_bitmap = New System.Drawing.Bitmap(Me.GetType().Assembly.GetManifestResourceStream(bitmapResourceName)) If Not (m_bitmap Is Nothing) Then m_bitmap.MakeTransparent(m_bitmap.GetPixel(1, 1)) m_hBitmap = m_bitmap.GetHbitmap() End If Catch End Try End If End Sub Protected Overrides Sub Finalize() If (m_hBitmap.ToInt32() <> 0) Then DeleteObject(m_hBitmap) End If End Sub #Region "COM GUIDs" ' These GUIDs provide the COM identity for this class ' and its COM interfaces. If you change them, existing ' clients will no longer be able to access the class. Public Const ClassId As String = "FE338F20-B39C-49B8-9F28-FAC2F0DE0C0D" Public Const InterfaceId As String = "BAC02C70-EC55-4A1D-AF09-08E39BEA78DB" Public Const EventsId As String = "AED3C901-6B05-40A9-93CF-FE26C6C3FA01" #End Region #Region "Component Category Registration" <ComRegisterFunction()> _ Public Shared Sub Reg(ByVal regKey As String) RendererPropertyPages.Register(regKey) End Sub <ComUnregisterFunction()> _ Public Shared Sub Unreg(ByVal regKey As String) RendererPropertyPages.Unregister(regKey) End Sub #End Region Public Function Activate() As Integer Implements IComPropertyPage.Activate Return m_Page.Handle.ToInt32() End Function Public Function Applies(ByVal objects As ESRI.ArcGIS.esriSystem.ISet) As Boolean Implements IComPropertyPage.Applies Dim pObj As Object If objects.Count <= 0 Then Return False Exit Function End If objects.Reset() pObj = objects.Next Do While Not TypeOf pObj Is IFeatureRenderer pObj = objects.Next If pObj Is Nothing Then Return False Exit Function End If Loop Return (TypeOf pObj Is IMultivariateRenderer) End Function Public Sub Apply() Implements IComPropertyPage.Apply QueryObject(m_pRend) End Sub Public Sub Cancel() Implements IComPropertyPage.Cancel ' doing nothing discards any changes made on the page since last Apply. this is ' what we want. End Sub Public Sub Deactivate() Implements IComPropertyPage.Deactivate End Sub Public ReadOnly Property Height() As Integer Implements IComPropertyPage.Height Get 'MsgBox("Height") Return m_Page.Height End Get End Property Public ReadOnly Property HelpContextID(ByVal controlID As Integer) As Integer Implements IComPropertyPage.HelpContextID Get ' NOTIMPL End Get End Property Public ReadOnly Property HelpFile() As String Implements IComPropertyPage.HelpFile Get Return "" End Get End Property Public Sub Hide() Implements IComPropertyPage.Hide m_Page.Hide() End Sub Public ReadOnly Property IsPageDirty() As Boolean Implements IComPropertyPage.IsPageDirty Get ' check flag on form to see if page is dirty ' this tells the property sheet whether or not to redraw page Return m_Page.IsDirty End Get End Property Public WriteOnly Property PageSite() As IComPropertyPageSite Implements IComPropertyPage.PageSite Set(ByVal Value As IComPropertyPageSite) m_Page.PageSite = Value End Set End Property Public Property Priority() As Integer Implements IComPropertyPage.Priority Get Return m_Priority End Get Set(ByVal Value As Integer) m_Priority = Value End Set End Property Public Sub SetObjects(ByVal objects As ESRI.ArcGIS.esriSystem.ISet) Implements IComPropertyPage.SetObjects ' supplies the page with the object(s) to be edited including the map, feature layer, ' feature class, and renderer ' note: the feature renderer passed in as part of Objects is the one created ' in CreateCompatibleObject Dim pObj As Object If objects.Count <= 0 Then Exit Sub End If objects.Reset() pObj = objects.Next Dim pMap As IMap = Nothing Dim pGeoLayer As IGeoFeatureLayer = Nothing ' in this implementation we need info from the map and the renderer Do While Not pObj Is Nothing If TypeOf pObj Is IMap Then pMap = pObj If TypeOf pObj Is IGeoFeatureLayer Then pGeoLayer = pObj If TypeOf pObj Is IFeatureRenderer Then m_pRend = pObj pObj = objects.Next Loop If (Not pMap Is Nothing) And (Not pGeoLayer Is Nothing) And (Not m_pRend Is Nothing) Then m_Page.InitControls(m_pRend, pMap, pGeoLayer) End If End Sub Public Sub Show() Implements IComPropertyPage.Show m_Page.Show() End Sub Public Property Title() As String Implements IComPropertyPage.Title Get Return m_Page.Name End Get Set(ByVal Value As String) m_Page.Name = Value End Set End Property Public ReadOnly Property Width() As Integer Implements IComPropertyPage.Width Get Return m_Page.Width End Get End Property Public Function CreateCompatibleObject(ByVal kind As Object) As Object Implements IComEmbeddedPropertyPage.CreateCompatibleObject ' check to see if the renderer is compatible with the property page... ' ...if so, return the renderer. If not, create a new one. Dim pFeatRend As IFeatureRenderer If (TypeOf kind Is IMultivariateRenderer) And (Not kind Is Nothing) Then pFeatRend = kind Else ' create a new MultivariateRenderer pFeatRend = New MultivariateRenderer End If Return pFeatRend End Function Public Sub QueryObject(ByVal theObject As Object) Implements IComEmbeddedPropertyPage.QueryObject ' triggered when OK or Apply is pressed on the property page Dim pRend As IFeatureRenderer If (TypeOf theObject Is IMultivariateRenderer) And (Not theObject Is Nothing) Then pRend = theObject m_Page.InitRenderer(pRend) End If End Sub Public Function CanEdit(ByVal obj As IFeatureRenderer) As Boolean Implements IRendererPropertyPage.CanEdit Return (TypeOf obj Is IMultivariateRenderer) End Function Public ReadOnly Property ClassID1() As ESRI.ArcGIS.esriSystem.UID Implements IRendererPropertyPage.ClassID Get ' return prog id of the property page object Dim pUID As New UID pUID.Value = "MultivariateRendPropPage" Return pUID End Get End Property Public ReadOnly Property Description() As String Implements IRendererPropertyPage.Description Get ' appears on ArcMap symbology property page Return "Display features with multivariate symbology" End Get End Property Public ReadOnly Property Name() As String Implements IRendererPropertyPage.Name Get Return "Multivariate Renderer" End Get End Property Public ReadOnly Property PreviewImage() As Integer Implements IRendererPropertyPage.PreviewImage Get Return m_hBitmap.ToInt32() End Get End Property Public ReadOnly Property RendererClassID() As ESRI.ArcGIS.esriSystem.UID Implements IRendererPropertyPage.RendererClassID Get Dim pUID As New UID pUID.Value = "MultivariateRenderer" Return pUID End Get End Property Public ReadOnly Property Type() As String Implements IRendererPropertyPage.Type Get ' text that appears for category in "Show" tree view ' on symbology property page Return "Multiple Attributes" End Get End Property End Class