Laden...

[gelöst] MenuStrip beim drücken der ALT-Taste einblenden/ausblenden (C# Anfänger)

Erstellt von groja2 vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.993 Views
G
groja2 Themenstarter:in
18 Beiträge seit 2015
vor 9 Jahren
[gelöst] MenuStrip beim drücken der ALT-Taste einblenden/ausblenden (C# Anfänger)

Hallo zusammen,

ich versuche gerade einem MenuStrip beim drücken der ALT-Taste ein- oder auszublenden. Leider klappt dies nicht ganz so wie ich möchte. Folgenden Code habe ich:

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyValue == 18) // Alt key
    {
        //Sichtbarkeit tauschen
        MenuStrip1.Visible = !MenuStrip1.Visible;
    }
}

private void MenuStrip1_VisibleChanged(object sender, EventArgs e)
{
    if (MenuStrip1.Visible == false)
    {
        //SplitContainer an die richtige Position setzen
        SplitContainer1.Location = new Point(0, 0);
        Size newHeight = new System.Drawing.Size(gMap.Width, gMap.Height + ToolStripMenuItem1.Height);
         gMap.ClientSize = newHeight;
    }
    else
    {
        //SplitContainer zurücksetzen
        ToolStripMenuItem1.Select();
        SplitContainer1.Location = new Point(0, ToolStripMenuItem1.Height);
        Size newHeight = new System.Drawing.Size(gMap.Width, gMap.Height - ToolStripMenuItem1.Height);
        gMap.Size = newHeight;
    }
}

private void MenuStrip1_MenuDeactivate(object sender, EventArgs e)
{
    MenuStrip1.Visible = false;
}

Das Problem ist jetzt, dass ich das MenuStrip zwar, beim drücken der ALT-Taste, angezeigt bekomme, jedoch beim erneuten drücken der ALT-Taste das "MenuStrip1_MenuDeactivate"- Event durchlaufen wird (dadurch ist das MenuStrip weg) und dann direkt das "Form1_KeyDown"-Event durchlaufen wird (ALT-Taste wurde ja gedrückt) worurch das MenuStrip wieder angezeigt wird...

Ganz einfach wäre es, wenn ich das "MenuStrip1_MenuDeactivate"-Event entferne und das MenuStrip nur durch drücken der ALT-Taste ein- bzw. ausgeblendet wird.
Mir wäre es jedoch lieber, wenn es mit dem Event funktionieren würde, da dann auch das MenuStrip verschwindet, wenn ein anderes Element ausgewählt wird.

Ich hoffe ich konnte mich verständlich und korrekt ausgedrückt 😃

Gruß,
Jan

65 Beiträge seit 2009
vor 9 Jahren

Hi,

leider verstehe ich nicht so recht was du meinst:

Du drückst ALT, dann wird msGPSvisual ein- oder ausgeblendet. Das Event MenuStrip1_MenuDeactivate, gehört das msGPSvisual oder MenuStrip1?
Warum setzt du das MenuStrip1 direkt auf Visible = false?
Welches andere Element wird ausgewählt?

Gruß

Lukas

G
groja2 Themenstarter:in
18 Beiträge seit 2015
vor 9 Jahren

Hallo Lukas,

da habe ich meinen Code für das Forum nicht richtig umbenannt... msGPSvisual ist MenuStrip1. Bei mir heiße es msGPSvisual, aber damit es schneller erkennbar ist, habe ich es hier für dass Forum MenuStrip1 genannt.

Warum setzt du das MenuStrip1 direkt auf Visible = false?

Im "MenuStrip1_MenuDeactivate" meinst du? Weil ich ja möchte, dass das MenuStrip ausgeblendet wird, wenn es nicht mehr genutzt wird.
Das Problem ist halt, dass beim drücken der ALT-Taste, zum ausblenden des MenuStrip, auch das "MenuStrip1_MenuDeactivate" durchlaufen wird...

Welches andere Element wird ausgewählt?

Wie meinst du das?

Gruß und Dank,
Jan

J
251 Beiträge seit 2012
vor 9 Jahren

Hey

Ich bin mir noch nicht ganz sicher über die Sachlage.

Erstmal kleine Anmerkung: [Tipp] Anfängerfehler == true / == false

Das Event "MenuDeactivate" soll weiter existieren?

Mein Ansatz, den ich grad sehe, wäre:

 if (MenuStrip1.Visible == false)  
    {  
        //SplitContainer an die richtige Position setzen  
        SplitContainer1.Location = new Point(0, 0);  
        Size newHeight = new System.Drawing.Size(gMap.Width, gMap.Height + ToolStripMenuItem1.Height);  
         gMap.ClientSize = newHeight;  
    }  
    else  
    {  
        //SplitContainer zurücksetzen  
        ToolStripMenuItem1.Select();  
        SplitContainer1.Location = new Point(0, ToolStripMenuItem1.Height);  
        Size newHeight = new System.Drawing.Size(gMap.Width, gMap.Height - ToolStripMenuItem1.Height);  
        gMap.Size = newHeight;  
    }  

Dort nur den true-Zweig zu beachten. Den false-Zweig mit ins Event "MenuDeactivate" zu nehmen evtl. mit der Bedingung, dass "Visible" von MenuStrip true ist.

