2016-05-23 13 views
5

私は、現在開いているウィンドウの上に情報をオーバーレイする支援技術アプリケーション(C#で)を開発しています。クリック可能な要素を検出し、ラベルを付けます。.NET/C#の右クリックメニューの上に描画する方法は?

これを行うには、私は現在、TopMostを "true"に設定し、その上にラベルを描画するボーダレスで透明なウィンドウを作成しています。つまり、現在のアプリケーションの前に常にウィンドウが表示され、ラベルを描画できます。

問題は、このウィンドウでは右クリックメニューは表示されません。他のウィンドウのみです。ユーザーが右クリックすると、コンテキストメニューがオーバーレイの上に描画されます。

右クリックメニューの要素にラベルを付けることができる必要がありますが、現在の実装では要素の上に描画することはできません。誰かが解決策を知っていますか?

編集:これは、オーバーレイを描画するための関連コードです。フォームデザイナーでフォームのオプションを設定しました。コードの明示的な設定ではありません。どのくらい役立つかわかりません。私は、図面に関連していないコード、またはフォーム自体を削除しました:

public partial class OverlayForm : Form 
{ 
    public OverlayForm() 
    { 

    } 

    protected override void OnPaint(PaintEventArgs eventArgs) 
    { 
     base.OnPaint(eventArgs); 
     Graphics graphics = eventArgs.Graphics; 
     Brush brush = new SolidBrush(this.labelColor); 
     foreach (ClickableElement element in this.elements) 
     { 
      Region currentRegion = element.region; 
      graphics.FillRegion(brush, currentRegion); 
     } 
    }  
} 
+1

オーバレイのコードを表示できますか? – Jacobr365

+0

@ Jacobr365 - 確かに、追加されました。 :) – JackCC

+0

私はそれが可能だとは思わない。コンテキストメニューは、あなたのフォームよりも "一番上"に描画されます。これは、OSによって焦点が合わせられ、より高いzオーダーが得られます。 – DonBoitnott

答えて

0

私はハックソリューションのビットを見つけました。

定期的にオーバーレイウィンドウを前面に持っていくことで、右クリックメニューをカバーするZオーダーの先頭に表示させることができます。完璧ではありませんが、機能します。これは取り除かマルチスレッドで、コアコンセプトです:

public class OverlayManager 
{ 
    OverlayForm overlay; 

    public OverlayManager() 
    { 
     this.overlay = new OverlayForm(); 
     this.overlay.Show(); 
     this.RepeatedlyBringToFront(); 
    } 

    private void RepeatedlyBringToFront() 
    { 
     while (true) 
     { 
      this.overlay.BringToFront(); 
      Thread.Sleep(50); 
     } 
    } 
} 

(これは「OverlayFormは」フォームデザイナで設定され、関連するフラグを持つフォームであると仮定し - すなわち「常に手前に、」「透明キーを、」 " 「ボーダレス」、「最大化」など)

これはWindows 8.1でのみテストされています。 Zオーダーが他のバージョンでこのように動作するかどうかはわかりません。

0

コンテキストメニューをフォームに追加し、ContextMenuStripのコントロールのプロパティに割り当てます。

ContextMenu cm = new ContextMenu(); 
cm.MenuItems.Add("Item 1"); 
cm.MenuItems.Add("Item 2"); 

pictureBox1.ContextMenu = cm; 
+0

私はどんなアプリケーションでも任意のコンテキストメニューを描画することができる必要があります、私は恐れています - このプログラムだけではありません。このツールは、すべてのプログラムを拡張して、無効なユーザーがアクセスできるようにします。オーバーレイウィンドウにこのメニューを実装することをお勧めします。ラベルを付けて、元のコンテキストメニューと同じ置換ストリップを埋めてください。 – JackCC

関連する問題