Wo startet eine MFC-Anwendung?
-
Hallo!
Ich habe ein einfaches Fenster mit Hilfe der MFC erstellt. Es funktioniert alles, ich frage mich nur warum...
Hier erstmal der Code:
*************** Main.h ***************
#include <afxwin.h>
class Main : CWinApp{
public:
virtual BOOL InitInstance();private:
RECT rect;};
**************************************
************** Main.cpp **************
#include "Main.h"
Main myApplication;
BOOL Main::InitInstance(){
CFrameWnd* mainWnd = new CFrameWnd();
rect.left=100;
rect.top=100;
rect.right=200;
rect.bottom=200;
mainWnd->Create(NULL, "Title");
mainWnd->ShowWindow(this->m_nCmdShow);
mainWnd->UpdateWindow();this->m_pMainWnd = mainWnd;
return TRUE;
}
**************************************
Wie ist der Ablauf hier zu erklären? Bei einem WinAPI- oder Konsolen-Programm gibt es immer irgend eine Main-Methode (bzw. WinMain), aber wo genau fängt dieses Programm an?
Ich würde sagen es wird als erstes die Zeile ausgeführt, bei der ein Objekt vom Typ "Main" angelegt wird, ist das richtig?
Andere Frage: Was bedeutet es überhaupt, wenn ein Objekt mitten "im leeren Raum" erstellt wird (also außerhalb einer Funktion oder Klasse)? Ist das dann einfach ein globales Objekt?
Andere Frage: Wer ruft die Methode "InitInstance" auf? Der Konstruktor von CWinApp kann es nicht sein, denn wenn ich ihn überlagere funktioniert es trotzdem noch.
Kann mir das bitte jemand im Detail erklären?
Danke erst mal!
mfg
-
Wie jede Windows-Anwendung starten auch MFC programme in der WinMain.
Die ist nur für den Benutzer nicht sichtbar. (MFC ist ein OO Wrapper für die WinAPI)Zu 2:
Das ist ne Globale Instanz der Applikationsklasse.
-
Zum Einstieg:
http://www.henkessoft.de/mfc_einsteigerbuch_kapitel5.htmDer Sourcecode der MFC liegt offen. Bei MS VC++ 6 findet man die Dateien bei Installation nach Laufwerk C: z.B. in folgendem Verzeichnis:
C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\...Die meiste Zeit befindet sich das Programm in der "Nachrichtenschleife":
Die MFC-Funktion (siehe thrdcore.cpp) befreien wir zunächst von allen nur im Debug-Modus durchgeführten Schritten, und wir erhalten den folgenden kompakten Sourcecode:BOOL CWinThread::PumpMessage() { if (!::GetMessage(&m_msgCur, NULL, NULL, NULL)) return FALSE; if (m_msgCur.message != WM_KICKIDLE && !PreTranslateMessage(&m_msgCur)) { ::TranslateMessage(&m_msgCur); ::DispatchMessage(&m_msgCur); } return TRUE; }In dieser Funktion befinden sich typische MFC-Programme die meiste Zeit. Das ist die WinAPI-Nachrichtenpumpe: Nachrichten erfassen, übersetzen und verteilen.
Zum Vergleich die typische Original-WinAPI-Variante:
// WinAPI-Nachrichtenpumpe MSG msg; while( GetMessage( &msg, NULL, 0, 0) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } return msg.wParam;
-
WO eine MFC-Windowsanwendung startet:
Natürlich auf einem Rechner mit Windows