Evtl dachte ich auch an [FAQ] Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung

G
groja2 Themenstarter:in
18 Beiträge seit 2015
vor 9 Jahren

Hallo Jamikus,

Erstmal kleine Anmerkung: [Tipp] Anfängerfehler == true / == false

Ja ich weiß... Manchmal denke ich dran, aber oft vergesse ich es leider... Aber danke für den Tipp!

Das Event "MenuDeactivate" soll weiter existieren?

Ja soll es. Wenn der Benutzer den MenuStrip mit drücken der ALT-Taste einblendet, soll er wieder verschwinden, wenn etwas anderes ausgewählt wird.
Wie gesagt, wenn ich den "MenuDeactivate" herausnehme geht es ohne Probleme. Jedoch kann ich den MenuStrip dann nurnoch mit der ALT-Taste ein- und ausblenden.
Das einzige Problem welches ich habe ist, dass ein ausblenden durch drücken der ALT-Taste nicht möglich ist, da zuerst das "MenuDeactivate" durchlaufen wird (MenuStrip wird deaktiviert) und dann das KeyDown-Event der ALT-Taste (MenuStrip wieder aktiviert)...

Evtl dachte ich auch an [FAQ] Event nur bei Benutzeraktion auslösen, nicht bei programmtechnischer Änderung

Wenn ich das richtig sehe wird es hier mit Variablen gelößt. Das ist bei mir, so wie ich das sehe, nicht möglich.

Gruß,
Jan

65 Beiträge seit 2009
vor 9 Jahren

Hi,

endlich weiß ich was du meinst 😄 (hoffentlich)
Dein Menustrip soll automatisch verschwinden wenn der Benutzer im Dialog sonst wo hindrückt. Will er das Menü eingeblendet bekommen, muss er ALT drücken oder? Ist das Menu eingeblendet und er drückt noch mal ALT, müsste es verschwinden oder?

Lukas

G
groja2 Themenstarter:in
18 Beiträge seit 2015
vor 9 Jahren

Hallo LukasS,

ja genau so sollte es sein 😃
Wie gesagt es funktioniert auch soweit, nur leider gibt es beim Ausblenden des MenuStrips die Probleme... Wenn ich ALT drücke, um es auszublenden, dann wird halt erst die MenuDeactivate durchlaufen und dann das KeyDown-Event für die ALT Taste... Habe da leider keine lösung für 😦

Gruß,
Jan

65 Beiträge seit 2009
vor 9 Jahren

Hi,

also ich habe das so gelöst:


      private void Form1_KeyDown(object sender, KeyEventArgs e)
      {
         if (e.KeyValue == 18) // Alt key
         {
            menuStrip1.Visible = !menuStrip1.Visible;

         }
      }

      //Flag, damit das MenuStrip sich nicht immer schließt
      private bool bTSMI_IsOpen = false;
      private void menuStrip1_MouseLeave(object sender, EventArgs e)
      {
         if (!bTSMI_IsOpen)
            menuStrip1.Visible = false;
      }

      private void Form1_MouseMove(object sender, MouseEventArgs e)
      {
         if (e.Y < menuStrip1.Height)
         {
            menuStrip1.Visible = true;
         }
      }

      //Alle Parent-TooStripMenUItems (also die ganz oben, nicht die unteren) erhalten die beiden Events
      private void testToolStripMenuItem_DropDownOpened(object sender, EventArgs e)
      {
         //Dieser Flag verhindet nur, dass beim Verlassen von MenuStrip1, wenn man sich auf einem Untermenu befindet, sich das MenuStrip1 schließt
         bTSMI_IsOpen = true;
      }

      //Flag wieder auf false setzen
      private void testToolStripMenuItem_DropDownClosed(object sender, EventArgs e)
      {
         bTSMI_IsOpen = false;
         menuStrip1.Visible = false;
      }

Wenn der Benutzer in ein andere Steuerlement drück, schließt sich automatisch das Untermenu und MenuStrip1 wird auch auf visible = false gesetzt.

Probiere bisschen rum, vielleicht hilft dir das.

Gruß

Lukas

G
groja2 Themenstarter:in
18 Beiträge seit 2015
vor 9 Jahren

Hallo LukasS,

ja der Ansatz gefällt mir 😃 Habe ihn für meine Bedürfnisse mal angepasst 😃


private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyValue == 18) // Alt key
    {
        menuStrip1.Visible = !menuStrip1.Visible;
    }
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Y > menuStrip1.Height)
    {
        menuStrip1.Visible = false;
    }
}

Somit wird beim drücken der ALT-Taste der MenuStrip angezeigt oder ausgeblendet. Wenn unterhalb des MenuStrips in die Form geklickt wird, wird es ebenfalls ausgeblendet 😃 So wollte ich es haben 😃

Das mit dem Flag hat bei mir nicht funktioniert, da ich nur das MenuDeactivate-Event und das MouseDown-Event hatte, und es nichts gebracht hätte... (MenuDeactivate wird beim drücken der ALT-Taste ja ebenfalls durchlaufen).

Vielen Dank für die Hilfe 😃

Gruß,
Jan