assertion failure durch CButton in OnDraw
-
hi.
ich programmiere in visual c++.net 2003 und bin leider recht neu. stehe schon vor dem ersten fehler und weiß nichtmehr weiter.
ich habe eine normale SDI andwendung erzeugt und dort in der OnDraw methode einen schalter erzeugt. jedoch bekomme ich dann hier einen fehler wenn ich das programm laufen lasse.zuerst deklariere ich den schalter in der header datei:
CButton m_Schalter;und danach kommt in der OnDraw methode:
m_Schalter.Create("Temperatur", WS_CHILD | WS_VISIBLE, CRect(300, 100, 400,150), this, ID_BUTTON);jedoch gibt er mir dann einen "assertion failure" aus und sagt, dass etwas in der wincore.cpp nicht passt. hätte eigentlich schon einen passenden link mit genau meinem problem gefunden, jedoch verstehe ich noch nicht ganz wie ich das nun in meinem projekt anwende: http://www.codeguru.com/forum/showthread.php?p=978511
könnte mir hierbei bitte jemand helfen ??
danke
-
It looks like createScreenConfig is called more than once - the assertion fails if you call Create() for a button that has already been created.
Genau das dürfte auch auf dein Problem zutreffen - du erzeugst den Button bei JEDEM OnDraw-Aufruf neu (und davon kommen während des Programmstarts einige. Beste Lösung dürfte es wohl sein, den Create()-Aufruf in eine andere Methode zu verlagern - OnInitDialog() würde sich anbieten.
-
danke erstmal, das ergibt einen sinn.
jedoch will ich meinen schalter in meiner xxxView.cpp datei erstellen und dort gibt es ja keine OnInitDialog Funktion, oder kann ich den Code dort noch woanders einfügen ?
-
Nimm OnInitialUpdate, das ist das Äquivalent.
-
Milchmann schrieb:
danke erstmal, das ergibt einen sinn.
jedoch will ich meinen schalter in meiner xxxView.cpp datei erstellen und dort gibt es ja keine OnInitDialog Funktion, oder kann ich den Code dort noch woanders einfügen ?
CView hat dafür die Methode OnInitialUpdate()
MSDN schrieb:
Override this function to perform any one-time initialization that requires information about the document.
-
danke danke!
ich kapiers und es geht
jetzt hab ich nurmehr ein problem
wenn ich meinen Button drücke verändert sich ein viereck, dass ich bereits programmiert habe. die Doc/View architektur hab ich bereits begriffen und ich habe alle variable in der Doc deklariert und zeichnen tu ich ausschließlich in der View. Jedoch bei betätigen des Buttons ändern sich zwar alle werte jedoch kapiert das programm dies erst wenn ich z.B. die fenstergröße verändere oder das fenster minimiere. d.h. ich schaff es nicht, dass sich das fenster automatisch bei button druck aktualisiert.
irgendwelche vorschläge?
-
Versuch's mal mit Invalidate().
-
auf den befehl bin ich bereits gestoßen aber konnte ihn nicht sinnvoll anwenden. in der OnDraw funktion aktualisiert sich dann das programm alle paar milisekunden das es furchtbar lagt. in OnInitialUpdate passiert nichts. den OnClicked befehl für den schalter habe ich in der Doc und dort wird Invalidate nicht erkannt.
-
Invalidate() ist eine Methode der View und wird immer dann aufgerufen, wenn du der Meinung bist, daß etwas neu gezeichnet werden muß (deshalb ist OnInitialUpdate zu früh und OnDraw zu häufig). Vom Document aus mußt du dir erstmal das View besorgen, um es dann zu invalidieren:
void CMyDoc::OnButton() { ... AfxGetMainWnd()->GetActiveView()->Invalidate(); }
-
ich krieg das einfach nicht hin. hab versucht den code einzubinden und kommt immer diese fehlermeldung:
error C2039: 'GetActiveView' : is not a member of 'CWnd'
oder wenn ichs anders versuch:
error C2440: 'type cast' : cannot convert from 'void' to 'CbarsDoc *'
oder solches zeug. blick da einfach nicht durch
-
Probiers so:
[cpp]void CMyDoc::OnButton() { ... static_cast<CFrameWnd*>(AfxGetMainWnd())->GetActiveView()->Invalidate(); } [/cpp]
Das müsste klappen
-
danke danke danke !!
geht alles einwandfrei
wäre nie alleine draufgekommen, muss noch viel lernen