Probleme mit FAQ Anleitung "unsichtbarer Dialog"



  • Hallo!

    Ich möchte einen Dialog der unsichtbar startet schreiben.
    Da ich das nicht mit einem modalen Dialog hinbekommen habe habe ich das hier versucht:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39094.html

    folgender Quellcode ist dabei herausgekommen:

    class CTrayapplApp : public CWinApp
    {
    public:
    	CTrayapplApp();
    
    // Überladungen
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CTrayapplApp)
    	public:
    	virtual BOOL InitInstance();
    	//}}AFX_VIRTUAL
    
    // Implementierung
    
    	//{{AFX_MSG(CTrayapplApp)
    		// HINWEIS - An dieser Stelle werden Member-Funktionen vom Klassen-Assistenten eingefügt und entfernt.
    		//    Innerhalb dieser generierten Quelltextabschnitte NICHTS VERÄNDERN!
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    /////////////////////////////////////////////////////////////////////////////
    // CTrayapplApp Konstruktion
    
    CTrayapplApp::CTrayapplApp()
    {
    	// ZU ERLEDIGEN: Hier Code zur Konstruktion einfügen
    	// Alle wichtigen Initialisierungen in InitInstance platzieren
    }
    
    /////////////////////////////////////////////////////////////////////////////
    // Das einzige CTrayapplApp-Objekt
    
    CTrayapplApp theApp;
    
    /////////////////////////////////////////////////////////////////////////////
    // CTrayapplApp Initialisierung
    
    BOOL CTrayapplApp::InitInstance()
    {
    	// Standardinitialisierung
    	// Wenn Sie diese Funktionen nicht nutzen und die Größe Ihrer fertigen 
    	//  ausführbaren Datei reduzieren wollen, sollten Sie die nachfolgenden
    	//  spezifischen Initialisierungsroutinen, die Sie nicht benötigen, entfernen.
    
    #ifdef _AFXDLL
    	Enable3dControls();			// Diese Funktion bei Verwendung von MFC in gemeinsam genutzten DLLs aufrufen
    #else
    	Enable3dControlsStatic();	// Diese Funktion bei statischen MFC-Anbindungen aufrufen
    #endif
    
    	CTrayapplDlg* dlg=new CTrayapplDlg();
        dlg->Create(IDD_TRAYAPPL_DIALOG); 
    	dlg->ShowWindow(SW_SHOW); 
    
    	return TRUE;
    
    	/*
    	CTrayapplDlg dlg;
    	m_pMainWnd = &dlg;
    	int nResponse = dlg.DoModal();
    	if (nResponse == IDOK)
    	{
    		// ZU ERLEDIGEN: Fügen Sie hier Code ein, um ein Schließen des
    		//  Dialogfelds über OK zu steuern
    	}
    	else if (nResponse == IDCANCEL)
    	{
    		// ZU ERLEDIGEN: Fügen Sie hier Code ein, um ein Schließen des
    		//  Dialogfelds über "Abbrechen" zu steuern
    	}
    
    	// Da das Dialogfeld geschlossen wurde, FALSE zurückliefern, so dass wir die
    	//  Anwendung verlassen, anstatt das Nachrichtensystem der Anwendung zu starten.
    	return FALSE;
    	*/
    }
    
    class CTrayapplDlg : public CDialog
    {
    // Konstruktion
    public:
    	CTrayapplDlg(CWnd* pParent = NULL);	// Standard-Konstruktor
    
    // Dialogfelddaten
    	//{{AFX_DATA(CTrayapplDlg)
    	enum { IDD = IDD_TRAYAPPL_DIALOG };
    		// HINWEIS: der Klassenassistent fügt an dieser Stelle Datenelemente (Members) ein
    	//}}AFX_DATA
    
    	// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
    	//{{AFX_VIRTUAL(CTrayapplDlg)
    	protected:
    	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV-Unterstützung
    	virtual void PostNcDestroy();
    	//}}AFX_VIRTUAL
    
    // Implementierung
    protected:
    	void OnCancel();
    	HICON m_hIcon;
    
    	// Generierte Message-Map-Funktionen
    	//{{AFX_MSG(CTrayapplDlg)
    	virtual BOOL OnInitDialog();
    	afx_msg void OnPaint();
    	afx_msg HCURSOR OnQueryDragIcon();
    	//}}AFX_MSG
    	DECLARE_MESSAGE_MAP()
    };
    
    /////////////////////////////////////////////////////////////////////////////
    // CTrayapplDlg Dialogfeld
    
    CTrayapplDlg::CTrayapplDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CTrayapplDlg::IDD, pParent)
    {
    	//{{AFX_DATA_INIT(CTrayapplDlg)
    		// HINWEIS: Der Klassenassistent fügt hier Member-Initialisierung ein
    	//}}AFX_DATA_INIT
    	// Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
    	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    }
    
    void CTrayapplDlg::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	//{{AFX_DATA_MAP(CTrayapplDlg)
    		// HINWEIS: Der Klassenassistent fügt an dieser Stelle DDX- und DDV-Aufrufe ein
    	//}}AFX_DATA_MAP
    }
    
    BEGIN_MESSAGE_MAP(CTrayapplDlg, CDialog)
    	//{{AFX_MSG_MAP(CTrayapplDlg)
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	//}}AFX_MSG_MAP
    END_MESSAGE_MAP()
    
    /////////////////////////////////////////////////////////////////////////////
    // CTrayapplDlg Nachrichten-Handler
    
    BOOL CTrayapplDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
    	//  wenn das Hauptfenster der Anwendung kein Dialogfeld ist
    	SetIcon(m_hIcon, TRUE);			// Großes Symbol verwenden
    	SetIcon(m_hIcon, FALSE);		// Kleines Symbol verwenden
    
    	// ZU ERLEDIGEN: Hier zusätzliche Initialisierung einfügen
    
    	return TRUE;  // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
    }
    
    // Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie 
    //  den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das 
    //  Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt.
    
    void CTrayapplDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext für Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Symbol in Client-Rechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    }
    
    // Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer
    //  das zum Symbol verkleinerte Fenster mit der Maus zieht.
    HCURSOR CTrayapplDlg::OnQueryDragIcon()
    {
    	return (HCURSOR) m_hIcon;
    }
    
    void CTrayapplDlg::OnCancel()
    {
        DestroyWindow(); // Nicht EndDialog bzw. CDialog::OnCancel aufrufen
    }
    
    void CTrayapplDlg::PostNcDestroy()
    {
        PostQuitMessage(0);
        delete this;
    }
    

    Das Problem:

    Die Anwendung schliesst sich SOFORT nach dem Aufruf wieder.
    Der Prozess erscheint für den Bruchteil einer Sekunde in der Prozessübersicht und terminiert sofort wieder.

    Was zum Henker ist mein Problem? Das ganze kompiliere ich mit Visual C++ 5.

    Danke für eure Hilfe.

    Schöne Grüße

    adsci



  • Versuch es mal so:

    BOOL CTrayapplApp::InitInstance()
    {
        // Standardinitialisierung
        // Wenn Sie diese Funktionen nicht nutzen und die Größe Ihrer fertigen 
        //  ausführbaren Datei reduzieren wollen, sollten Sie die nachfolgenden
        //  spezifischen Initialisierungsroutinen, die Sie nicht benötigen, entfernen.
    
    #ifdef _AFXDLL
        Enable3dControls();            // Diese Funktion bei Verwendung von MFC in gemeinsam genutzten DLLs aufrufen
    #else
        Enable3dControlsStatic();    // Diese Funktion bei statischen MFC-Anbindungen aufrufen
    #endif
    
        CTrayapplDlg* dlg=new CTrayapplDlg();
        dlg->Create(IDD_TRAYAPPL_DIALOG); 
        dlg->ShowWindow(SW_SHOW);
    
        MSG msg;
        while(msg.message != WM_CLOSE )
        {
            ::PeekMessage( &msg, NULL, NULL, NULL, PM_NOREMOVE );
            ::AfxGetThread()->PumpMessage();
        }
    
        return TRUE;
    
        /*
    

    So sollte es gehen. Un mach Dir nichts draus, der Source unter dem von Dir angegebenen Link läuft auch bei mir nicht. 😞

    Gruß



  • hi!

    danke, ja so gehts erstmal.

    ich frage mich nur, was der faq eintrag bezweckt. immerhin habe ich das gleiche auch nochmal so im netz gefunden. (ganz einfacher nicht-modaler dialog)

    wäre toll wenn da jemand noch was zu sagen könnte. vielleicht habe ich etwas wichtiges vergessen?

    so wie es zur zeit aussieht ist der faq eintrag schlicht falsch?


Anmelden zum Antworten