Klassenvererbung CDC
-
Nabend,
ich habe mir eine neue Klasse (CZeichnen) erstellt, die ich von der Klasse CDC ableite.
class CZeichen : public CDC { ... };soweit noch alles ok.
jetzt hab ich in meinem Dialog anstatt des "normalen" CDC Handle ein Handle meiner Klasse CZeichen erstellt.
CZeichnen *pDC;wenn ich jetzt dies hier mache
wp = GetDlgItem(IDC_Zeichenflaeche); pDC = wp->GetDC();dann kommt er mir beim compilieren mit
error C2440: '=': 'CDC *' kann nicht in 'CZeichnen *' konvertiert werdenan der stelle, wo ich GetDC() mache.
Warum? Ich hab die Klasse doch nur abgeleitet?
-
Also meiner Meinung nach liegt dieser Fehler an folgendem:
wp = GetDlgItem(IDC_Zeichenflaeche);gibt einen Zeiger auf ein CDC Objekt zurück. Du möchtest diesen Zeiger nun auf einen Zeiger für ein CZeichen-Objekt casten. Dies ist natürlich nicht möglich, da zwar jedes CZeichen-Objekt ein CDC-Objekt ist (Polymorphismus) jedoch nicht jedes CDC-Objekt ein CZeichen-Objekt.
Ist das so verständlich?
-
hi
also so hab ich des jetzt hinbekommen
pDC = (CZeichnen*)wp->GetDC();dat macht er auch alles ohne probleme und nen FillSolidRect(..) macht er auch in der abgeleiteten Klasse wunderbar nur irgendwo hapert es noch.
also ich seh wie mein Rect weiß wird und dann peng wars das wieder.
dat dumme is nur, dass das ne assert ist, die ich net debuggen kann.
-
Kann nicht gehen, da dein IDC_Zeichenflaeche Objekt ja selbst zeichnet, und wenn du jetzt Dir den DC holst und drauf zeichnest wird das vom Objekt als nächstes mit seiner eigenen Zeichenfunktion wieder überzeichnet. Du solltest eine eigene Klasse für dein IDC_Zeichenflaeche ableiten und das Zeichnen dort selbst übernehmen (OnPaint) und dann sollte dein Problem gelöst sein.
Hoffe das ich das verständlich Ausgedrückt habe

Gruß Matthias
-
ne, dat hab ich jetzt net ganz verstanden
ich hab das ja sonst auch so gemacht
CDC *pDC;und mir dann darauf das DC gepackt und dann mit
pDC->MoveTo(...); pDC->LineTo(...);gezeichnet. nur das mache ich halt jetzt in meiner abgeleiteten Klasse CZeichnen mit dem this Zeiger
this->MoveTo...
-
is doch die Frage WO du zeichnest, wenn du das in der Dialogklasse machst in irgendeiner Funktion dann wird dein CStatic oder was es auch immer is, beim nächsten neuzeichnen das mit seiner eigenen Zeichenroutine wieder übermalen, und somit is deine ganze Zeichnerei für die Katz. Nehmen wir an dein IDC_Zeichenflaeche is ein Objekt von CStatic, dann leite eine eigene Klasse von CStatic ab und zeichen mit deiner Zeichenklasse in der OnPaint deiner abgeleiteten CStatic Klasse, die wird dann jedesmal automatisch aufgerufen wenn das Objekt neu gezeichnet werden muß. Einen weiteren Hinweis bekommst du auch in diesen Thread: http://www.c-plusplus.net/forum/viewtopic-var-t-is-208542.html, da wird so was ähnliches behandelt, wobei es mir nur um die Beziehung zwichen OnPaint und OnErasureBkgnd geht.
Hoffe das Du jetzt etwas mehr durchsiehst
-
ja, eigentlich ist auch das genau mein vorhaben gewesen.
zeichnen tu ich ja jetzt auch schon net mehr in der dialogklasse
nur vorher habe ich des immer so gemacht:
CDC* pDC; CWnd* wp; wp = GetDlgItem(IDC_Zeichenflaeche); pDC = wp->GetDC();somit konnt ich dann einfach mit dem pDC->MoveTo usw zeichnen
doch wie mache ich das denn dann so wie du des gerade beschrieben hast?
wenn dann müsste ich doch von CWnd eine Klasse dann ableiten, was ich dann auch in der Dialogklasse zuweisen kann
class CZeichnen : public CWnd { ... };CZeichnen myPDC; DDX_Control(pDX, IDC_Zeichenflaeche, myPDC);Ich hab das Projekt (neues Testprojekt) mal als download bereit gestellt!
http://test.mss-software.de/TestZeichnen.zip
-
Also was ich bei deiner vorlage gesehen habe is bestimmt etwas übers Ziel hinaus geschossen. Warum benutzt Du ein IPictureCtrl umj paar Linien zu zeichnen? Ersetze das IPictureCtrl durch ein CStatic und benenne es in IDC_Zeichenflaeche um, Erstelle eine Klasse die Du von CStatic ableitest (CZeichenflaeche) diese Klasse Verbindest Du mit IDC_Zeichenflaeche und in der OnPaint der Klasse CZeichenflaeche kannst du dann deine Klasse CZeichnen verwenden.
Hoffe ich hab das irgendwie sinnvoll rübergebracht wie das läuft. Ansonnsten kannste mich unter icq-nummer 276765885 ansprechen.
Gruß Matthias