Hallo Forum,
ich gestehe, aus den Beiträgen zu Events, die ich hier gelesen habe werde ich nicht ganz schlau.
Bevor mir die Rübe wegdampft, eine Grundsätzliche Frage:
Ist es möglich, einem vorhandenen Steuerelement weitere Events hinzu zu fügen?
Es geht konkret um ein Grafik-Anzeige-Steuerelement, wo der Hersteller dummerweise jegliche Mausevents "vergessen" hat.
Ansonsten sind die Funktionen jedoch so umfangreich, dass es blödsinn wäre das alles nachzuproggen.
Also.
Ich möchte diesem Steuerelement Events hinzufügen wie MouseClick, MouseMove und eines für das Scrollrad .
Geht so was?
tnx Tele
du musst erben und dann kannst du im geerbten steuerelement solche events bereitstellen.
au verdammt...
wen muss ich dafür töten ? 8o
Ne, spass beiseite.
Hast Du auf dei Schnelle nen Linktip?
für was? wie man erbt oder wie man eigene events definiert?
Ich denke erstmal erben...
dachte ich mir. das fällt aber unter absolute grundlagen.
sry aber beachte bitte
Wichtig: [Hinweis] Wie poste ich richtig?
Punkt 1.1.1
ich empfehle dir erstmal das hier: 🛈 📗
Ah ok...
Das läuft dann auf ein neu erstelltes Steuerelement hinaus...
verstehe.
Gut, ich mach erst mal.
Danke Dir.
Ah ok...
Das läuft dann auf ein neu erstelltes Steuerelement hinaus...
nicht ganz:-) es läuft auf ein geerbtes also erweitertes steuerelement hinaus.
So, ich hab jetzt mal versucht ein eigenes Steuerelement, nach dem Galileo-Buch zu bauen.
Allerdings fängt es schon damit an, dass ich kein Eigenes Steuerelement in der Toolbox habe.
Wo finde ich denn in meinem Testprojekt das neue Steuerelement?
So, ich kann mein Control nun mit allen vorhandenen Eigenschaften sehen...
Jetzt gibt es in meinem Control ja keine Maus-Events.
Ich habe also versucht eines hinzu zu fügen.:
namespace DirectDwgEditor
{
public class Editor
{
[ToolboxBitmap(typeof(DwgEditor),"app.ico")]
public class DwgEditor : AxVIEWXLib.AxOdaViewer
{
protected new MouseEventHandler OnMouseClick(MouseEventArgs e)
{
return OnMouseClick(e);
}
}
}
}
...aber das war wohl zu optimistisch.
Ich sehe nichts von dem Event im Testformular bzw in den Eigenschaften des neuen Controls.
Kann mir da nochmal jemand Hilfe geben?
In den diversen Beiträgen, die ich bisher gelesen habe werden immer vorhandene Events abgeändert. Hier gibts das gewünschte Event allerdings nicht.
naja, erstmal wäre eine hilfestellung zu den bekannten informationen reines ratespiel. zweitens ist der codeschnipsel in seinen grundfesten absolut falsch. hier fehlen deutlich grundlagen. daher ist jede weitere hilfestellung auch nur rudimentär hilfreich.
warum z.b. hast du das control als nested class? das ist nciht nur ungewöhnlich sondern auch vollkomen sinnfrei.
warum machst du new? exisitert schon ein solches event wenn du new machst? warum überhaupt dieses new? weißt du was dieses new bewirkt?
erbt das control, das du verändern möchtest irgendwann von der klassen control?
Also gut...
nachdem ich diese Antwort mittlerweile seit Stunden offen habe (ohne es abzuschicken) und mich mehrfach drüber ausgekotzt habe wie beschissen das ist, immer wieder an fehlende Basics erinnert zu werden, komme ich nach wie vor zu dem Schluss, dass ich es ohne Hilfe nicht kapiere.
Ich habe ein Steuerelement ohne Mausevents.
Diese brauche ich aber.
Nachdem das mit den nested Classes aus DEINEM Link ja zumindest zu dem Erfolg geführt hat, dass ich das Control im Testprojekt mit seinen standard Eigenschaften verwenden kann, hab ich alles zum vierten oder funften mal gelöscht und wieder nach einem anderen Tutorial angefangen ein abgeleitetes Control zu bauen.
Diesmal wieder als Projektvorlage "WindowsFormsControlLibrary1".
So, jetzt stehe ich hier mit meinem Code:
public partial class DwgEditor : UserControl
{
public DwgEditor()
{
InitializeComponent();
}
}
das entsprechende Steuerelement habe ich diesmal auf dem vorgesehenen "Form" hinzugefügt.
Die ganzen falschen, zwischenzeitlichen Versuche habe ich gelöscht um nicht wieder als Depp beschimpft zu werden.
Nun kommt also das Event.
Dazu hab ich jetzt jede Menge an Threads, HowTos und was weiß ich noch alles gelesen.
Unter anderem diesen hier: [Lösung] Problem mit EventHandler
Ich werde nur nicht schlau draus.
Also wie fange ich das jetzt an?
Ich kann zwar mittlerweile alle Mausevents im Testform sehen (Weil die Projektvorlage ja von Control erbt) aber die Events werden nicht ausgelöst.
Mittlerweile hab ich echt keinen Durchblick mehr.
die events werden definitiv ausgelöst. hast du evtl vergessen dich zu registrieren?
und mich mehrfach drüber ausgekotzt habe wie beschissen das ist, immer wieder an fehlende Basics erinnert zu werden
du kannst z.b. auch nciht von einem arzt verlangen, das er dir genau erklärt, wie ein bestimmtes medikament auf zellularer ebene funktioniert, wenn du nciht mal weißt, wie eine zelle von innen aussieht.
Nachdem das mit den nested Classes aus DEINEM Link ja zumindest zu dem Erfolg geführt hat, dass ich das Control im Testprojekt mit seinen standard Eigenschaften verwenden kann
ja, da ist was schiefgegenagen. ich werde diesbezüglich rücksprache halten.
ps: das was du da im übrigen erstellst ist ein vollkomen neues steuerelement und daher erweiterst du nciht die komponente, um die es eigendlich geht.
Ok, dann geht es halt nicht.
doch es geht schon.
Nein, ich fürchte, dass das Steuerelement dafür niccht geeignet ist.
Die Beispiele aus Openbook etc. funktionieren alle, solange ich Windows.Forms.Controls ableite.
Sobald ich mein Steuerelement verwende gibts Brösel.
Beim Hinzufügen zur Toolbox gibts dann Meldungen wie "enthält keine Elemente die in der Toolbox angezeigt werden können" oder so ähnlich.
Habs zuletzt nochmal mit Kapitel 19.3 ausm Openbook probiert.
Ich versuch mir jetzt nen unsichbaren durchsichtigen Rahmen zu basteln, den ich drüber lege.
Ist zwar umständlich aber sollte funktionieren...
um was für ein steuerelement handelt es sich und zeig mal die vererbungshierarchie.
Es handelt sich um einen DWG-Viewer.
Eigentlich ist es ein Control, dass der Hersteller offensichtlich nur als Demo seiner Bibliotheken versteht und daher nicht supported.
Der Code um diesem Steuerelement eine Grafik zu übergeben ist alleine schon etwas zweifelhaft für mich:
//create device
odaViewer.Visible = true; //das Control
string RenderPath = DwgCalculating.commonCadFunctions.getRendererPath();
AcadDocument oDoc = drawing;
VIEWXLib.IOdaDevice2 oDevice = (VIEWXLib.IOdaDevice2)odaViewer.DeviceManager().NewDevice(RenderPath);
oDevice.UseCache = false;
oView = oDevice.SetupActiveLayoutViews((VIEWXLib.IAcadDatabase)drawing.Database);
oDevice.BackgroundColor = new int[3]{0,0,0};
oDevice.Update();
odaViewer.Dock = DockStyle.Fill;
Wie kann ich die Vererbungshierarchie herausfinden?
(ich weiß, das sind bestimmt wieder basics X( )
vielleicht hilft das:
ok, der hat aber schon mouseevents. hast du dich nicht registriert?
wie sehen denn die setstyle-eigenschaften aus (das bekommst du im debugger heraus)?
...wie registriere ich mich denn?
Ich war es bei Controls immer gewohnt in den eigenschaften einen doppelclick auf die gewünschten Events zu machen und dann hatte ich meinen Funktionsrumpf.
ja, das sind wieder grundlagen 😃
mit += .. schau mal in die designer.cs
Ja, ich denke Du meinst sowas:
this.mnuProjectClose.Click += new System.EventHandler(this.mnuProjectClose_Click);
das gibts für mein Control aber nicht.
Ach mann wo bekomme ich denn solche basics her? X(
das gibts für mein Control aber nicht.
das muss es geben, da die basisklasse "Control" diese bereitstellt.
...ausm Designer:
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.axOdaViewer1 = new AxVIEWXLib.AxOdaViewer();
((System.ComponentModel.ISupportInitialize)(this.axOdaViewer1)).BeginInit();
this.SuspendLayout();
//
// axOdaViewer1
//
this.axOdaViewer1.Enabled = true;
this.axOdaViewer1.Location = new System.Drawing.Point(133, 281);
this.axOdaViewer1.Name = "axOdaViewer1";
this.axOdaViewer1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject ("axOdaViewer1.OcxState")));
this.axOdaViewer1.Size = new System.Drawing.Size(287, 162);
this.axOdaViewer1.TabIndex = 0;
this.axOdaViewer1.MouseClick += new System.EventHandler(axOdaViewer1_MouseClick);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(567, 554);
this.Controls.Add(this.axOdaViewer1);
this.Name = "Form1";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize)(this.axOdaViewer1)).EndInit();
this.ResumeLayout(false);
}
Hab das manuell hinzugeschrieben aber bekomme den Fehler:
Fehler 1 Der Name "axOdaViewer1_MouseClick" ist im aktuellen Kontext nicht vorhanden. C:\Dokumente und Einstellungen\Fischer\Eigene Dateien\Visual Studio 2008\Projects\DDT.PDMS\DDT.Controls\TestApp\Form1.Designer.cs 44 69 TestApp
Intellisense gibt mir nix mit Click oder Mouse o.ä.
dann füge noch manuell im useranteil der klasse eine
"private void axOdaViewer1_MouseClick(object sender, EventArgs args){}"
hinzu (ich weiß jetzt nciht ob die eventargs passen. evtl musst du die noch ändern.
Hmm
Designer:
this.axOdaViewer1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.axOdaViewer1_MouseClick);
Formular:
private void axOdaViewer1_MouseClick(object sender, MouseEventArgs e)
{
MessageBox.Show("Klick");
}
Fehler 1 Eine implizite Konvertierung vom Typ "System.Windows.Forms.MouseEventHandler" in "System.EventHandler" ist nicht möglich. C:\Dokumente und Einstellungen\Fischer\Eigene Dateien\Visual Studio 2008\Projects\DDT.PDMS\DDT.Controls\TestApp\Form1.Designer.cs 45 45 TestApp
...wir reden aber im Augenblick schon vom vorhandenen Control, nicht mehr vom "selbst erstellten" ?
Wieso schmeist er mir denn diesen Fehler?
Ich hab ihm doch nirgends gesagt, dass es ein System.Event sein soll.
Wieso schmeist er mir denn diesen Fehler?
check nochmals den code, da die fehlermeldung zu dem unten geposteten code passen würde.
...wir reden aber im Augenblick schon vom vorhandenen Control, nicht mehr vom "selbst erstellten" ?
korrekt.
Ich hab den Code aus VS kopiert...
hier nochmal alles was es derzeit gibt. (zum Vergleich hab ich mal ne Textbox mit eingefügt)
Designer:
namespace TestApp
{
partial class Form1
{
/// <summary>
/// Erforderliche Designervariable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Verwendete Ressourcen bereinigen.
/// </summary>
/// <param name="disposing">True, wenn verwaltete Ressourcen gelöscht werden sollen; andernfalls False.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Vom Windows Form-Designer generierter Code
/// <summary>
/// Erforderliche Methode für die Designerunterstützung.
/// Der Inhalt der Methode darf nicht mit dem Code-Editor geändert werden.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.axOdaViewer1 = new AxVIEWXLib.AxOdaViewer();
this.textBox1 = new System.Windows.Forms.TextBox();
((System.ComponentModel.ISupportInitialize) (this.axOdaViewer1)).BeginInit();
this.SuspendLayout();
//
// axOdaViewer1
//
this.axOdaViewer1.Enabled = true;
this.axOdaViewer1.Location = new System.Drawing.Point(133, 281);
this.axOdaViewer1.Name = "axOdaViewer1";
this.axOdaViewer1.OcxState = ((System.Windows.Forms.AxHost.State)(resources.GetObject ("axOdaViewer1.OcxState")));
this.axOdaViewer1.Size = new System.Drawing.Size(287, 162);
this.axOdaViewer1.TabIndex = 0;
this.axOdaViewer1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.axOdaViewer1_MouseClick);
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(187, 108);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(214, 20);
this.textBox1.TabIndex = 1;
this.textBox1.MouseClick += new System.Windows.Forms.MouseEventHandler(this.textBox1_MouseClick);
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(567, 554);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.axOdaViewer1);
this.Name = "Form1";
this.Text = "Form1";
((System.ComponentModel.ISupportInitialize) (this.axOdaViewer1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private AxVIEWXLib.AxOdaViewer axOdaViewer1;
private System.Windows.Forms.TextBox textBox1;
}
}
und Form1.cs:
namespace TestApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void axOdaViewer1_MouseClick(object sender, MouseEventArgs e)
{
MessageBox.Show("Klick");
}
private void textBox1_MouseClick(object sender, MouseEventArgs e)
{
}
}
}
da ich ja ein Maus-Event brauche, brauche ich ja auch einen System.Windows.Forms.MouseEventHandler. Oder?
sollte eigendlich so wie es da steht funktionieren.
Gutes Argument...
um das sicher zu stellen habe ich die Textbox eingebaut und da ists passend...
Aber ich versuch das mal.
Fehler 1 Eine implizite Konvertierung vom Typ "System.Windows.Forms.MouseEventHandler" in "System.EventHandler" ist nicht möglich.
Das versuche doch mal
// Designer
this.axOdaViewer1.Click += new System.Windows.Forms.EventHandler(this.axOdaViewer1_Click);
// Im Code-Behind
private void axOdaViewer1_Click(object sender, EventArgs e)
EDIT: Etwas überlesen. Müsste funktionieren
ok, offensichtlich ist es bei diesem Control anders als bei der Textbox aber:
Das Ereignis MouseDown ist für dieses ActiveX-Steuerelement ungültig.
Da wären wir wieder beim "Fehlenden" Event.
Eigentlich hätte mir Intellisense dann doch auch den Vorschlag machen müssen oder?
Was ich nämlich bei allen Beschreibungen nicht verstanden habe: Nur weil ich da Klick hin schreibe weiß er doch noch nicht, dass ich Click meine, wenns nicht abgeleitet ist.
Mouse Down und MouseClick (mit System.EventHandler) bringen den gleichen Fehler
...guten Morgen...
Da ja nun offensichtlich die Maus-Events aus irgend welchen Gründen unerreichbar sind, komme ich um ein neues Steuerelement wohl nicht herum oder?
🤔
verdammt.
es ist höchst ungewöhnlich das da kein event existiert, das aber von der basisklasse implementiert wird. hol dir bitte mal den refrector und schau mal nach, was die getrieben haben um das event zu verdecken.
Hmm...
das ist glaub ich zu hoch für mich.
Ich hab keine Ahnung wo ich da suchen soll...
Ich würd das ja gerne hier posten aber ich fürchte da mach ich mich strafbar 😦
vielleicht bin ich ein Stückchen weiter.
Ich habe die dll mal dekompiliert und im VS geöffnet.
Den Entwurf kann ich wegen folgendem Fehler nicht anzeigen:
Der Designer kann keine Instanz des Typs System.Windows.Forms.AxHost erstellen, da dieser als abstrakt deklariert ist.
Die Hilfe sagt mir dazu:
Dieser Fehler tritt auf, wenn die Basisklasse des an den Designer übergebenen Objekts eine abstrakte Klasse ist (dies ist nicht zulässig).
Ist da ein genereller Fehler gemacht worden?
Der Viewer selbst erbt von AxHost. Wenn ich die Dokumentation von C# richtig verstehe wird hier nur ein anderes Steuerelement verfügbar gemacht.
Das ist, wenn ich den Code richtig verstehe eine Schnittstelle einer anderen dll.
Pff...
müsste diese dll dann nicht auch ein Control sein?
Also die Schnittstelle wird von einer Klasse implementiert, die wiederum von Object geerbt ist.
Hilft uns das weiter?
Ich habe die dll mal dekompiliert und im VS geöffnet.
Hi! Warum machst Du Dir soviel Arbeit? Wie Jack schon geschrieben hat, ist das mit dem Reflector eine Sache von ein paar Minuten. Die Events sind wie im VS mit einem gelben Blitzzeichen gekennzeichnet. Die ActiveX-Komponenten sind nicht an die Klassen,- und Vererbungshierachie des Frameworks gebunden. Die gehören zu COM (Component Object Model). MouseDown, Click u.s.w. ist i. d. R. ein Präfix (Kürzel der ActiveX-Komponente) vorangestellt (Z. Bsp.: ODAMouseDown) Grüsse - sarabande
Hallo sarabande.
Ja, Du hast ja Recht.
Ich habe mit dem Reflector das erste mal Kontakt gehabt und mir die DLL darin auch angeschaut.
Um das ganze mal als richtigen Code zu sehen, hab ichs halt mal exportiert.
...man soll ja alles mal ausprobieren 😃
Zu den Events...
Es gibt de fakto keine.
Hab gestern nochmal mit dem Hersteller kommuniziert.
Der Viewer war als Demo gedacht, woraufhin er von allen Kunden als professionelles Steuerelement erwatet wurde.
Um kein halbes Control zu liefern hat man sich kurzerhand entschlossen die Entwicklung hierfür gänzlich einzustellen.
Die Source dieser Bibliotheken und des Viewers bekomme/habe ich zwar aber zusätzlich zu C# jetzt auch noch C++, ist mir zuviel.
Ich bekam den Hinweis die Ereignisse des Forms einzufangen.
Da werde ich jetzt mal nach googeln.
Danke Euch für Eure Geduld.
Um kein halbes Control zu liefern hat man sich kurzerhand entschlossen die Entwicklung hierfür gänzlich einzustellen.
Hi! So spricht ein Monopolist oder Marktführer, der den Mitbewerber nicht zu fürchten braucht. 😃
Die Source dieser Bibliotheken und des Viewers bekomme/habe ich zwar aber zusätzlich zu C# jetzt auch noch C++, ist mir zuviel.
Wo kann man sich den Viewer mal runterladen oder brauche ich eine Lizenz?
Ich bekam den Hinweis die Ereignisse des Forms einzufangen.
Die Controls des FW haben einen Messagekeller (WndProc). Von dort werden die einzelnen Nachrichten an die Ereignisse, wie MouseDown, Click etc weitergereicht. Deine ActiveX Komponente hat sowas nicht. Laut Doku kann man das nachträglich implementieren.
MSDN: Subclassing Controls with a Managed Window Procedure]
http://msdn.microsoft.com/en-us/library/ms229681.aspx
[MSDN: How to: Use a Class for Hooking Windows Procedures]
http://msdn.microsoft.com/en-us/library/ms229658.aspx
Grüsse - sarabande
Hi sarabande
Naja, der Hersteller verkauft es zwar als "open Source" aber man bekommt es nur, wenn man Mitglied (kostenpflichtig) bei denen ist.
Und wenn man Applikationen entwickelt und dann die Libs mit verkaufen möchte darf man die Mitgliedschaft gleich mit 2000€ für 100 verkaufte Lizenzen / Jahr updaten, hat dann aber auch E-Mail Support.
Mit freiem download sieht es da nicht so toll aus.
Die haben zwar einige öffentliche DL's / Demos...
...obwohl mit Reflector müsste das doch reichen 🤔
Schau doch mal hier: www.opendesign.com
Also grundsätzlich sind die Libs echt sehr interessant und ich hab leider keine Alternativen gefunden.
Deine Links schau ich mir heute mal an.
Danke