Announcement

Collapse
No announcement yet.

Shortcuts im Menü

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Shortcuts im Menü

    Hallo,

    ich würde gerne in einer WinForms Anwendung einem MenuItem einen Shortcut zuweisen.
    <pre>
    self.MenuItem2.Shortcut := ShortCut.None;
    self.MenuItem3.Shortcut := ShortCut.F1;
    </pre>
    Das funktioniert auch :-)

    <b>aber</b> wie bekomme ich z.B. den Shortcut <b>[Shift] + [Alt] + [Strg] + [A]</b> zugewiesen???

    In der VCL Anwendung ist das kein Problem.

    Das muss doch auch irgendwie in WinForms gehen.

    Ich bedanke mich schon mal im Voraus für eine Antwort. ;-)

  • #2
    Hallo,

    auf der Hilfeseite <i>Shortcut Enumeration</i> der .NET Frameworks SDK-Hilfe sind alle unterstützten Kombinationen aufgeführt. Wenn eine 4er-Kombination erkannt werden soll, muss wohl die geerbte Methode <i>PreProcessMessage</i> überschrieben werden, um in eigener Regie diese Kombination zu erkennen

    Comment


    • #3
      Hallo,
      Du meinst, es ist nicht ohne größeren Aufwand möglich.

      Ich habe zu dem Thema nur folgende Seite gefunden. Beispiel zeigt wie man sowas in die IDE von c# Builder (bzw. Delphi 8) bekommen kann, nur leider weiss ich nicht wie ich den Integer in ein Object vom Typ Shortkey konvertieren kann. Im Beisp. ist die verwendete MenuItem.Shortcut ein Integer.

      Geht das irgendwie mit der <a HREF="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWindowsFormsKeysConverterClassTopic.asp ">KeysConverter</a> Klasse?

      URL von unterem Beispiel: http://bdn.borland.com/article/0,1410,30194,00.html

      <pre>
      protected static void AddMainMenuItem(
      {
      ((Bitmap)form.MenuItemBitmap.Image).MakeTransparen t();
      </pre><pre>
      IOTAMainMenuService menuServ = OTAUtils.MainMenuService;
      menuItem = menuServ.AddMenuItem(OTAUtils.IDEViewDebugItemName ,
      OTAMenuItemLocation.otamlBefore, MenuItemName, "OTA Intro Form",
      (Bitmap)form.MenuItemBitmap.Image).GetHbitmap());
      </pre><pre>
      menuItem.Executed += new EventHandler(MenuItemExecuted);
      </pre><pre>
      <b> int shortcut = Convert.ToInt32(Keys.Z) | OTAUtils.Shift |
      OTAUtils.Control | OTAUtils.Alt;
      menuItem.Shortcut = shortcut;</b>
      OTAUtils.StartUpdatingMenuShortcut(menuItem, shortcut);
      }
      <pre>

      Oder kann man einfach Shortcut ableiten und da was dazubasteln und dann diesen Typ zuweisen?

      mfg
      MaBuS

      Comment


      • #4
        Hallo,

        das Borland-Beispiel für das <i>C#Builder Open Tools API</i> (OTA) passt hier leider nicht, da die IDE vom C#Builder ja eine Win32-Anwendung (Delphi 7.1) ist, aber keine native .NET-Anwendung (somit steckt hinter dem Menu auch kein Windows Form).

        Der folgende Versuch lässt sich auch in C# nicht kompilieren, wenn hinter <i>menuItem2</i> eine Instanz von <i>System.Windows.Forms.MenuItem</i> steckt:
        <pre>
        menuItem2.Shortcut = (System.Windows.Forms.Shortcut)Convert.ToInt32(Key s.Z) |
        Convert.ToInt32(Keys.Shift) |
        Convert.ToInt32(Keys.Control ) | Convert.ToInt32(Keys.Alt);
        </pre&gt

        Comment


        • #5
          Hallo,

          das Borland-Beispiel für das <i>C#Builder Open Tools API</i> (OTA) passt hier leider nicht, da die IDE vom C#Builder ja eine Win32-Anwendung (Delphi 7.1) ist, aber keine native .NET-Anwendung (somit steckt hinter dem Menu auch kein Windows Form). Die Win32-IDE vom C#Builder (bzw. von Delphi 8) bettet zur Laufzeit nur die CLR ein, um im Formular-Designer ein Windows Form anzeigen zu können.

          Der folgende Versuch lässt sich zwar in C# kompilieren, wenn hinter <i>menuItem2</i> eine Instanz von <i>System.Windows.Forms.MenuItem</i> steckt:
          <pre>
          <b>public</b> Form1()
          {
          <font color="#003399"><i>//</i></font>
          <font color="#003399"><i>// Required for Windows Form Designer support</i></font>
          <font color="#003399"><i>//</i></font>
          InitializeComponent();
          <font color="#003399"><i>//</i></font>
          <font color="#003399"><i>// TODO: Add any constructor code after InitializeComponent call</i></font>
          <font color="#003399"><i>//</i></font>
          <b>int</b> i = Convert.ToInt32(Keys.Z) |
          Convert.ToInt32(Keys.Shift) |
          Convert.ToInt32(Keys.Control) |
          Convert.ToInt32(Keys.Alt);
          menuItem2.Shortcut = (System.Windows.Forms.Shortcut)i;
          }
          </pre>
          Aber zur Laufzeit erhält man sofort das folgende Veto (siehe Abbildung), da die CLR penibel nachprüft, ob der zugewiesene Integer-Wert auch wirklich in der Enumeration Shortcut deklariert wurde (was jedoch nicht der Fall ist!)

          Comment


          • #6
            Schade.

            Bei meinen Versuchen habe ich auch nur selsame Fehler bekommen :-(

            Danke für die schnelle Antwort.

            ps: Ich weiß nicht, ob das hier her gehört, aber das Sonderheft delphi.net ist wirklich super :-) Habe mir trotz pdf nun das Buch "Crahkurs .NET für Delphianer" gekauft. Wer liest schon gerne am Rechner. ;-

            Comment

            Working...
            X