OnDraw die 2.

mstank

Mitglied
Hallo und ein glückliches 2005 an alle!

In der Dokumentenklasse habe ich eine Methode (OnRS232Lesen), in der die Variable public: CString sMsg erzeugt wird. Mit GetData() als Interface soll sie der Ansichtsklasse zugängig gemacht werden. Eine MassageBox in OnRS232Lesen gibt die Variable auch richtig aus. In OnDraw wird auf das Interface zugegriffen. Beim Kompilieren treten keine Fehler auf, aber dennoch, es wird im Fenster der SDI-Anwendung kein Text angezeigt.

Code des Interface:
Code:
CString CRS232SerialCom1Doc::GetData()
{
 return sMsg;
}

Code von OnDraw:
Code:
void CRS232SerialCom1View::OnDraw(CDC* pDC)
{
 CRS232SerialCom1Doc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 // ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen
 CString txt=pDoc->GetData();
	pDC->TextOut(0,0, txt);
}

woran kann das liegen? Wer kann mir helfen?:(

THX Markus
 
Hast du mal testweise einen Text direkt in TextOut eingesetzt?

Hast du die Farbe des Textes gesetzt?
Hast du Invalidate aufgerufen?
 
Hallo Endurion!

Einstellungen wie Farbe kabe ich bisher nirgends gelesen. Was ist eigendlich Invalidate?

Gruß Markus
 
Hi,
Mithilfe von Invalidate kann Windows wissen, welcher Bereich im Fenster neugemalt werden muss. Da man so nicht das ganze Fenster neumalen muss sondern nur einen kleinen Teil, lauft der ganze Prozess viel schneller ab.
Falls das Programm sein Fanster neumalen will, muss es nicht nur eine WM_PAINT (OnDraw) Nachricht an das entschprechende Fenster schicken, sondern auch noch den Bereich Invalidate()n. Falls dies nicht gemacht wurde, werden die Änderungen nach OnDraw einfach nicht angezeigt. Meist heist die funktion Invalidate, wie z.B. CWnd::Invalidate(bool);
 
Worauf PixelShader und ich hinauswollen, ruf einfach nach dem TextOut ein Invalidate(); auf.
 
Schade eigendlich! Alles bleibt so wie vorher.

Irgendwo meine ich gelesen zu haben, daß die Methode OnDraw automatisch aufgerufen wird, sobald sich irgendetwas in der Dokumentenklasse ändert. Daher habe ich nun die Vermutung, es ändert sich nicht das Richtig in der Dokumentenklasse. Somit sieht sich die Dokumentenklasse nicht veranlaßt, die OnDraw aufzurufen. Das muß wohl irgendwie über GetDacument() laufen. Aber den genauen Zusammenhang kenne ich nicht.

Kann mir vieleicht jemand sagen, wo ich im Internet qualitativ gut fündig werden kann zum Thema MFC's und Ansichtsklasse?

THX Markus
 
Ah, du änderst was im Doc, nicht im View. Dann gibt es die Methode UpdateAllViews im Doc, die ruft für alle Views das Invalidate auf. Als ersten Parameter einfach NULL übergeben, die anderen sind vorbelegt.

Hilfe zu MFC findest du am besten in der MSDN, es gibt aber zwei Seiten, die sich auch sehr gründlich mit MFC beschäftigen: http://www.codeguru.com und http://www.codeproject.com.
 
Hi Endurion!

Kennst du eine Quelle, wo ein einfaches Beispiel steht, indem der Vorgang erklärt wird?

THX Markus
 
Das ist leider ein recht ausführliches Thema, wenn du die MSDN lokal installiert hast (sonst die online), würde ich auf "Index" gehen, dort auf "General MFC Topics" und dort die für dich interessanten Punkte durchlesen. Meistens sind da auch noch erklärende Grafiken drin versteckt.
Die MSDN erklärt das alles sogar recht gut, allerdings immer ein bisschen verstreut; d.h. wenn man den "richtigen" Suchbegriff nicht hat, findet man nicht, was man will.
 
Zurück