methode ueberschreiben
-
Heiho
folgendes
ich hab ein fenster mit den ganzen buttons, checkboxen - listen - menue usw erstellt - alles in der ChildView
nu hab ich eine neue klasse dazu gepackt und diese ChildView als basisklasse
nu geht es darum, wenn ich auf etwas klick {button oder menu item} springt das programm in die funktion in den childview, aber ich moechte das die funktion in der neuen klasse angesprochen wird
ueberschreiben bringt nix /=
jemand ne loesungsidee fuer mich ?
class CChildView : public CWnd { private: DECLARE_MESSAGE_MAP() public: virtual afx_msg void OnFunction(); };
BEGIN_MESSAGE_MAP(CChildView,CWnd ) ON_COMMAND(ID_MENUITEM, OnFunction) END_MESSAGE_MAP() void CChildView::OnFunction() { int Hier_Springts_Hin = 0; }
class CMainClass : public CChildView { public: afx_msg void OnFunction(); };
void CMainClass::OnFunction() { int Hier_Solls_Hin = 0; }
// dazuedit - verschrieben {o;
-
Löse mal in der CMainClass.cpp die OnFunction() auf. dann sollte es eigendlich gehn. Dort wo es hinsoll heist die funktion völlig anderst als sie in der CMainClass.h deklariert wurde. Somit kann es dort nicht hin, weil du die funktion nämlich NICHT überschrieben hast, bzw. diese gar nicht angesprochen wird.
und wenn ich das richtig versteh, fehlt dir auch in der CMainClass die BEGIN_MESSAGE_MAP mit dem verweis auf die OnFunction. Wenn die nämlich nicht da ist kann es nur in die CChildView::OnFunction() springen.
LowFly
-
ups - habs editiert, hatte das falsche kopiert #gg
auf jeden fall, die funktion "OnFunction" hab ich ueberschrieben
das mit der messagemap leuchtet mir ein, hatte ich auch {kurz} probiert
mein problem ist:
CMainClass.cpp
BEGIN_MESSAGE_MAP(CMainClass, CChildView) ON_COMMAND(ID_MENUITEM, OnFunction) // error, because unknown ID END_MESSAGE_MAP()
mein problem ist, das CMainClass die ID's irgendwie nicht kennt /=
mein gedanke ist das ich die childview klasse als schnittstelle zur gui benutz, durch das erben bekomm ich ja direkten zugriff auf listen, editboxen, checkboxen usw
mein letzter gedanke war, das ich irgendwie in der OnFunction bei childview eine message an CMainClass sende - da weiss ich aber auch nicht wie /=
-
Die ID's stehen normalerweise in deiner "ressource.h" - hast du eventuell einen #include vergessen?
PS: Wie legst du eigentlich dein Fenster letztendlich an? Eventuell hast du ja wirklich nur ein CChildView.
-
Ressource includen bringt nix
Ich habs automatisch erstellen lassen am anfang
als erstesAppName.h/.cpp = class CAppName : public CWinApp
MainFrm.h/.cpp = class CMainFrame : public CFrameWnd
ChildView.h/.cpp = class CChildView : public CWndund in CChildView hab ich dann die ganzen creates gemacht - also listen, buttons, texte usw erstellt und anzeigen lassen
ich nahm an, da ich CMainClass von CChildView erbe, mach ich der klasse auch die buttons usw bekannt und kann deren messages abfangen bzw ueberschreiben /=
//dazuedit
mit buttons gehts auch nicht:
BEGIN_MESSAGE_MAP(CMainClass, CChildView) ON_BN_CLICKED(ID_BUTTON, OnButtonClick) ON_COMMAND(ID_MENUITEM, OnFuncion) END_MESSAGE_MAP() void CMainClass::OnButtonClick() { int HIer_Komm_ich_auch_nicht_hin = 0; }
includiert hab ich die ressource.h und die header mit meinen ids vom create
-
Nur weil du in deinem Projekt eine Klasse "CMainClass" definierst, wird die noch lange nicht als Hauptfenster verwendet Dazu mußt du in der Initialisierung noch festlegen, daß du ein CMainClass-Fenster verwenden willst.
(bin mir nicht ganz sicher, wo das geht - warte mal auf die Experten)
-
wer sagt das ich die neue klasse als hauptfenster verwenden will - ich will lediglich das buttonklicks usw in dieser klasse fliegen
und ich in der klasse direkten zugriff auf listen usw habalso childview nur fuer die grafikelemente und MainClass dann fuer das eigentliche "leben"
zb, in ChildView erstelle ich eine liste
klick auf ein knopf und daraufhin soll sich die liste fuellenund das fuellen soll in der mainclass stattfinden
direkten zugriff auf die liste hab ich ja durch das erben - nur - woher weiss mainclass das etwas angeklickt wurdewenn ich mainclass nicht ableite von childview sondern als element von childview mach, kann ich zwar die button klicks zu childview schicken {funktion aufrufen} aber ich hab dann kein direkten zugriff mehr auf die elemente - muesste ich jedesmal ein pointer mitgeben
-
Da mußt du aber einiges an deinem Design umändern. Ableitung definiert eine "ist-ein" Beziehung - aber du benötigst eher eine "kennt" oder "verwendet" Beziehung zwischen deinen Klassen.
PS: Irgendwo in der App findest du auch einen Pointer auf das aktive Fenster.
-
hmm - dann weiss ich nicht wie ich ansetzen soll
mal simpel angefangen
ich benutz CChildView zur erstellung von allen elementen die angezeigt werden
CChildView ist demzufolge die guinu moechte ich eine haupt klasse wo ich dem programm leben einhauche
diese klasse muss natuerlich zugriff haben auf die elemente in der guies ist kein problem eine methode in der childview zu machen {sowas wie OnBnClicked} und dann eine methode in der haupt klasse aufrufen
wie implementier ich die klasse
wenn ich die ableite von der gui klasse, hatt sie zwar vollen zugriff auf die elemente, aber ich kann keine methode aufrufen sobald was angeklickt wurdewenn ich die hauptklasse direkt in der gui klasse deklariere - kann ich die methoden aufrufen, aber die klasse hat keinen zugriff auf die elemente
/=
ich moechte halt gui und verarbeitung voneinander trennen
-
Mr Evil schrieb:
ich moechte halt gui und verarbeitung voneinander trennen
Genau das macht doch das Doc-View-Modell.
Hast du keine Doc Klasse?
-
noe ?
wie gesagt, ich hab das projekt vom wizard erstellen lassen und dann die gui in der ChildView gebastelt
Doc sagt mir gar nichts - wie implementier ich das ?
-
Der Wizard erstellt das Doc mit, wenn man ihm das sagt. Das wirst du wohl nicht getan haben und daher fehlt es.
Welches VC hast du?
Ist das eine MDI-Anwendung?
-
ich hab mal geschaut - stimmt - das docview architecture hatte ich deaktiviert
benutz VS 2005 Prof
ist ein Single document und da hatte ich
"Document/View architecture support" deaktiviertich dacht das ist irgendwas wegen dateien schreiben / lesen bla, weil ich da staenig was von print gelesen hab #gg
mal so gefragt
wenn ich das so erstellekann ich alles was ich jetzt in der childview erstellt hab dort in der "View" erstellen und klicks darauf in der doc abfangen ?
View -> erstellen eines buttons und einer liste
Doc -> message bekommen von den BnClicked und zugriff auf die liste??
waere ideal {=
-
Das geht ein wenig anders:
Der Klick kommt im View an.Im View hast du mit Hilfe von GetDocument Zugriff auf das Doc und kannst dort dann Funktionen aufrufen wie du magst.
Schau mal da: http://www.c-plusplus.net/forum/viewtopic-var-t-is-125623.html (Kapitel 4)Der View sollte dann Anzeigekram machen und das Doc sowas wie laden und speichern.
-
HA - funzt {=
in hab in View ein button erstellt und in Doc dann das ON_BN_CLICKED
und es funktioniert {=
muss nu "nur" noch alles von meiner alten app nach der neuen app uebertragen
vielen dank dir {=
-
Kein Problem
-
etwas versteh ich grad nicht
also
ich hab ein button in View erzeugt, und fange den klick in Doc ab
nu moechte ich eintraege in eine liste setzen die ich auhc in view erzeugt habda stellt sich mir die frage
wie kann ich von Doc aus auf die Liste von View zugreifen /=
ach ok - vergiss es #gg
=
void CFR2Doc::OnFunction() { COwnView* pView = dynamic_cast<CFR2View*>(((CMainFrame*)AfxGetMainWnd())->GetActiveView()); pView->i = 15; }
-
Da sieht man mal wieder, wie nützlich das Magazin ist: Zusammenhänger der SDI-Klassen