2016-05-23 68 views
5

Sto sviluppando un'applicazione di tecnologia assistiva (in C#) che sovrascrive le informazioni in cima alla finestra attualmente aperta. Rileva elementi cliccabili e li etichetta.Come disegnare sopra il menu di scelta rapida in .NET/C#?

Per fare ciò, sto creando una finestra trasparente senza bordi con TopMost impostato su "true" e disegnando le etichette su quello. Ciò significa che c'è sempre una finestra che si libra davanti all'applicazione corrente, sulla quale posso disegnare le etichette.

Il problema è che questa finestra non copre il menu di scelta rapida, solo altre finestre. Quando l'utente fa clic con il pulsante destro del mouse, il menu di scelta rapida viene disegnato sopra l'overlay.

Devo essere in grado di etichettare gli elementi nel menu del tasto destro, ma non posso disegnarlo sopra con l'attuale implementazione. Qualcuno sa di una soluzione?

Modifica: questo è il codice pertinente per disegnare l'overlay. Ho impostato le opzioni del modulo nella finestra di progettazione del modulo, non nel codice, quindi non sono sicuro di quanto possa essere d'aiuto. Ho rimosso il codice non correlato al disegno, o la forma stessa:

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

Puoi mostrare il tuo codice per fare l'overlay – Jacobr365

+0

@ Jacobr365 - Certo, aggiunto. :) – JackCC

+0

Non penso sia possibile. Il menu di scelta rapida è disegnato ancor più "al massimo" rispetto al tuo modulo, poiché ottiene maggiore attenzione e un ordine z più alto dal sistema operativo. – DonBoitnott

risposta

0

ho trovato un po 'di una soluzione hack.

Portando periodicamente la finestra di sovrapposizione in primo piano, posso portarla in cima all'ordine Z dove copre il menu di scelta rapida. Non è perfetto, ma funziona. Questo è il concetto di base, con il multithreading spogliato fuori:

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); 
     } 
    } 
} 

(questo presuppone "OverlayForm" è un modulo con le bandiere pertinenti stabiliti sotto forma designer - vale a dire "Sempre in primo piano", "Trasparenza chiave," " Senza bordi, "" Massimizzato, "ecc.)

L'ho provato solo su Windows 8.1. Non so se l'ordine Z si comporta in questo modo su altre versioni.

0

Aggiungere un menu di scelta rapida al modulo e quindi assegnarlo nelle proprietà del controllo in ContextMenuStrip.

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

pictureBox1.ContextMenu = cm; 
+0

Devo essere in grado di disegnare qualsiasi menu di scelta rapida in qualsiasi applicazione, temo - non solo questo programma. Lo strumento estende tutti i programmi per renderli accessibili agli utenti disabili. Stai suggerendo di implementare questo menu nella finestra di overlay e di riempirlo con strisce di sostituzione identiche al menu di contesto sottostante, con l'aggiunta di etichette? – JackCC

Problemi correlati