OnPaint im ersten Dialog aktualisieren?

Ron-calli

Grünschnabel
Moin Moin,
folgendes Problem versuche ich grade zu beheben: Ich habe eine MFC-Anwendung mit Anwendungstyp: Mehrfaches Dokument. Im ersten (haupt) Dialog wird ein weiterer Dialog (dateneingabe) aufgerufen, in dem man in einem Cedit mehrere Zahlen eingeben kann. Diese Zahlen werden für verschiedene Statistik-algorithmen missbraucht (Mittelwert,Median, Varianz...) und die Ergebnisse werden im 1. Dialog im Cedit ausgegeben. Jetzt habe ich vor die Daten noch in ein Koordinatensystem ausgeben zu lassen, welches im 1. Dialog erscheinen soll.
In der OnPaint() methode habe ich schonmal die Achsen zeichnen lassen, jetzt versuche ich erstmal eine Skalierung auf der x-achse zu erstellen:

Code:
Code:
for(int skala = 0; skala < iAnzahl; skala += 20)
    {
        dc.MoveTo(skala, -22);
        dc.LineTo(skala, -18);    
    }
    //ende Koordinatensystem
    }

iAnzahl bekommt im 2. Dialog die Anzahl der eingebenen Werte zugewiesen. Wie kriege ich es jetzt hin das die Skalierung gezeichnet wird, nachdem im 2. Dialog Werte eingeben werden?
Also wie kann ich die OnPaint methode aktualisieren, nachdem im 2. Dialog Daten eingegeben worden sind?

Danke im Vorraus!
 
Was ist jetzt genau deine Frage?

Wie du die Variablenwerte in den ersten Dialog bekommst, oder wie du die OnPaint aufrufst?

Im der Klasse des Dialog 1, Membervariablen anlegen (soviele wie du brauchst).
Beim Starten des Dialog 2, einen Pointer auf Dialog 1 mitgeben.

Code:
class dialog1
{
public:
int Membervar1;
int Membervar2;
...
}
//--------------------------------------
class dialog2
{
public:
dialog1 *zeiger;
...
}
//--------------------------------------
//vor aufruf des 2. dialoges:
...
dialog2 dlg;
dlg.zeiger = this;              //pointer übergeben
dlg.DoModal();
...
//--------------------------------------
//im dialog 2:

zeiger->Membervar2 = blabla;
zeiger->Refresh();             //ruft OnPaint im Dialog 1 auf
Ich hoffe ich konnte dir helfen .
Mfg Col.Blake
 
Zuletzt bearbeitet:
jup,
endurion du hast recht.Ich hab nochmal nach geschaut,Refresh() gibt es nicht. Was ich meinte ist UpdateWindow(),das ruft das OnPaint-Ereignis auf. Sorry!

RedrawWindow() kann man auch benutzen.

Mfg Col.Blake
 
