Datenaustausch mit nichtmodalen Dialogfeldern

untread

Erfahrenes Mitglied
Hallo, wie erwartet ist das nicht mehr ganz so einfach für mich

Grundsätzlich sollte es ja folgendermaßen laufen:

Aus der erstellten Klasse des Dialogfeldes fügen wir nen Parameter pDoc hinzu der auf ProjektnameDoc verweist und weiters zb m_check (Member Variable von Checkbox) beim Konstrukor hinzu. (schon mal bei dieser Sache hagelt es an Fehlermeldungen wegen Überladung)

Die DoDataExchange(CDataExchange *pDC) Funktion bräuchte dann eigentlich nur
DDX_Check(pDX,IDC_CHECK,m_check);
CDialog::DoDataExchange(pDX);
beinhalten

dann sollte es möglich sein den Button den Befehl
eine Update funktion zuzuweisen.

Sind meine Schritte richtig oder wie sollte man das ansonsten lösen?
(Mein Ziel nochmal klar ausgedrückt ist es, ein Diagramm das auf der SDI Fläche gezeichnet worden ist "updaten" zu können über ein Nichtmodales Dialogfeld (zb: Checkbox Gitternetz anzeigen, Diesen Befehl dann per "Update" Button anzeigen)

mfg Harry
 
Hi untread,
ich glaube, bei dir happert es noch in wenig mit dem Grundverständnis für die MFC...
Ich würde dir vorschlagen, dich mal etwas intensiver mit den Themen SDI, Dialoge und Grundstruktur der MFC zu beschäftigen :)

Schau dir mal folgende Seite an:

www.cpp-tutor.de

Da gibts ein sehr gutes Tutorial für die MFC, in dem viele wichtige Dinge erklärt werden.


Grüße Squeegee
 
danke, hab das mit den Dialogen durchgemacht, jedoch ist mir jetzt klar wie ich einen Modalen Dialog ändere jedoch nicht wirklich wie ich das mit dem NichtModalen anstelle

Der Code für den Datenaustausch wurde bei einem Button OnShowDlg der View Klasse eingefügt.

"CButtonDlg CMyDlg;" --> so laut Tutorial


Bei mir befindet sich jedoch der dazugehörige Button auf dem von mir erstellten Dialogfeld (Klasse: CMyDialog1)

Also müsste ich theoretisch den Code auf den Button "CMyDialog1::OnUpdate()" geben
Code:
void CMyDialog1::OnUpdate() 
{
	UpdateData(TRUE);
	CProjektView CMyDlg;

	CMyDlg.m_bGitternetz = m_bGitternetz;
	m_bGitternetz = CMyDlg.m_bGitternetz;
	UpdateData(FALSE);
	
}

jetzt ist mir aber absolut unklar, wie ich das Upgedatete in die View Klasse OnDraw übermittle wo die Funktion auf die Abfrage reagieren soll.

Code:
	// Gitternetz zeichnen
	if(m_bGitternetz == 1)
	{
		pDC->SelectObject(&gridPen);
		for (i=1;i<=10;i++)
		{
			pDC->MoveTo(i*1000,0);
			pDC->LineTo(i*1000,10000);

			pDC->MoveTo(0, i*1000);
			pDC->LineTo(10000,i*1000);
		}
	}
 
Zuletzt bearbeitet:
Hi untread,
also, wenn ich das richtig verstehe willst du bei einem Klick auf einen Button im Dialog, Daten in die View schicken, und zwar deine Variable m_bGitternetz?

Falls dem so ist, muss du einfach eine Userdefined Message an die View schicken. Prinzipielles Vorgehen:

In der Stringtable eine UserdefiniertenMessage hinzufügen
Im Dialog im Messagehandler für den Button die Message abschicken, ungefähr so:

Code:
GetParent()->SendMessage(WM_MY_MESSAGE, lParam, wParam)

in wParam ud lParam kannst du beliebige Daten reincasten (Größe beachten!, also bei dir die m_bGitternetz.

In der View einen Aufruf in die Messagemap rein, ungefähr so:

Code:
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)

