Datenaustausch mit nichtmodalen Dialogfeldern

danke zumindest bekom ich mal wenn cih das so ca. einbaue keine Fehlermeldung, jedoch scheint das mit dem Variablen übergeben auch noch nicht ganz zu klappen sodass er mir das richtig anzeigt...


So das ist nochmal meine OnDraw() Funktion
Code:
/////////////////////////////////////////////////////////////////////////////
// CGfxView Zeichnen

void CGfxView::OnDraw(CDC* pDC)
{
	CGfxDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

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

So dann meine afx_msg Funktion OnMyMessage mit den Behandlungen für die Übergabe der Variablen

m_bGrid hab ich in der View ebenso bei den Membervariablen eingefügt und über den Zeiger auf das Dialogfeld mit dieser m_bGrid dessen Inhalt kopiert.


Code:
/////////////////////////////////////////////////////////////////////////////
// CGfxView Nachrichten-Handler
afx_msg LRESULT CGfxView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
	UpdateData(TRUE);
	
	m_myDialog.m_bGrid = m_bGrid;
	m_bGrid = m_myDialog.m_bGrid;	
	
	return LRESULT();

	UpdateData(FALSE);
}

Das ist die verbesserte Button Funktion
Code:
void CMyDialog::OnUpdate() 
{
	// TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen
	GetParent()->SendMessage(WM_MY_MESSAGE,(WPARAM)m_bGrid);

}

So die ON_MESSAGE habe ich jetzt wohl so unkreativ wie ich nunmal bin der richtigen Message Map hinzugefügt ;)
Code:
BEGIN_MESSAGE_MAP(CGfxView, CView)
	//{{AFX_MSG_MAP(CGfxView)
		// HINWEIS - Hier werden Mapping-Makros vom Klassen-Assistenten eingefügt und entfernt.
		//    Innerhalb dieser generierten Quelltextabschnitte NICHTS VERÄNDERN!
	//}}AFX_MSG_MAP
	// Standard-Druckbefehle
	ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
	ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)
END_MESSAGE_MAP()


Meiner Vermutung nach müsste der Fehler fast beim Variablen übergeben stattfinden hm...
 
Hi,
gähn, mach doch einfach mal nacheinander alle Schritte so wie ich es beschrieben habe.
Und dann den benötigten Bereich für ungültig erklären, um ein Neuzeichnen (also einen Aufruf von OnDraw() ) zu erzwingen.

Solange du nix zeichnest, wird sich wohl auch nix ändern... ;-]

Gruß Squeegee
 
morgen, das hab ich eh schon versucht, beim herumprobiern wohl weggelöscht...

Code:
afx_msg LRESULT CGfxView::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
	UpdateData(TRUE);
	

	m_bGrid = m_myDialog.m_bGrid;
	m_myDialog.m_bGrid = m_bGrid;

	CGfxView::Invalidate();
	
	return LRESULT();

	UpdateData(FALSE);
}

CGfxView::Invalidate();

Diese Funktion erklärt die View für ungültig und müsste dann sozusagen auch ein Neuzeichnen der OnDraw bewirken, jedoch übergibt er mir noch immer kein m_bGrid für die OnDraw() Funktion (also keinen Wert).

mfg
 
Hi,
ok, aber brauchen tust du das Invalidate() auf alle Fälle, sonst tut nüscht :)
Des weiteren fällt mir grade auf, dass du folgende Zeile hast:

Code:
m_bGrid = m_myDialog.m_bGrid;

Du castest also m_bGrid im Dialog beim versenden auf WPARAM, empfängst den Parameter in der View und versuchst ihn dann wieder direkt vom Dialog zu holen, wo du diesen offensichtlich unschönerweise public deklariert hast.

Du hast m_bGrid aber doch im WPARAM, also nimm ihn doch einfach :)

Code:
m_bGrid = (bool) wParam;

Wenn das nicht funktioniert, dann steppe einfach mal durch den Code und schau, wo genau dir der Wert von m_bGrid verloren geht. Setz Breakpoints beim Senden und beim Empfangen und schau die Variablen an, was drin steht. Steht er überhaupt richtig drin?

Ich kann dir den Teil mit UpdateData(..) nicht wirklich erklären, da ich damit prinzipiell nicht arbeite, weil diese Art des Datenabrufs IMHO irgendwie wie der Elefant im Porzellanladen funktioniert. Problem ist, dass er damit immer absolut alle Daten aus dem Dialog aktualisiert, also auch die, die du evtl grade gar nicht brauchst (Oder die gar nicht mal aktualisiert werden dürfen!). Ich rufe meine Daten immer von genau dem Steuerelement ab, wo ich sie brauche. Leider wird das Vorgehen dazu in keinem Buch oder tut erklärt, hab ich mir selber beigebracht.
Aber probier einfach mal den Inhalt von m_bGrid von Anfang bis Ende nachzuvollziehen, dann weißt du schon mal den Punkt, wo die Daten verloren gehen.

Und nicht verzagen! Das geht jedem am Anfang so ;-)

Grüße Squeegee
 
Ich verzag schon nicht ;)

oke ich hab jetzt probiert das mal anders anzugehen und zwar wird im Buch Visual C++ 6 von Addison - Weseley genau die Funktion realisiert die ich brauche, jedoch sind die Erklärungen dazu etwas mager für "Beginner".

Leider beginnt das Problem schon beim Konstruktor erstellen
Es wird beschrieben das der Konstruktor einfach um einen Parameter erweitert wird.
Wenn ich den Parameter selbst erweitere, sprich die Definition und Deklaration, kommt bei mir die Fehlermeldung "nichtaufgelöstes externes Objekt".

Header hab ich (denk ich halt) richtig eingebunden...gleich wie im Buch beschrieben wurde (bzw. ich aus der Beispieldatei herausgelesen habe)

Code:
CMyDialog::CMyDialog(CGfxDoc *pDoc,CWnd* pParent /*=NULL*/)
	: CDialog(CMyDialog::IDD, pParent),
	pDoc(pDoc)
{
	//{{AFX_DATA_INIT(CMyDialog)
	m_bGrid = FALSE;
	//}}AFX_DATA_INIT
}

Code:
CMyDialog(CGfxDoc *pDoc, CWnd* pParent = NULL);   // Standardkonstruktor
 

Neue Beiträge

Zurück