Forum: PC-Programmierung Header MFC/ Hänge an scheinbar an Grundlagen


von A. R. (redegle)


Lesenswert?

Hallo,

ich arbeite mich gerade auf dem folgenden Link durch ein MFC-Tutorial
http://www.henkessoft.de/C++/MFC/MFC%20Tutorials.htm

Momentan befinde ich mich bei Kapitel 5 
http://www.henkessoft.de/C++/MFC/mfc_einsteigerbuch_kapitel5.htm und 
stehe "extrem auf dem Schlauch".
Vielleicht kann mir jemand einen Denkansatz liefern.

In C habe ich gelernt, dass der Header benötigt wird um dem Programm 
alle Funktionen in Form von Prototypen mitzuteilen. Während dem 
compilieren wird der Header quasi vor der .cpp-Datei eingefügt. Dort 
können also auch defines und Strukturen festgelegt werden.

In C++ wurde dies fortgesetzt. Also im Header wurde die Klasse mit 
abgeleiteten Klassen, Konstruktor, Destruktor sowie alle Membervariablen 
und Methoden definiert.

Das heißt nach meinem momentanen Wissensstand, dass nachdem ich die 
Headerdatei einer Klasse eingebunden habe ich alle Methoden der Klasse 
verwenden kann, ohne vorher einen Protypen zu schreiben.

In dem Beispiel aus dem Tutorial ist es nun so, dass in dem Header 
mehrere Klassen erstellt werden. Warum ist dies so? Kennt das Programm 
nicht schon durch den Header <afxwin.h> alle verwendeten Methoden? Wäre 
dankbar wenn mir jemand weiterhelfen kann.

Kann es sein, dass die Klassen "von mir" komplett neu angelegt werden? 
Wenn ja von wem werden die Methoden dann später aufgerufen?

Header:
1
#include <afxwin.h>  //Schritt 1
2
3
class CMyApplication : public CWinApp  //Schritt 2
4
{
5
 public:
6
 virtual BOOL InitInstance();
7
};
8
9
class CMyWindow : public CFrameWnd  //Schritt 3
10
{
11
 public:
12
 CMyWindow();
13
};

cpp-Datei:
1
#include "EinfachesFenster.h"  //Schritt 4
2
3
CMyApplication MyApp;   //Schritt 5
4
5
CMyWindow::CMyWindow() //Schritt 6
6
{
7
 Create ( NULL, _T("MFC-Anwendungsskelett") );
8
}
9
10
BOOL CMyApplication::InitInstance() //Schritt 7
11
{
12
 m_pMainWnd = new CMyWindow;
13
 m_pMainWnd ->ShowWindow( m_nCmdShow );
14
 return TRUE;
15
}

EDIT:
Ggf. vermissen ich bei MFC auch einfach eine main(), die vom 
Betriebssystem aufgerufen wird und dann alles von oben nach unten 
ausführt.

von Karl H. (kbuchegg)


Lesenswert?

A. R. schrieb:

> In C habe ich gelernt, dass der Header benötigt wird um dem Programm
> alle Funktionen in Form von Prototypen mitzuteilen.

Na ja. NIcht alle.
Diejenigen, die in diesem Header stehen.

Man wird ja sinnvollerweise für jede Funktionsgruppe eine eigene C Datei 
und eine dazugehörige Header Datei machen. Dann sind im Header nur die 
Funktionen (und Strukturen etc), die zu dieser Funktionsgruppe gehören 
und im C File dann auch nur die Implementierungen der Funktionen, die zu 
dieser Funktionsgruppe gehören.


> Während dem
> compilieren wird der Header quasi vor der .cpp-Datei eingefügt. Dort
> können also auch defines und Strukturen festgelegt werden.

In a nutshell: Ja, kann man so sagen.
#include ersetzt einfach die Zeile in der es steht mit dem Inhalt der 
Datei, die im include angegeben ist.

> In C++ wurde dies fortgesetzt. Also im Header wurde die Klasse mit
> abgeleiteten Klassen, Konstruktor, Destruktor sowie alle Membervariablen
> und Methoden definiert.

In groben Zügen: ja.
Stell dir einfach den Begriff Prototyp etwas weiter gefasst vor. In C 
waren das nur Funktionen und Strukturen, in C++ ist es einfach der 
prinzipielle Aufbau einer Klasse, bestehend aus Funktionen und 
zugehörigen Daten.