und den Messagehandler selbst:

Code:
afx_msg LRESULT CMyView::OnMyMessage(WPARAM wParam, LPARAM lParam){}

in dem kannst du dann die Übergabeparameter zurückcasten und mit den Daten arbeiten.

Könnten sich auch kleine Fehler eingeschlichen haben, es ist früh am morgen, aber da hilft dir dann die MSDN weiter...

Gruß Squeegee

PS.: Von der Struktur her fände ich es allerdings andersrum besser:
Die View will Daten haben, und löst im Dialog eine GetData() Methode, über die sie die Daten bekommt, entweder als Referenz oder als Rückgabewert.
 
Meinst du mit StringTable...

struct StringTable {
WORD wLength;
WORD wValueLength;
WORD wType;
WCHAR szKey[];
WORD Padding[];
String Children[];
};

oder was sonst?

PS: m_bGitternetz ist nur eine von 5 Variablen, die anschließend in der View Klasse upgedatet werden sollen
 
Zuletzt bearbeitet:
Hi,
nein StringTable unter den Ressourcen.

Du kannst WParam und lParam auch in ein LoByte und ein HiByte aufteilen. Hab ich allerdings auch noch nicht gemacht.
Deswegen meinte ich ja, Aktion in der View auslösen und mit Referenzen arbeiten. Dann kannst du beliebig viele Daten abrufen.
 
ah seh schon danke, aber irgendwie steht da nichts , dass ich etwas benutzerdefiniertes hinzufügen könnte
 
Zuletzt bearbeitet:
Hm krieg das leider noch immer nicht zum laufen.

Also ich mache folgendes

1)In die String Table unter Ressourcen:
ID: WM_MY_MESSAGE
Titel: m_bGrid (wär eigentlich egal was ich da reinschreibe oder?)

2) auf den Button "OnUpdate": folgende Funktion zuweisen:
Code:
GetParent()->SendMessage(WM_MY_MESSAGE,m_bGrid);


(bisher bekomm ich noch keine Fehlermeldung beim Kompilieren)

So ab hier hauts nicht mehr hin:

Ich füge in die OnDraw Funktion den Aufruf der Nachricht ein:
Code:
void CGfxView::OnDraw(CDC* pDC)
{
	CGfxDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen

	ON_MESSAGE(WM_MY_MESSAGE,OnMyMessage);

	if(m_bGrid == 1)
	{
	CPen maxPen(PS_SOLID,5,RGB(255,0,0));
	pDC->SelectObject(&maxPen);
	pDC->Rectangle(100,100,200,200);
	}
}

und erstelle anschließend diese Funktion dafür
Code:
afx_msg LRESULT CGfxView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{

}

Dann bekomm ich diese Fehlermeldungen (obs überhaupt funktionieren würde weiß ich nicht)

Code:
error C2276: '&' : Ungueltige Operation auf Ausdruck einer gebundenen Member-Funktion // bei ON_MESSAGE...
error C2143: Syntaxfehler : Fehlendes ';' vor '}' //stimmt eigentlich nicht (vom Code her..)
error C2143: Syntaxfehler : Fehlendes ';' vor ','
rror C2065: 'm_bGrid' : nichtdeklarierter Bezeichner // header ist eigentlich eingebunden worden wodurch m_bGrid eigentich nicht Undeklariert sein dürfte
 
Hi,
kreative Lösung... Aber Messagedefinitionen gehören wie beschrieben in die Messagemap und nicht in OnDraw()

Der Schönheit halber kannst du auch noch richtig casten, dass jeder weiß, was gemeint ist:
Code:
GetParent()->SendMessage(WM_MY_MESSAGE,(WPARAM)m_bGrid);

Und im Messagehandler musst du dann ja schon auch was machen... Das ist ja ne leere Methode. Also irgendwie die m_bGrid aus dem Dialog in einen Membervariable der View kopieren etc. Und dann den benötigten Bereich für ungültig erklären, um ein Neuzeichnen (also einen Aufruf von OnDraw() ) zu erzwingen.

Grüße Squeegee
 

Neue Beiträge

Zurück