MFC und DirectX?
-
OnIdle glaub ich
-
MFC ist Event-basiert, d.h. es gibt keine Schleife in dem Sinn. Eine MFC-Anwendung reagiert auf Events, die entweder vom User (durch Mouseklicks o.ä.), anderen Anwendungen oder dem OS kommen.
Warum brauchst du denn eine Schleife? Ich hab auch nen Leveleditor entwickelt, zwar mit GDI+ aber trotzdem in einem MFC-Programm, eine Schleife brauche ich aber nicht (weiß immer noch nicht welche Art Schleife zu meinst).
In der Dialog-Klasse gibt es die Möglichkeit Event-Methoden zu überschreiben oder neu zu definieren. Findest du alles im Klassen-Assistenten. Wenn z.B. der Fenster-Bereich von einem anderen Fenster übermalt/zerstört wird, bekommst du einen Event von Windows. Darauf mußt du reagieren, in der überschriebenen Methode. (bin leider auf Arbeit und hab jetzt keine Doku zur Hand) Dort bekommst du auch die Infos, welchen Bereich du aktualisieren mußt/solltest.
Wenn du aber wirklich eine Schleife machen willst, z.B. weil du immer und immer wieder den Bereich updaten willst, dann kannst du ja nen Thread coden. Kein Problem.
Sach an, wofür ne Schleife? Was soll sie machen? Ich kenne mich mit der WinAPI nicht aus, bin gleich in MFC eingestiegen.
[ Dieser Beitrag wurde am 13.12.2002 um 14:26 Uhr von Artchi editiert. ]
-
am besten in nem eigenen thread
-
außerdem sind beim directx sdk samples für mfc dabei. guck einfach wie die das gemacht haben.
-
@Artchi
Also einen LevelEditor für 3D Games in GDI? Naja das wäre mir zu vielDas mit den Threads is ne Gute Idee
Danke
Achja noch was: gibt es irgendwo nen ort, wo man die Run() sich anschauen kann? In der MSDN find ich nix
-
Hallo,
hab mal ein bischen gestöbert. Wenn du die Sourcen der MFC auf deiner Platte hast, kannste da mal suchen.
Die 'CWinApp:Run()' hab ich in der 'APPCORE.CPP' gefunden. Dort wird aber auch nur 'CWinThread::Run()' aufgerufen, die ich in 'THRDCORE.CPP' gefunden habe.
Und nach meinem leihenhaften Blick, siehts da ganz gewaltig nach 'ner Message-Schleife aus.Gruß mathi
[ Dieser Beitrag wurde am 13.12.2002 um 17:28 Uhr von mathi editiert. ]
-
@Mathi:
Danke jetzt komm ich klarWinAPI rult halt *ggg*
-
Die richtige Schleife ist aber erst in AfxInternalPumpMessage
-
Original erstellt von <*ggggggggg*>:
Die richtige Schleife ist aber erst in AfxInternalPumpMessageKann es sein, dass du uns nur ärgern willst? Das es dann bei PumpMessage weiter geht is ja klar, aber AfxInternal... gibts doch garnicht, oder?
Kann mal jemand bestätigen?
-
Hab eigentlich keine Ahnung von DirectX,aber bremsen die MFC DirectX nicht enorm aus??
MfG Spacelord
-
in PumpMessage wird AfxInternalPumpMessage aufgerufen
-
Original erstellt von <jo,>:
in PumpMessage wird AfxInternalPumpMessage aufgerufenIch werd gleich noch Bekloppt, ich find's nicht. Meinst du in 'CWinThread::PumpMessage()' da steht nix von AfxInternal...!
Naja, hab ich wohl eine andere MFC-Version.
In der MSDN find ich auch nix.
-
Der 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\...Nachrichtenpumpe:
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, wie sie leibt und lebt: 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;
-
///////////////////////////////////////////////////////////////////////////// // CWinThread implementation helpers BOOL CWinThread::PumpMessage() { return AfxInternalPumpMessage(); }
thrdcore.cpp(915)
Das stammt allerdings auf Visual Studio .NET. Vielleicht hast du ja dier 6er und das wurde geändert. Is ja auch so ziemlich egal, hauptsache es funktioniert.
-
Danke! beim .NET hab ich's schließlich gefunden. Hab zuvor nur bei der 6.0 Version gesucht.