Diagramm zeichnen in Dialogbasierter Anwendung MFC C++
-
Hallo,
als alter Pascal und Assemblerprogrammierer habe ich folgendes Problem:
Ich habe eine Dialogfeld-Anwendung mit MFC VC++ erstellt.
Nun suche ich ein Steuerelement, das ich dort (dynamisch) einbauen kann, in dem ich selber aus einer Tabelle ein Diagramm zeichnen will.Wie man in einer SDI Anwendung im Fenster zeichnet, weiß ich, aber ich find kein Control oder keine Klasse für eine Dialog-Anwendung, die scheinen alle Textorientiert zu sein.
Was kann man da machen, geht das überhaupt? Hilfe!
Gruß vom Umsteiger
-
Zeiche doch einfach auf die Dialogoberfläche. Du brauchst nur auf die WM_PAINT reagieren, die Funktion dazu heißt OnPaint. In der brauchst Du Dir nur einen Gerätekontext zum Zeichnen holen und schon kanns losgehen.
-
also, ich kann ohne weitere Vorbereitung auf die Oberfläche zeichnen?! Das probier ich mal! Danke, wär schon die Lösung.
-
Umsteiger schrieb:
also, ich kann ohne weitere Vorbereitung auf die Oberfläche zeichnen?! Das probier ich mal! Danke, wär schon die Lösung.
Ohne Vorbereitung stimmt nicht ganz. Du musst Dir wie gesagt einen Gerätekontext holen. Bei der OnDraw eines SDI-Projektes wird er Dir schon übergeben.
-
Bei einer SDI Anwendung zeichne ich fröhlich.
Ich muß aber in das Hauptdialogfenster einer DialogAnwendung zeichnen, da gibts auch einen DC, mit eingeschränkten Funktionen, aber immerhin.
nur, da tut sich auf meinem Bildschirm garnichts.^also ich hol mir den DC so:^
CPaintDC dc(this);
^und übergeb ihn an eine Funktion, Compiler meckert nicht, in der Funktion gehts dann weiter:^
CString strTmp="Hallole";
pDC->DrawEdge(&rct,EDGE_SUNKEN,BF_MONO);
pDC->DrawText(strTmp,5,&rct,DT_CENTER);^leider ist nix zu sehen - gibt da auch so eine Art Invalidate()?^
-
Umsteiger schrieb:
Bei einer SDI Anwendung zeichne ich fröhlich.
Ich muß aber in das Hauptdialogfenster einer DialogAnwendung zeichnen, da gibts auch einen DC, mit eingeschränkten Funktionen, aber immerhin.
nur, da tut sich auf meinem Bildschirm garnichts.^also ich hol mir den DC so:^
CPaintDC dc(this);
^und übergeb ihn an eine Funktion, Compiler meckert nicht, in der Funktion gehts dann weiter:^
CString strTmp="Hallole";
pDC->DrawEdge(&rct,EDGE_SUNKEN,BF_MONO);
pDC->DrawText(strTmp,5,&rct,DT_CENTER);^leider ist nix zu sehen - gibt da auch so eine Art Invalidate()?^
Musst das nicht fett schreiben, habe das auch so verstanden.
Wo zeichnest Du denn fröhlich? Doch hoffentlich in der OnDraw Deiner SDI-Anwendung. Wie ich schon sagte gibts die nicht und bei der Dialoganwendung musst Du die OnPaint nehmen:void CDeineDialogKlasse::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: Fügen Sie hier Ihren Meldungsbehandlungscode ein. // CDialog::OnPaint() soll zum Zeichnen von Meldungen nicht aufgerufen werden. //hier kommen Deine Zeichenbefehle }So sollte es funktionieren. Ansosnsten gehts aber auch sonst wo mit dem Anfordern eines Gerätekontextes, die OnPaint garantiert Dir aber das Neuzeichnen, wenn z.B. Teile des Anwendungsfensters verdeckt waren. Was meinst Du mit Übergeben an eine andere Funktion? Poste das Ganze doch mal.
-
So, jetzt zeichnet es wie gewünscht, lag an mehreren Sachen.
Es bleibt aber noch eine Frage:
wenn ich nur mein Diagramm neu aufbaue, sollte ich das Ereignis OnPaint() neu auslösen. Bis jetzt muß ich dazu eine andere Anwendung in den Vordergrund schalten, dann wieder meine und es ist upgedated (up-ge-dated was fürn Wort!).
Bei SDI gibts ja invalidate und updateviews oder so ähnlich, aber wie heißt das Äquivalent dazu für ein Dialogfeldprogramm (gelobt sei die Inkonsistenz...)?
-
Einfach dazu Invalidate aufrufen. Dies veranlasst ein neues OnPaint Event.
-
Ja wie schon Martin Richter sagt geht das auch mit Invalidate(). Das ist ja eine Funktion von CWnd, gilt logischerweise auch für Dialogfenster. Kannst auch InvalidateRect() nehmen, um nur einen Bereich als ungültig zu erklären. Teilweise minimiert das auch das Flackern.