> Das heißt nach meinem momentanen Wissensstand, dass nachdem ich die
> Headerdatei einer Klasse eingebunden habe ich alle Methoden der Klasse
> verwenden kann, ohne vorher einen Protypen zu schreiben.

Die Klassendeklaration ist sozusagen der Prototyp dieser Klasse.

> In dem Beispiel aus dem Tutorial ist es nun so, dass in dem Header
> mehrere Klassen erstellt werden.

Ja, macht ja nix.
Du hast ja auch in deinen C-Header Files meherer Funktionsprototypen 
gehabt.

> Warum ist dies so?

Weil diese Klassen zb thematisch zusammengehören. Das ist der übliche 
Fall.

> Kennt das Programm
> nicht schon durch den Header <afxwin.h> alle verwendeten Methoden?

Nur die, die vom Windows kommen.
Aber das sind ja
*) nicht alle Klassen, die dir von der MFC zur Verfügung gestellt werden
*) und auch nicht die Klassen, die du selber geschrieben hast.

> Kann es sein, dass die Klassen "von mir" komplett neu angelegt werden?

Kann nicht nur so sein, sonder ist so. Deine Klassen sind ja nicht 
Bestandteil von Windows oder der MFC

> Wenn ja von wem werden die Methoden dann später aufgerufen?

Von demjenigen, der sie aufruft. Im Regelfall ist das der Code, den du 
schreibst oder eine andere Klasse aus dem MFC Framework, welches die 
Detail-Arbeit ausgelagert hat, weil es diese gar nicht kennen kann.

> Header:
>
1
> #include <afxwin.h>  //Schritt 1
2
> 
3
> class CMyApplication : public CWinApp  //Schritt 2
4
> {
5
>  public:
6
>  virtual BOOL InitInstance();
7
> };
8
>

Das Applikationsobjekt.
Muss es immer geben und implementiert dein Programm. Diese Klasse 
fungiert wie eine Art Schachtel in der sich alles abspielt, was mit 
deinem Programm zu tun hat.

>
1
> class CMyWindow : public CFrameWnd  //Schritt 3
2
> {
3
>  public:
4
>  CMyWindow();
5
> };
6
>

Das Frame-Window. Wird vom MFC Framework erzeugt und hat die Aufgabe das 
Hauptfenster einer Applikation zu sein.


> Ggf. vermissen ich bei MFC auch einfach eine main(), die vom
> Betriebssystem aufgerufen wird und dann alles von oben nach unten
> ausführt.

Ganz genau.
Die MFC ist ein Framework. D.h. sie übernimmt die Rolle von main() und 
stellt so etwas wie eine Umgebung zur Verfügung, in der 
Windows-Applikationen grundsätzlich ablaufen. Dieses Framework kümmert 
sich zb darum dass Windows Messages an das richtige Fenster innerhalb 
deiner Applikation geschickt werden etc.

Aber natürlich kann so ein Framework nicht alles abdecken. Es ist darauf 
angewiesen, dass dein Programm die Details erledigt. In der MFC wird das 
so gemacht, dass aus dem Framework heraus Methoden von standardisierten 
Klassen aufgerufen werden, die dann die Details ergänzen. Das ist dann 
genau der Punkt, an dem deine Klassen von da oben ins Spiel kommen. Denn 
die Implementieren dann genau diese Detail-Dinge.

von A. R. (redegle)


Lesenswert?

Vielen Dank,

finde es echt Klasse, dass du auf alle Punkte so ausführlich eingegangen 
bist. Ich denke, dass ich die Sache jetzt etwas besser verstanden habe. 
Es ist zwar noch nichts alles 100% klar aber ich möchte ersteinmal alles 
verarbeiten was du geschrieben hast und schauen wie gut ich weiterkomme.

von Karl H. (kbuchegg)


Lesenswert?

Ich finde: Solche Framework Sachen muss man sowieso ein paar mal 
probiert haben, ehe man den Durchblick hat.

In der MFC

  Application             die Schachtel, in der dein Programm läuft
    FrameWindow           das Hauptfenster
    ChildWindow           Kindfenster, bei einer MDI Applikation.
                          Zuständig für den Rahmen eines View
    Document              zuständig für die Verwaltung und Manipulation
                          der Daten einer Applikation (oder eines MDI)
    View                  Anzeigefläche, in der die Daten eines
                          Document dargestellt werden. Ein Document
                          kann durchaus mehrere Views haben, die
                          auch verschiedene Sichten auf dieselben Daten
                          bereitstellen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.