How to use an application as the ToolbarControl buddy


Summary
Typically, a control (such as the MapControl) is set as the ToolbarControl buddy with commands operating on the MapControl. When an application is set as the ToolbarControl buddy, the application can contain, for example, both a MapControl and a PageLayoutControl; and ToolbarControl items can be developed to operate on both controls simultaneously.
This topic shows how an application can be the ToolbarControl buddy and presents a command that operates on the MapControl and PageLayoutControl simultaneously.

Using an application as the ToolbarControl buddy

To set an application as the ToolbarControl buddy, perform the following steps:
  1. Define the buddy application (for example, a form) as implementing IToolbarBuddy.
  2. Set the application as the ToolbarControl buddy.
  3. Add the OpenMxFile command to the toolbar. This can be done manually using the ToolbarControl Property Pages or programmatically using the ToolbarControl AddItem method. This step is typically performed at application start-up.
  4. Override IToolbarBuddy.CurrentTool to set the CurrentTool property of, for example, the MapControl or PageLayoutControl.
The ToolbarControl uses the buddy application to set the CurrentTool.
See the following code example:
[C#]
//Set the ToolbarControl buddy to be the application.
axToolbarControl1.SetBuddyControl(this);

//Add items to the ToolbarControl.
axToolbarControl1.AddItem(new OpenMxFile(),  - 1, 0, false,  - 1,
    esriCommandStyles.esriCommandStyleIconAndText);

public ITool CurrentTool
{
    get
    {
        //Get the current tool.
        return m_currentTool;
    }
    set
    {
        //Set the current tool.
        m_currentTool = value;
        axMapControl1.CurrentTool = m_currentTool;
        axPageLayoutControl1.CurrentTool = m_currentTool;
    }
}
[VB.NET]
'Set the application as the buddy.
AxToolbarControl1.SetBuddyControl(Me)
'Add items to the ToolbarControl.
AxToolbarControl1.AddItem(New OpenMxFile, 0, 0, False, 0, esriCommandStyles.esriCommandStyleIconAndText)

Public Property CurrentTool() As ESRI.ArcGIS.SystemUI.ITool Implements ESRI.ArcGIS.Controls.IToolbarBuddy.CurrentTool
    Get
    'Get the current tool.
    CurrentTool = m_pCurrentTool
    End Get
    Set(ByVal Value As ESRI.ArcGIS.SystemUI.ITool)
    'Set the current tool.
    m_pCurrentTool = Value
    AxMapControl1.CurrentTool = m_pCurrentTool
    AxPageLayoutControl1.CurrentTool = m_pCurrentTool
    End Set
End Property
Each item's Command.OnCreate method is passed the ToolbarControl as the hook. The following code shows how an OpenMxFile command can access the application from the hook's buddy and how the command operates on a MapControl and PageLayoutControl simultaneously:
[C#]
public sealed class OpenMxFile: BaseCommand
{
    private ApplicationAsToolbarBuddy.Form1 m_application;
    public OpenMxFile()
    {
        base.m_caption = "OpenMxFile";
        base.m_message = "OpenMxFile";
        base.m_toolTip = "OpenMxFile";
        base.m_enabled = true;
        base.m_bitmap = new System.Drawing.Bitmap(GetType()
            .Assembly.GetManifestResourceStream(GetType(), "folder_open.bmp"));
    }
    public override void OnCreate(object hook)
    {
        if (hook is IToolbarControl)
        {
            IToolbarControl toolbarControl = (IToolbarControl)hook;
            m_application = (ApplicationAsToolbarBuddy.Form1)toolbarControl.Buddy;
        }
    }
    public override void OnClick()
    {
        System.Windows.Forms.OpenFileDialog openFileDialog = new
            System.Windows.Forms.OpenFileDialog();
        openFileDialog.Title = "Open Map Document";
        openFileDialog.Filter = "Map Documents (*.mxd)|*.mxd";
        openFileDialog.ShowDialog();
        //Exit if no map document is selected.
        string filePath = openFileDialog.FileName;
        if (filePath == "")
            return ;
        //Validate the map document.
        if (m_application.axMapControl1.CheckMxFile(filePath))
        {
            //Load the map document into the MapControl and PageLayoutControl.
            m_application.axMapControl1.LoadMxFile(filePath, "", "");
            m_application.axPageLayoutControl1.LoadMxFile(filePath, "");
        }
    }
}
[VB.NET]
Public NotInheritable Class OpenMxFile
Inherits BaseCommand
Private m_pApplication As ApplicationBuddy

Public Sub New()
    MyBase.New()
    MyBase.m_caption = "OpenMxFile"
    MyBase.m_message = "OpenMxFile"
    MyBase.m_toolTip = "OpenMxFile"
    MyBase.m_enabled = True
    MyBase.m_bitmap = New System.Drawing.Bitmap(GetType(ApplicationBuddy).Assembly.GetManifestResourceStream(GetType(ApplicationBuddy), "folder_open.bmp"))
End Sub

Public Overrides Sub OnCreate(ByVal hook As Object)
If TypeOf hook Is IToolbarControl Then
    Dim pToolbarControl As IToolbarControl
    pToolbarControl = hook
    m_pApplication = pToolbarControl.Buddy
End If
End Sub

Public Overrides Sub OnClick()
Dim pOpenFileDialog As New OpenFileDialog
pOpenFileDialog.Title = "Open Map Document"
pOpenFileDialog.Filter = "Map Documents (*.mxd)|*.mxd"
pOpenFileDialog.ShowDialog()
'Exit if no map document is selected.
Dim sFilePath As String
sFilePath = pOpenFileDialog.FileName
If sFilePath = "" Then Exit Sub
'Validate the map document.
If m_pApplication.axMapControl1.CheckMxFile(sFilePath) Then
    'Load the map document into the MapControl and PageLayoutControl.
    m_pApplication.axMapControl1.LoadMxFile(sFilePath)
    m_pApplication.axPageLayoutControl1.LoadMxFile(sFilePath)
End If
End Sub

End Class


See Also:

ToolbarControl class
IToolbarControl interface
IToolbarBuddy interface




Development licensing Deployment licensing
Engine Developer Kit Engine
ArcGIS for Desktop Basic
ArcGIS for Desktop Standard
ArcGIS for Desktop Advanced