Zombiezustand?
-
Da mir der normale Button bei den Windowsforms ja nicht die gewünschte Funktionalität bietet (Rechtsklick) wollte ich nun von System::Windows::Forms::Button ableiten. Beim erstellen mit Visual C++ erhalte ich aber die Meldung, daß die gewünschten Daten sich in einem Zombiezustand befinden. Es wird danach nur ein leerer Header und gar keine .cpp-Datei erzeugt. Woran zum Geier liegt das nun wieder?
Bis dann denn!
McTrevor
p.s.: Jetzt ging es kurioserweise... Wieder so ein unerklärliches Mysterium auf dem beschwerlichen Weg, programmieren zu lernen
-
Threadrecycling
habe mir jetzt selber einen Button aus der Standardbuttonklasse abgeleitet. Wie bekomme ich nun den Forms-Designer dazu, auch meine Button-Version als Form-Element zu zu lassen? Habe zuerst versucht, den einfach in der Toolbox als Element anzugeben, aber die nimmt nur dll und exe-Dateien. Wie kann ich nun also meinen selbst gebastelten Button in Forms verwenden, die im Designer erstellt werden?
Bis dann denn!
McTrevor
-
Eigentlich sollte er unter "User Controls" auftauchen... Ansonsten musst Du eine eigene Assembly erstellen...
PS: Und wenn Du einen eigenen Button machen willst, dann solltest Du ihn von "ButtonBase" ableiten...
-
Jochen Kalmbach schrieb:
Eigentlich sollte er unter "User Controls" auftauchen... Ansonsten musst Du eine eigene Assembly erstellen...
Langsam bitte. Was ist eine Assembly und wie erstelle ich sie? Und wo finde ich diese User-Controls? Habe ganz normal eine Klasse dem Projekt hinzugefügt und als Oberklasse einfach System::Windows::Forms::Button angegeben.
PS: Und wenn Du einen eigenen Button machen willst, dann solltest Du ihn von "ButtonBase" ableiten...
Warum das? Der Button soll wirklich nur zusätzlich noch auf Rechtsklicks reagieren und sich ansonsten wie ein normaler Button verhalten. Ist es da nicht ein bischen übertrieben, von ButtonBase abzuleiten?
Bis dann denn!
McTrevor
-
Der Button muss public sein, ein Standardkonstruktor ist auch nicht schlecht, dann sollte er in der Toolbox schon auftauchen. Dazu muss er sich auch nicht in einer anderen Assembly befinden.
-
Optimizer schrieb:
Der Button muss public sein, ein Standardkonstruktor ist auch nicht schlecht, dann sollte er in der Toolbox schon auftauchen. Dazu muss er sich auch nicht in einer anderen Assembly befinden.
Ist alles gegeben. Nur irgendwie muss ich der Toolbox doch mitteilen, daß meine Klasse nun auch ein solches Control-Element ist. Ich verwende übrigens die kostenlose Express-Edition, falls das darauf einen Einfluß hat.
Bis dann denn!
McTrevor
-
Nur irgendwie muss ich der Toolbox doch mitteilen, daß meine Klasse nun auch ein solches Control-Element ist.
Ich muss das normal nicht. Kann vielleicht daran liegen, dass ich von UserControl ableite. Moment, ich teste mal schnell...
Ne, folgendes geht beim mir:
namespace foobar { public class SuperGeilerButton : System.Windows.Forms.Button { } }
-
Optimizer schrieb:
Nur irgendwie muss ich der Toolbox doch mitteilen, daß meine Klasse nun auch ein solches Control-Element ist.
Ich muss das normal nicht. Kann vielleicht daran liegen, dass ich von UserControl ableite. Moment, ich teste mal schnell...
Ne, folgendes geht beim mir:
namespace foobar { public class SuperGeilerButton : System.Windows.Forms.Button { } }
Einen eigenen namespace muss ich aber nicht definieren dafür, oder? Und in welchem Karteireiter erscheint der eigene Button dann in der Toolbox? Bin an der Uni, kann leider erst heute abend prüfen, ob´s klappt.
Bis dann denn!
McTrevor
-
In einem Karteireiter der so heißt wie meine Assembly.
-
Ich habe mal einen Screenshot gemacht, wie das ganze bei mir aussieht. Der rightClickButton findet sich bei mir jedenfalls nicht in der Toolbox...
http://people.freenet.de/mctrevor/visual.PNGDer Header meines Buttons:
#pragma once using namespace System; public ref class rightClickButton : public System::Windows::Forms::Button { public: rightClickButton(void); private: bool pressed; System::Void Mouse_Down(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e); System::Void Mouse_Leave(System::Object^ sender, System::EventArgs^ e); System::Void Mouse_Up(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e); };
und der Body:
#include "StdAfx.h" #include "rightClickButton.h" rightClickButton::rightClickButton(void) { //default Konstruktor System::Windows::Forms::Button(); //meine Modifikation pressed = false; this->MouseDown += gcnew System::Windows::Forms::MouseEventHandler(this, &rightClickButton::Mouse_Down); this->MouseLeave += gcnew System::EventHandler(this, &rightClickButton::Mouse_Leave); this->MouseUp += gcnew System::Windows::Forms::MouseEventHandler(this, &rightClickButton::Mouse_Up); } System::Void rightClickButton::Mouse_Down(System::Object ^sender, System::Windows::Forms::MouseEventArgs ^e){ this->pressed = true; this->SetStyle(System::Windows::Forms::ControlStyles::StandardClick, true); } System::Void rightClickButton::Mouse_Leave(System::Object ^sender, System::EventArgs ^e){ this->pressed = false; this->SetStyle(System::Windows::Forms::ControlStyles::StandardClick, false); } System::Void rightClickButton::Mouse_Up(System::Object ^sender, System::Windows::Forms::MouseEventArgs ^e){ if(this->pressed){ this->pressed = false; this->SetStyle(System::Windows::Forms::ControlStyles::StandardClick, false); this->OnMouseClick(e); } }
Bi mir allerdings noch nicht sicher, ob der Button so das Gewünschte liefert. Kann ihn eh nur so wie gewollt verwenden, wenn ich den Designer dazu bringe, auch den Button anzuzeigen.
Also wie erstelle ich eine Assembly und bekomme den Button in meine Toolbox (das Teil rechts auf dme Screenshot)?
Bis dann denn!
McTrevor
p.s.: Kann man hier keine Bilder direkt anzeigen?
-
Sieht schon richtig aus. Vielleicht schaffst du es in den Toolbox-Einstellungen, den Button anzeigen zu lassen. Rechtsklick, chhoose items.
Eine Assembly musst du nicht explizit erstellen -> deine .exe ist so eine Assembly.
Vielleicht kanns sonst der C++/CLI-Klassendesigner nicht, der Code sieht jedenfalls nicht verkehrt aus bzgl. der Klassenstruktur.
-
Das ist ja krass! Der sucht sich aus der exe echt den Button raus! Jetzt funktionierts! Vielen Dank! Nur die Animation des Klicks funktioniert noch nicht. Kennt sich da vielleicht irgendjemand aus und weiß, was ich setzen muss, damit der Button auch optisch gedrückt wird? Die mitgelieferte Dokumentation ist da leider nur sehr unvollständig...
Bis dann denn!
McTrevor
-
Hat denn hier keiner vielleicht eine Idee? Nach allem was ich in der Dokumentation gelesen habe ist es wohl nicht möglich, indem man einfach ableitet. Und wenn es doch so gehen sollte, ist es nicht anhand der Dokumentation herauszufinden. Es kann doch echt nicht sein, daß man den Button komplett neu implementieren muss, wenn man will, daß der auch mit Rechtsklick bedient werden kann. Ich bin doch bestimmt nicht der erste Mensch auf der Welt, der sowas vorhat...
Bis dann denn!
McTrevor