Moin und erstmal vielen Dank!
Das zeichnen bekomm ich hin, jedoch übergibt er einen Array nicht :(

Code vom Hauptdialog:
Code:
void CBio070904Dlg::OnPaint() 
{
	if (IsIconic())
	{
          Blah blah
        }
	else
	{
		Blah ein wenig statisches Zeichnen...
		//wichtig, holen des arrays!
		char *szGraph = new char[MAXEINGABE];
		CMsgDlg *objDaten = new CMsgDlg();
		szGraph = objDaten->szDaten;
		//Jetzt sollen die werte eingezeichnet werden, jedoch bleiben sie auf gleicher                     
                //höhe
		for(int lala = 0; lala < iAnzahl; lala++)
		{
		    int i = 0;
	            int iB = 10; 
			dc.MoveTo(-190+iB*i, szGraph[i]);
			dc.LineTo(-190+iB*i, szGraph[i]+5);	
                    i++;            
		}
		CDialog::OnPaint();
	}
Code von der Klasse aus welcher das Array geholt werden soll:
Code:
void CMsgDlg::OnBnClickedButtonstart()
	{
		CEdit *objEingabe1 = (CEdit *) GetDlgItem(IDC_EINGABEFELD);
                //Inhalt vom Cedit wird übergeben
		float *fDaten= new float [MAXEINGABE];
		float *fDaten2 =new float [MAXEINGABE]; 
		//Wenn Objekte leer dann zurück
		if(fDaten == NULL) return;
		if(szTmp==NULL) return;
		if(objEingabe1 != NULL)
		objEingabe1->GetWindowText(szDaten,MAXEINGABE);/
		int iN = 0;
		unsigned int uiDatenCounter=0;
		unsigned long int ulAdressShift = (unsigned long int) szDaten;
		//starte auszählen. 
		for (;;)
			{
			szTmp[iN]= *szDaten; 
			iN ++;
			szDaten++;
   				if(szTmp[iN-1]== '\0')   // Das letzte Zeichen: Es geht an's ENDE !
				{
				if(strlen(szTmp) != 0) // länge vom String
				{
					fDaten[uiDatenCounter] = atof(szTmp);  // Fließkommzahl
					uiDatenCounter++;
				}
				break;
				}
				if(szTmp[iN-1]== 10)   //10 checken und 13 "löschen"
				{
				if(szTmp[iN-2]== 13)
				{
					szTmp[iN-2]='\0';  
					fDaten[uiDatenCounter] = atof(szTmp);  //Fliesskommazahl
					uiDatenCounter++;
					iN  = 0;
				}
				}
			}

Wenn ich im Hauptdialog szGraph = objDaten->szDaten; dann zeichnet er nur die erste Linie.
Wenn ich jedoch szGraph = objDaten->szFDaten; mach, schmiert er beim Programm ab macht jedoch keine Compilerfehler. Ich bin total verwirrt und weiss nicht mehr weiter. Auf was soll ich jetzt zeigen, warum geht es nicht?

Viele Grüße eure Ronnie
 
CMsgDlg *objDaten = new CMsgDlg();
szGraph = objDaten->szDaten;

Wenn ich das richtig sehe erzeugst du bei jedem OnPaint-Ereignis der Klasse CBio070904Dlg ein neues Object der Klasse CMsgDlg.

Was du brauchst ist aber kein neues Objekt (Denn das hat noch keine Daten), sondern DAS Object woher die Daten kommen.

Besser:
Code:
//Membervariable anlegen in der Klasse CBio070904Dlg:
CMsgDlg *myDlg;

// In der Klasse CMsgDlg:
// beim erzeugen der Klasse CBio070904Dlg den this pointer der Klasse CMsgDlg //übergeben
...
CBio070904Dlg *dlg;
dlg->myDlg=this;
...

//Und schon hast du einen Pointer auf das richtige Objekt

void CBio070904Dlg::OnPaint() 
{
	if (IsIconic())
	{
          Blah blah
        }
	else
	{
		Blah ein wenig statisches Zeichnen...
		//wichtig, holen des arrays!
		char *szGraph = new char[MAXEINGABE];



		szGraph = myDlg->szDaten;


		//Jetzt sollen die werte eingezeichnet werden, jedoch bleiben sie auf gleicher   

                  
                //höhe
		for(int lala = 0; lala < iAnzahl; lala++)
		{
		    int i = 0;
	            int iB = 10; 
			dc.MoveTo(-190+iB*i, szGraph[i]);
			dc.LineTo(-190+iB*i, szGraph[i]+5);	
                    i++;            
		}
		CDialog::OnPaint();
	}
};
Der code setzt natürlich voraus das erst der Dialog CMsgDlg erzeugt wird, und dann von diesem aus der Dialog CBio070904Dlg aufgerufen wird.
Wenn das nicht der Fall ist, schreib mal wie du die Dialoge aufrufst (reihenfolge,verschachtelung).

Mfg Col.Blake
 
Zuletzt bearbeitet:
Zurück