Altova MapForce 2024 Enterprise Edition

Über das MapForceControl haben Sie über seine Eigenschaften CommandsList , MainMenu und Toolbars Zugriff auf alle Befehle von MapForce. Im Beispielprojekt im Ordner <ApplicationFolder>\Examples\ActiveX\C# wird die MapForce-Menüstruktur anhand der Eigenschaft MainMenu dynamisch erstellt.

 

Sie finden den Code zum Abrufen der Menübefehle in der Methode MDIMain in der Datei MDIMain.cs :

 

public MDIMain()
{
  // ...
 
  // Get the MainMenu property of the control and create the menu structure from it.
  MFLib.MapForceCommand objCommand = this.axMapForceControl.MainMenu;
  InsertMenuStructure(mainMenu, objCommand);
}

 

mainMenu im obigen Codefragment ist das vorhandene statische Menü des MDI-Frame-Hauptfensters. Wenn Sie das Formular MDIMain.cs in Visual Studio Designer öffnen, sehen Sie, dass dieses Menü zwei Menübefehle enthält: File und Window.

ax_mapforce_sample_02

MDIMain.cs

Die Methode InsertMenuStructure erhält als Parameter die Objekte mainMenu und objCommand (ersteres ist das bestehende statische Menü, während zweiteres die gesamte aus dem MapForce ActiveX Control abgerufene Menüstruktur enthält). Anschließend wird die abgerufene MapForce-Menüstruktur mit dem vorhandenen statischen Menü zusammengeführt. Beachten Sie, dass die Menüs File, Project und Window absichtlich nicht dynamisch hinzugefügt werden, da diese Menüs mit aktiv offenen Dokumenten zu tun haben und dafür Code benötigt würde, der den Rahmen dieses Beispiels sprengen würde. Die grundlegenden Dateiverwaltungsbefehle (create, open, save, bring into focus) werden von den vorhandenen statischen Menüs File und Window übernommen. Alle anderen Menübefehle werden auf Basis der Informationen aus der Eigenschaft MainMenu des ActiveX Control dynamisch eingefügt. Die neuen Menüs werden hinter "File", jedoch vor "Window" eingefügt, d.h. beginnend mit dem Menüindex 1.

 

Die Methode InsertMenuStructure iteriert durch alle Menüs auf oberster Ebene im Objekt MapForceCommand und fügt für jedes einen neuen Menübefehl hinzu. Da jedes Menü auf oberster Ebene eigene untergeordnete Menüs hat, wird für jeden gefundenen Untermenübefehl die Methode InsertMenuCommand aufgerufen. Da jeder untergeordnete Menübefehl wiederum eigene untergeordnete Menübefehle haben kann, usw. durchläuft die Methode InsertMenuCommand sich selbst rekursiv, bis keine weiteren untergeordneten Menübefehle vorhanden sind.

 

Die dynamisch hinzugefügten Befehle sind Instanzen der Klasse CustomMenuItem, welche in CustomMenuItem.cs definiert ist. Diese Klasse ist von der Klasse System.Windows.Forms.MenuItem abgeleitet und hat ein zusätzliches Mitglied zum Speichern der MapForce-Befehls-ID.

 

public class CustomMenuItem : System.Windows.Forms.MenuItem

{

 public int m_MapForceCmdID;

}

 

Alle dynamisch hinzugefügten Befehle (mit Ausnahme derer, die Container für andere Befehle sind) rufen denselben Event Handler AltovaMenuItem_Click ab, der den folgenden Befehl verarbeitet:

 

private void AltovaMenuItem_Click(object sender, EventArgs e)
{
 if(sender.GetType() == System.Type.GetType("MapForceApplication.CustomMenuItem"))
 {
   CustomMenuItem   customItem = (CustomMenuItem)sender;
   ProcessCommand(customItem.m_MapForceCmdID);
 }
}

 

Wenn es sich beim Befehl um einen Container für andere Befehle handelt (d.h. wenn er untergeordnete Befehle enthält), ruft er den Event Handler AltovaSubMenu_Popup auf. Dieser Handler fragt den Status der einzelnen untergeordneten Menübefehle ab und aktiviert bzw. deaktiviert den Befehl je nach Bedarf. Damit wird sichergestellt, dass jeder Befehl nur dann aktiviert ist, wenn dies sinnvoll ist (So sollte der Menübefehl File | Save etwa deaktiviert sein, wenn kein aktives Dokument geöffnet ist).

 

Die Methode ProcessCommand delegiert die Ausführung entweder an das MapForceControl selbst oder an ein beliebiges aktives, in einem MapForceControlDocument-Control geladenes MapForce-Dokument. Der Grund hierfür ist, dass das MapForceControl keine Möglichkeit hat, zu eruieren, welches Dokument in der Host-Applikation gerade aktiv ist.

 

private void ProcessCommand(int nID)
{
  MapForceDoc docMapForce = GetCurrentMapForceDoc();
 
  if(docMapForce != null)
     docMapForce.axMapForceControlDoc.Exec(nID);
  else
     axMapForceControl.Exec(nID);
}

© 2017-2023 Altova GmbH