Zum Inhalt springen
Melde dich an, um diesem Inhalt zu folgen  

MFC-Applikation nach MVC strukturieren - Auf Buttonclick reagieren

Empfohlene Beiträge

Hallo,

ich möchte ein Programm gerne nach der Model-View-Controller-Architektur strukturieren. Der Controller erbt dabei von "CWinApp", die View von "CFrameWnd". Das Model ist für mein Problem im Augenblick unwichtig.

Mein Problem ist, dass ich es nicht hinbekomme, dass der Controller auf Events, die von der View ausgelöst werden, reagiert. Wenn ich das richtig verstanden habe, sollte man innerhalb einer Message Map des "CFrameWnd" definieren, welche Funktion etwa bei "ON_BN_CLICK" aufgerufen werden soll. Das funktioniert auch glänzend, wenn die entsprechende Funktion Member des "CFrameWnd" ist. Damit wäre sie aber Teil der View, was ja nun gerade nicht der Fall sein soll. Vielmehr sollte die Funktion im Controller definiert sein. Auf eine solche kann ich aber in der Message Map des "CFrameWnd" natürlich nicht verweisen. Ist ja auch im Prinzip richtig, die View soll den Controller nicht kennen.

Wie bekomme ich es denn hin, dass mehr oder weniger "vom Controller aus" die Funktionen zu den entsprechenden Events zugeordnet werden?

Um das exemplarisch zu verdeutlichen, hier das Notwendigste in ein paar Zeilen Code:

#include <afxwin.h>

#define ID_OK_BUTTON 1

class View : public CFrameWnd
{
private:
	CButton okButton;

protected:
	DECLARE_MESSAGE_MAP()

public:
	View()
	{
		Create(NULL, _T("View"));
		okButton.Create(_T("OK"), WS_CHILD | WS_VISIBLE, CRect(0, 0, 200, 100), this, ID_OK_BUTTON);
	};
};

class Controller : public CWinApp
{
private:
	View *view;


	afx_msg void onClick();

public:
	BOOL InitInstance();
};


BOOL Controller::InitInstance()
{
	view = new View();

	m_pMainWnd = view;
	m_pMainWnd->ShowWindow(SW_SHOW);

	return TRUE;
}

afx_msg void Controller::onClick()
{
	TRACE("CLICKED");
}

BEGIN_MESSAGE_MAP(View, CFrameWnd)
	ON_BN_CLICKED(ID_OK_BUTTON, /* ??? */)
END_MESSAGE_MAP()

Controller c;

Ist das überhaupt im Ansatz richtig? Funktioniert das mit Message Maps oder muss man das irgendwie anders machen?

 

Gruß

PL1994

Bearbeitet von PL1994

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Moin.

verpasse doch deinem Document einen Zeiger auf deine View und der View einen Zeiger auf dein Document. In dem Eventhandler in deiner View dann eben dem Document "bescheid sagen". Geht natürlich nur wenn die Methode nicht privat ist.

Mann könnte die Methode auch static machen und per 

ON_BN_CLICKED(ID_OK_BUTTON, &Controller::onClick)

aufrufen. Was ich persönlich aber nicht bevorzugen würde.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

ich möchte ein Programm gerne nach der Model-View-Controller-Architektur strukturieren. Der Controller erbt dabei von "CWinApp", die View von "CFrameWnd".

Die MFC-Architektur passt nicht zu MVC. Dass du die App-Klasse in die Controller-Rolle zwängst, ändert daran nichts.

Du kannst ja mal hier gucken: http://www.codeproject.com/Articles/30291/An-Introduction-to-a-Model-View-Controller-Impleme

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Danke für eure Antworten.

Wenn das schlechthin nicht passt, werde ich nicht extra noch ein Framework benutzen, nur um das in MVC hinzubekommen. Entweder versuche ich es dann eben mit der Document-View-Architektur oder als Win32-Applikation ...

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Deine Meinung

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich an , um mit Deinem Konto zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Melde dich an, um diesem Inhalt zu folgen  

Fachinformatiker.de, 2020 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung