MFC-Newbie peilts noch nicht so ganz....



  • Ich bin grad dabei, mir die MFC-Klassen anzueignen. Dabei hab ich mal folgendes
    Programm ausprobiert:

    /* MyMFCApplication.h */
    #include <afxwin.h>
    class CMyMFCApplication:public CWinApp
    {
    public:
    virtual BOOL InitInstance();
    };
    class CMainFrame:public CFrameWnd
    {
    public:
    CMainFrame();
    };
    /* MyMFCApplication.cpp */
    #include "MyMFCApplication.h"
    CMyMFCAnw meineAnw;
    BOOL CMyMFCApplication::InitInstance()
    {
    m_pMainWnd = new CMainFrame;
    m_pMainWnd->ShowWindow(m_nCmdShow);
    return TRUE;
    }
    CMainFrame::CMainFrame()
    {
    Create(NULL,"Programm MyMFCApplication");
    }
    

    Ein recht einfach gestricktes Ding. Die Funktionsweise ist mir in soweit klar.
    Nur kommt mir das Laufzeitverhalten ziemlich komisch vor. Das Fenster öffnet sich nur kurz und verschwindet gleich wieder. Ist das normal? Soweit ich das verstanden habe, ist doch in den MFC-Klassen bereits eine Messageloop gekapselt, die nur mit der Message WM_Quit gestoppt wird. Und soweit es mich betrifft: ich hab sicher nichts veranlasst, was diese Message schickt. Ich hab
    mal zum Test einen Sleep() Funktionsaufruf eingebaut, dann war das Ding länger
    zu sehen. Aber das kann ja wohl nicht Sinn der Sache sein?!?

    Die MFC-Profis lachen sicher drüber, aber ich versteh das ehrlich nicht....

    Karotte



  • beste lösung:
    debuge dich einfach mal rein 😉
    Setzte einen breakpoint am return TRUE und schau dir an was er macht.
    Du kommst dann zirka hier an:

    // Perform specific initializations
    	if (!pThread->InitInstance())
    	{
    		if (pThread->m_pMainWnd != NULL)
    		{
    			TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");
    			pThread->m_pMainWnd->DestroyWindow();
    		}
    		nReturnCode = pThread->ExitInstance();
    		goto InitFailure;
    	}
    	nReturnCode = pThread->Run();
    

    kommt er bis zum pThread->Run(); -> rein
    Irgendwann kommst du dann in ein CWinThread::Run() -> Message Loop, dort solltest du dann sofort sehen ob da ne WM_QUIT kommt oder sonst was schief läuft 😉

    btw. warum verwendest du nicht die assistanten um die Grundstruklassen zu erstellen? :p



  • Auf jeden Fall hast du ein Speicherleck drin ... Versuchs mal mit DoModal statt ShowWindow ...



  • Danke @dEUs, @CMatt für die prompte Antwort. Hab jetzt mal den Debugger angeschmissen und es war was ganz triviales. Die Funktion InitInstance() wird ja überschrieben. Ich hab nur nicht ganz überrissen, das m_pMainWnd eine Membervariable ist und nur zur Weitergabe der Fensteradresse da ist. Ich Depp hab die Variable umbenannt 😡 . Naja, das nächste mal die Namenskonventionen besser beachten (m_ = member *gg*).
    @CMatt: Die Assistenten sind sicher auch ne Lösung. Aber ich möchte mich halt erst mal mit den Klassen vertraut machen und deshalb mach ich hier erst mal alles per Hand 😉
    @dEUs: das mit dem Speicherleck hab ich nicht ganz gerafft. DoModal wird doch auch überhaupt nicht von CFrameWnd als Membermethode unterstützt 😕

    Nochmal Danke Leute



  • m_pMainWnd = new CMainFrame; 
    m_pMainWnd->ShowWindow(m_nCmdShow);
    

    Hier holst du Speicher für m_pMainWnd. Gibts ihn aber nirgends mit delete frei -> Speicherleck!

    Das mit DoModal vergisste am Besten, hab zu schnell geschrieben und zu wenig gedacht 😉 Hast natürlich recht, CFrameWnd hat DoModal garnet 🙂



  • Na Karotte ist mal ein anständiger nick... nur schade das du MFC`ler bist.



  • ...und da hast du natürlich recht @dEUS. Natürlich sollte man den mit new allokierten Speicher wieder freigeben. War zugegebenermaßen ziemlich schlampig von mir, aber das Proggy ist ja wie gesagt nur zum ausprobieren 😉

    Danke für die Blumen @Blumentopf. Aber mich als MFCler zu bezeichnen ist schon ein wenig übertrieben, ich steck ja hier erfahrungsmäßig noch in den Kinderschuhen wie man hier sieht 🙄 . Aber wieso eigentlich schade? Die alte WinAPI ist ja schon nicht schlecht, aber mit der OO-Unterstützung der MFC scheint das doch wesentlich komfortabler zu sein, oder? 😕 😉



  • nicht so bescheiden Karotte 😋 😋 😋 😋


Anmelden zum Antworten