| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: TrayItem- / TrayIcon-Menü in der AutoCAD StatusBar (2054 mal gelesen)
|
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 05. Aug. 2010 15:02 <-- editieren / zitieren --> Unities abgeben:
Hallo zusammen, Mit folgendem Code ist es möglich ein eigenes TrayItem in der AutoCAD StatusBar zu erstellen und beim Klick mit der rechten Maustaste auf das TrayItem ein Menü einzublenden: Code:
[...] Dim myFirstMenuItem = New System.Windows.Forms.MenuItem("Update", AddressOf Me.ClickHandler)Dim myContextMenu = New System.Windows.Forms.ContextMenu myContextMenu.MenuItems.Add(myFirstMenuItem ) Dim WithEvents myTrayItem = New TrayItem myTrayItem.Icon = My.Resources.icoXYZ Application.StatusBar.TrayItems.Add(myTrayItem) [...] Sub myTrayItem_MouseDown(ByVal sender As Object, ByVal e As StatusBarMouseDownEventArgs) Handles myTrayItem.MouseDown If e.Button = MouseButtons.Right Then myTrayItem.DisplayContextMenu(myContextMenu, New System.Drawing.Point(e.X, e.Y)) End If End Sub Sub ClickHandler(ByVal sender As Object, ByVal e As System.EventArgs) MsgBox("Es wurde auf Update geklickt") End Sub
Leider funktionert das Behandeln des Click-Events für das MenuItem nicht, sprich die MsgBox erscheint nicht, wenn ich auf das MenuItem "Update" klicke. Kann mir jemand sagen, was ich falsch mache? Danke für die Hilfe, Grüße, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 06. Aug. 2010 09:34 <-- editieren / zitieren --> Unities abgeben:
Guten Morgen, ich habe mal ein kleines Testprojekt erstellt und angehängt. Ich kann mir nach wie vor nicht erklären, warum die EventHandler nicht durchlaufen werden. Vielleicht findet ja jemand Zeit, sich das mal anzuschaun und findet eine Lösung... Danke und Grüße, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 06. Aug. 2010 11:46 <-- editieren / zitieren --> Unities abgeben:
Ich habe noch ein bisschen rumgespielt. Erstellt man ein normales WinForm Projekt und lässt das Kontextmenü im EventHandler eines Button-ClickEvents mit .Show(...) öffnen, klickt danach das MenuItem an, dann wird das MenuItem-ClickEvent ausgelöst: Code:
Public Class Form1 Dim myFirstMenuItem As System.Windows.Forms.MenuItem Dim myContextMenu As System.Windows.Forms.ContextMenu Sub New() ' Dieser Aufruf ist für den Windows Form-Designer erforderlich. InitializeComponent() ' Fügen Sie Initialisierungen nach dem InitializeComponent()-Aufruf hinzu. myContextMenu = New ContextMenu myFirstMenuItem = New MenuItem("Update", AddressOf Me.myFirstMenuItem_onClick) myContextMenu.MenuItems.Add(myFirstMenuItem) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click myContextMenu.Show(Me.Button1, Me.Button1.Location) End Sub Sub myFirstMenuItem_onClick(ByVal sender As Object, ByVal e As System.EventArgs) MsgBox("Update geklickt") End Sub End Class
Irgendwie scheinen die MenuItem-ClickEvents in AutoCAD somit nicht richtig ausgelöst zu werden o.ä.?! Dort funktioniert es nämlich nach wie vor nicht Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 08. Aug. 2010 22:14 <-- editieren / zitieren -->
Hi, ich hätte >>>diesen Link<<< gefunden und hätte nach der Rückfrage, ob Albert auch einen TestCode mit Menüs machen kann, rückgeschlossen, dass auch Autodesk das nicht lösen konnte (mangels weiterer Antwort von Albert). Ich kann jetzt mal nur soviel sagen, dass Dein Projekt bei mir auch keine Events auslöst (nicht mit 2010, nicht mit 2011). Ich hätte in diesem Fall ein kleines Form-Objekt gemacht, das ich dann statt der Menüitems an der Cursorposition anzeigen lasse, im Form hast Du dann alle Events an der Angel. - alfred - ------------------ www.hollaus.at |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 09. Aug. 2010 09:59 <-- editieren / zitieren --> Unities abgeben:
|
Wene71 Mitglied
Beiträge: 28 Registriert: 25.04.2010 Win8.1 Pro x64, ACAD 2015, VS 2013
|
erstellt am: 09. Aug. 2010 11:34 <-- editieren / zitieren --> Unities abgeben: Nur für sebastian.
Hallo, finde auch die Lösung von Alfred mit der Form genial. Mir fällt aber noch eine Möglichkeit ein. Habs jetzt nicht porbiert aber könnte auch mit PromptKeywordOptions gehen anstatt einem Kontextmenü. Einfach den Rückgabewert auswerten und dementsprechend reagieren. Code: 'Optionen... Dim pKeyOpts As PromptKeywordOptions = New PromptKeywordOptions("") pKeyOpts.Message = vbLf & "Option wählen: " pKeyOpts.Keywords.Add("Funktion1") pKeyOpts.Keywords.Add("Funktion2") pKeyOpts.AllowNone = False pKeyOpts.AppendKeywordsToMessage = True Dim pKeyRes As PromptResult = ed.GetKeywords(pKeyOpts) ....
Gruß Werner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 09. Aug. 2010 12:14 <-- editieren / zitieren --> Unities abgeben:
Hi Werner, Danke für den Vorschlag, werde ich nochmal versuchen! Hab mittlerweile auch eine Version mit einem ContextMenuStrip realisiert (anstelle eines "kompletten" Form-Objekts, was auch funktioniert hätte). Hat gut geklappt, mit der einen Ausnahme, dass man den Mauscursor im Zeichenbereich von AutoCAD nicht sieht, solange das Kontextmenü geöffnet ist. Folgende Zeilen sind zur Realisierung nötig (das ganze Testprojekt hab ich angehängt): Code:
Imports System.Drawing Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.WindowsPublic Class Class1 Dim WithEvents myTrayItem As TrayItem Dim myContextMenu As ContextMenuStrip <CommandMethod("tray")> _ Sub ShowTray() myTrayItem = New TrayItem() myTrayItem.Icon = My.Resources.acad Application.StatusBar.TrayItems.Add(myTrayItem) Application.StatusBar.Update() myContextMenu = New ContextMenuStrip myContextMenu.Items.Add(New ToolStripMenuItem("Update", Nothing, AddressOf Me.myFirstMenuItem_onClick)) End Sub Sub myTrayItem_MouseDown(ByVal sender As Object, ByVal e As StatusBarMouseDownEventArgs) Handles myTrayItem.MouseDown If e.Button = MouseButtons.Right Then myContextMenu.ShowImageMargin = False myContextMenu.Show(myTrayItem.PointToScreen(New System.Drawing.Point(e.X, e.Y)), ToolStripDropDownDirection.AboveLeft) End If End Sub Sub myFirstMenuItem_onClick(ByVal sender As Object, ByVal e As System.EventArgs) MsgBox("Update geklickt") End Sub End Class
Grüße, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 09. Aug. 2010 12:29 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von Wene71: [...] Habs jetzt nicht porbiert aber könnte auch mit PromptKeywordOptions gehen anstatt einem Kontextmenü. [...]
Hab deinen Code mal in meinen "myTrayItem_MouseDown"-EventHandler kopiert und das ganze ausprobiert. Theoretisch funktioniert es, allerdings wird das Kontextmenü nach einem Rechtsklick auf das TrayItem a) erst angezeigt, sobald man die Maus in den Zeichenbereich von AutoCAD bewegt b) an der Stelle angezeigt, an der man mit der Maus in den Zeichenbereich eintritt Grüße, Sebastian
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 12. Aug. 2010 14:24 <-- editieren / zitieren --> Unities abgeben:
Hallo mal wieder, leider gibt es noch ein Problem mit dem dauerhaften Anzeigen meines TrayItems. Nach öfterem Zoomen, Linien zeichnen etc. ändert sich mein Icon in ein graues Rechteck (-> siehe Bild im "Anhang"). Dies geschieht: 1. bei dem TrayItem meines eigentlichen AutoCAD AddOns, wenn mein AddOn, d.h. das PaletteSet, sichtbar ist und ich eben Zeichne, Zoome, ... Die Routine zum Anzeigen des TrayItems wird nur 1x durchlaufen und bei der Arbeit mit dem AddOn wurde auch nicht mehr auf das TrayItem zugegriffen. 2. bei dem TrayItem im Testprojekt der vorherigen Posts wenn man das "tray"-Kommando öfter ausführt und damit das TrayItem mehrmals anzeigt und ebenfalls eine Linie zeichnet, zoomt... Ich schätze mal, es wird relativ schwierig bis unmöglich sein, für dieses Problem eine Lösung zu finden... Ich bin mittlerweile jedenfalls ratlos . Vielleicht hat ja trotzdem jemand eine Idee?! Danke und Grüße, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Aug. 2010 14:34 <-- editieren / zitieren -->
Hi, zum Reproduzieren wird's wohl schwer, klingt ja nach der Beschreibung nicht gerade so, als hätte ich das sofort bei mir auch. Probier mal das Images aus einer Datei zu befüllen und nicht von .res-File zu laden (hat in einigen Fällen bei mir auch Probleme in anderen Dinge, Images da drin zu haben; jetzt liefere ich die Images immer als Dateien mit und setze diese ein). Viel Erfolg, - alfred - ------------------ www.hollaus.at |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 12. Aug. 2010 14:59 <-- editieren / zitieren --> Unities abgeben:
Hi, meintest du in etwa Folgendes: Code: myTrayItem.Icon = New System.Drawing.Icon("C:\test\myAcad.ico")
Das hat leider nicht funktioniert Mit dem Reproduzieren hast du recht, das wird wohl schwierig...
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 12. Aug. 2010 15:05 <-- editieren / zitieren --> Unities abgeben:
Bin ein kleines Stück weiter gekommen: Wenn ich das Icon nicht aus einer Datei oder aus meinen Ressourcen lade, sondern wie folgt, dann scheint's zu funktionieren: Code: myTrayItem.Icon = Application.DocumentManager.MdiActiveDocument.StatusBar.TrayItems.Item(0).Icon
D.h., wenn ich einfach das erste schon bestehende Icon aus der StatusBar wiederverwende... Aber ein schon bestehendes Icon nochmals zu verwenden ist natürlich keine Lösung. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 12. Aug. 2010 15:59 <-- editieren / zitieren -->
Hi, >> Das hat leider nicht funktioniert Probier mal, die Datei .ico umzuwandeln auf .bmp und lade dann die bmp-Datei. Oder gibt's irgendeine andere Info, wieso's nicht funktioniert (ich hab's nicht mit Deinem Code probiert). - alfred - ------------------ www.hollaus.at |
sebastian. Mitglied
Beiträge: 90 Registriert: 03.09.2009 Windows XP Prof. SP3 AutoCAD 2010 Visual Studio 2008 / 2010 Prof.
|
erstellt am: 12. Aug. 2010 17:12 <-- editieren / zitieren --> Unities abgeben:
Hi Alfred, Der Tipp mit dem Umwandeln in eine .bmp-Datei (sinnvollerweise gleich 16px x 16px) war Gold wert! Während der Laufzeit lasse ich dann aus der .bmp-Datei mein .ico-File erstellen, welches der TrayItem.Icon Eigenschaft zugeordnet wird. Es ist sogar möglich, die .bmp-Datei aus den Projektressourcen zu laden. Die kurze Version: Code: myTrayItem.Icon = System.Drawing.Icon.FromHandle(My.Resources.myAcadIconBmp.GetHicon())
Die ausführlichere Version: Code: Dim myBitmap As System.Drawing.Bitmap = My.Resources.myAcadIconBmp Dim myIcon As System.Drawing.Icon = System.Drawing.Icon.FromHandle(myBitmap.GetHicon()) myTrayItem.Icon = myIcon
Anstelle die Projektressourcen zu verwenden, kann man das Bitmap natürlich auch über myBitmap = New System.Drawing.Bitmap("dateiname_inkl_pfad_und_endung") laden. Also nochmals tausend Dank für die Tipps, Alfred! So war meine Arbeit der letzten Stunden wenigstens nicht umsonst
Grüße und einen schönen Abend, Sebastian Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |