000
09.05.2004, 12:19 Uhr
~Filopher
Gast
|
Hallo.
Ich bin neu hier und habe gleich mal eine Frage. Vielleicht sollte ich dabei betonen, dass ich nicht nur im Forum sondern auch in VC++.net ein ziemlicher Neuling und immer noch auf Entdeckungsreise bin. Mein C++ Wissen beschränkt sich auf das Lesen eines Buches und nun möchte ich praktische Erfahrungen sammeln. Hinzu kommt, dass ich in 10 Wochen eine Arbeit abgeben muss.
So, nun zu meinem Problem. Ich habe ein einfaches Dokument mit MFC-Unterstützung starten lassen. Nun gibt es ja mit Hilfe der Klasse CSplitterWnd die Möglichkeit sein Hauptfenster mit dynamischen Splitterfenster zu verziehren. Nun gefallen mir aber diese seltsamen Trennbalken nicht, die die einzelnen Ansichten auf das Dokument voneinander separieren wollen.
Jetzt habe ich mir gedacht, da ich mich sowieso nicht mit Visual C++ auskenne, mache ich es mir besonders schwer und möchte meine eigenen Trennbalken zeichnen!
Also habe ich mir folgende Klasse angefertigt:
Code: |
class CTrennfenster : public CSplitterWnd { private: CRect Button;
public:
//Überschreibung void OnDrawSplitter( CDC* pDC, ESplitType nType, const CRect& rect); };
|
Wie man leicht sieht, soll diese Klasse alles beim alten lassen, nur die Funktion zum Zeichnen der Trennstriche soll abgeändert werden (geht, weil sie im Original virtuell ist). Diese zusätzliche Variable Button vom Typ CRect ignorieren wir mal.
Jetzt habe ich die Funktion folgendermaßen überschrieben:
Code: |
void CTrennfenster::OnDrawSplitter( CDC* pDC, ESplitType nType, const CRect& rect) { CPoint LinkeEcke = rect.TopLeft(); CPoint RechteEcke = rect.BottomRight();
if (nType == splitBar) { Button = CRect(LinkeEcke.x +1,LinkeEcke.y + 1,RechteEcke.x - 1,RechteEcke.y -1 ); //pDC->SelectStockObject(BLACK_PEN); //pDC->Ellipse(Button); } }
|
Das explizite Aussehen der Funktion ist eigentlich nicht so wichtig. Wichtig ist, dass alles optimal läuft, wenn ich das Programm so kompiliere und starte. Wenn ich jedoch die Kommentarstriche bei den letzten beiden Befehlen wegnehme, stürzt das Programm mit einem Speicherlesefehler ab, sobald ich tatsächlich die Trennbalken bewege und sie neu gezeichnet werden sollen (also diese Funktion aufgerufen wird). Genauer gesagt stürzt das Programm immer dann ab, wenn ich irgendwie auf den Zeiger des Gerätekontext pDC zugreifen möchte. Aber eigentlich sollte dies doch funktionieren, denn wie soll ich sonst in das Fenster zeichnen, wenn nicht über pDC?
Was mache ich also falsch? |