このサイトをビューするために JavaScript を有効化してください。

Altova MapForce 2020 Enterprise Edition

MapForceControl は、CommandsList、MainMenu、 および Toolbars プロパティにより MapForce の全てのコマンドへのアクセスを与えます。 フォルダー <ApplicationFolder>\Examples\ActiveX\C# 内にあるサンプルプロジェクトは、 MainMenu プロパティを使用して MapForce メニュー構造を動的に作成します。

 

メニューコマンドを取得するコードは、 MDIMain.cs ファイル内の MDIMain メソッドでみつけることができます:

 

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 は MDI フレームウィンドウの既存の静的 メニューです。  Visual Studio Designer 内で MDIMain.cs フォームを開くと、このメニューは次の2つのメニューアイテムから構成されていることに気が付きます: 「ファイル」 とウィンドウ。

ax_mapforce_sample_02

MDIMain.cs

メソッド InsertMenuStructuremainMenuobjCommand オブジェクトをパラメーターとして取ります。(前者は既存の静的なメニューを含み、後者は、MapForce ActiveX コントロールから取得されたフルメニュー構造を含みます) 取得された MapForce メニュー構造は既存の静的 メニューにマージされます。 メニュー 「ファイル」「プロジェクト」、 および 「ウィンドウ」 は動的に追加されません。これらのメニューは開かれているドキュメントとアクティブに作業するため、また、このサンプルの範囲外のコードを必要とするため、これは意図的です。 基本のファイル管理 コマンド (create、open、save、 bring into focus) 既存の静的メニュー 「ファイル」 とウィンドウにより扱われます。 すべての他のメニューの ActiveX コントロールの MainMenu プロパティから取得された情報をベースに動的に挿入されます。 新規のメニューは、 「ファイル」 の後、「ウィンドウ」の前に挿入されます。例えば、メニューインデックス 1 から始まるなど。

 

メソッド InsertMenuStructure は、 MapForceCommand オブジェクト内で見つけられたすべてのトップレベルメニュを介して反復し、新規の メニューをそれぞれに追加します。各トップレベル メニューは自身の子メニューアイテムを所有するため、メソッド InsertMenuCommand への呼び出しは、発生した子メニューアイテムのために実行されます。更に、各子メニューアイテムは自身の子ニューアイテムを持つことができるため、 InsertMenuCommand メソッドは子メニューアイテムが存在しなくなるまで再帰します。

 

動的に追加されるコマンドは、 CustomMenuItem.cs 内で定義されるクラス CustomMenuItem のインスタンスです。 このクラスは、 System.Windows.Forms.MenuItem クラスから生成され、 MapForce コマンド ID に保存するために追加メンバーが存在します。

 

public class CustomMenuItem : System.Windows.Forms.MenuItem

{

 public int m_MapForceCmdID;

}

 

(他のコマンドのためのコンテナー以外の)すべての動的に追加されたコマンド は、コマンドの処理をおこなう同じ イベントハンドラー AltovaMenuItem_Click を取得します:

 

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

 

コマンドが(子コマンドを持つ場合)他のコマンド のためのコンテナーである場合、 イベントハンドラー AltovaSubMenu_Popup を取得します。このハンドラーは、各子コマンドの状態をクエリし、必要に応じて有効化、または、無効化することができます。

 

 

これにより各コマンドが意味のある時にのみ有効化されます。 (例えば、 「ファイル | 保存」 メニューアイテムはアクティブなドキュメントが開かれていない場合無効化されている必要があります)。

 

メソッド ProcessCommand は、 MapForceControl 自身または MapForceControlDocument コントロール内にロードされているアクティブな MapForce ドキュメントのどちらかに実行を委任します。 MapForceControl はホストアプリケーション内で現在アクティブなドキュメントを知る方法がないため必要になります。

 

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

(C) 2019 Altova GmbH