Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  TrayItem- / TrayIcon-Menü in der AutoCAD StatusBar

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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



Sehen Sie sich das Profil von sebastian. an!   Senden Sie eine Private Message an sebastian.  Schreiben Sie einen Gästebucheintrag für sebastian.

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von sebastian. an!   Senden Sie eine Private Message an sebastian.  Schreiben Sie einen Gästebucheintrag für sebastian.

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


TrayItemTest.zip

 
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



Sehen Sie sich das Profil von sebastian. an!   Senden Sie eine Private Message an sebastian.  Schreiben Sie einen Gästebucheintrag für sebastian.

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von sebastian. an!   Senden Sie eine Private Message an sebastian.  Schreiben Sie einen Gästebucheintrag für sebastian.

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hi Alfred,

schade, es hätte so einfach sein können  .

Das mit dem eigenen Form-Objekt ist eine geniale Idee! Vielen Dank dafür!

Grüße, Sebastian

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Wene71
Mitglied



Sehen Sie sich das Profil von Wene71 an!   Senden Sie eine Private Message an Wene71  Schreiben Sie einen Gästebucheintrag für Wene71

Beiträge: 28
Registriert: 25.04.2010

Win8.1 Pro x64, ACAD 2015,
VS 2013

erstellt am: 09. Aug. 2010 11:34    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für sebastian. 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von sebastian. an!   Senden Sie eine Private Message an sebastian.  Schreiben Sie einen Gästebucheintrag für sebastian.

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


TrayItemTest2.zip

 
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.Windows

Public 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



Sehen Sie sich das Profil von sebastian. an!   Senden Sie eine Private Message an sebastian.  Schreiben Sie einen Gästebucheintrag für sebastian.

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von sebastian. an!   Senden Sie eine Private Message an sebastian.  Schreiben Sie einen Gästebucheintrag für sebastian.

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities


trayitem.png

 
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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von sebastian. an!   Senden Sie eine Private Message an sebastian.  Schreiben Sie einen Gästebucheintrag für sebastian.

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von sebastian. an!   Senden Sie eine Private Message an sebastian.  Schreiben Sie einen Gästebucheintrag für sebastian.

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

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



Sehen Sie sich das Profil von sebastian. an!   Senden Sie eine Private Message an sebastian.  Schreiben Sie einen Gästebucheintrag für sebastian.

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz