Dialog Fenster beim Start verstecken



  • Ok ich werds mal ausprobieren.^^ Danke schonmal!

    Aber warum geht das den nicht einfach mit:

    CWnd* m_Window = CWnd::FindWindow("#32770","Name");
    m_Window->ShowWindow(SW_HIDE);

    Überseh ich irgendetwas? Später im Programm funtkioniert die Anweisung nämlich tadellos...

    Ich suche praktisch noch nach einer Lösung die ohne Timer auskommt (für was anderes 😉 ), weil ich die für ne zweites Programm brauche. Ich weiß, dass das jetzt komisch klingt...^^



  • Wenns ne SDI wäre, wärs einfach... 🙄
    Aber beim Dialog weiß ich nix anderes. 😞



  • Trotzdem DANKESCHÖN!

    Werd mal weiter suchen und vielleicht findet ja noch jemand die Lösung. 🙂

    Aber hab noch ne ganz andere Frage... Schreib das aber lieber in ein neues Posting!



  • Was haltet ihr von einer Veränderung in ::(Pre)CreateWindow:

    dwsytle ~= WS_VISIBL
    /* ~= sollte Xor und Zuweisung sein,
    wenn nicht bitte Posten*/
    

    So müsste das Dialogfeld nicht angezeigt werden.

    P.S.= Gibt es nicht irgendwo (CDialog::CDialog, CDialog:Create(-Indirect)) einen Visible oder Style Parameter?

    Mit freundlichen Grüßen
    Rhombicosidodecahedron



  • hab da was ergoogled

    Mario Siegenthaler schrieb:

    Sobald Du eine Dialogbox mit DoModal() startest, wird sie auch angezeigt
    (in CWnd::DoModalLoop()), *egal* ob Du WS_VISIBLE in der Dialog-Resource
    angegeben hast oder nicht. Das ist ja auch ganz sinnvoll, schießlich
    erwartet
    eine modale Dialogbox Eingaben vom User.
    Wenn Du die Dialogbox nicht anzeigen willst, darfst Du DoModal()
    (in InitInstance()) auch nicht aufrufen. Entweder Du erstellst die
    Dialogbox
    in InitInstance nicht-modal (also mit CDialog::Create()), oder Du rufst
    DoModal() an der Stelle auf, an der Du die Dialogbox auch anzeigen
    willst.



  • CIBVDlg dlg;
    	m_pMainWnd = &dlg;
    	INT_PTR nResponse = dlg.[b]DoModal[/b]();
    	if (nResponse == IDOK)
    	{
    		// TODO: Fügen Sie hier Code ein, um das Schließen des
    		//  Dialogfelds über OK zu steuern
    	}
    	else if (nResponse == IDCANCEL)
    	{
    		// TODO: Fügen Sie hier Code ein, um das 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;
    

    Wenn ich jetzt auf Vorschlag von Mr Evil den Quelltext so abändere:

    CIBVDlg dlg;
    	m_pMainWnd = &dlg;
    	[b]dlg.Create(IDD_INAME_DIALOG,NULL);[/b]
    	/*
    	INT_PTR nResponse = dlg.DoModal();
    	if (nResponse == IDOK)
    	{
    		// TODO: Fügen Sie hier Code ein, um das Schließen des
    		//  Dialogfelds über OK zu steuern
    	}
    	else if (nResponse == IDCANCEL)
    	{
    		// TODO: Fügen Sie hier Code ein, um das 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;
    	*/
    

    dann öffnet sich für den Bruchteil einer Sekunde das Fenster, wird danach jedoch nicht versteckt, sondern die ganze Anwendung schließt sich(ohne Fehler). 😕



  • Ja klar, das ist wegen dem return false und weil der Dialog eine lokale Variable ist.
    Mach den Dialog als Member und gib TRUE zurück.

    Dann wirst du vor dem Problem stehen, dass sich der Dialog nicht mehr schließen lässt - an der Stelle hatte ich die Nase voll... 🙄



  • Rhombicosidodecahedron schrieb:

    Was haltet ihr von einer Veränderung in ::(Pre)CreateWindow:

    dwsytle ~= WS_VISIBL
    /* ~= sollte Xor und Zuweisung sein,
    wenn nicht bitte Posten*/
    

    So müsste das Dialogfeld nicht angezeigt werden.

    P.S.= Gibt es nicht irgendwo (CDialog::CDialog, CDialog:Create(-Indirect)) einen Visible oder Style Parameter?

    Mit freundlichen Grüßen
    Rhombicosidodecahedron

    zu: (CDialog::CDialog, CDialog:Create(-Indirect))
    Habe keinen entsprechenden Parameter gefunden... 😞

    zu:(Pre)CreateWindow
    Hab die Stelle im Code (klassenansicht) nicht gefunden... 😕



  • Habs jetzt letztendlich mit nem Timer realisiert(10ms -> ShowWindow(SW_HIDE).

    Führt anscheinend kein Weg dran vorbei! Aber trotzdem danke für die super schnellen Vorschläge! 😃



  • @Ch3cksum hier ist "DER WEG"
    mach es so wie Mr. Evil gesagt hat !!!

    und schreibe ein "static" vor die Instanz Deiner Dlg-Klasse.
    also

    static CIBVDlg dlg;
    

    und gib in der InitInstance()

    return TRUE;
    

    zurück... dann funktioniert es 😉

    du kannst jetzt in der OnTimer() einfach

    ShowWindow( SW_SHOW );
    

    aufrufen um den Dialog anzuzeigen !!!

    mußt Dich aber auch selbst darum kümmern das du Deine Anwendung wieder "zerstörst" z.B. per

    DestroyWindow()
    

    cu veganza



  • 💡

    ch3cksum verneigt sich vor veganza und mr evil!

    Es klappt!!!! Es lebt!!^^ Der Dialog wird beim Start nicht angezeigt! Juhu!

    Ein ganz großes DANKE veganza!



  • Hallo,

    ohne die Leistung von irgendjemanden zu schmählern, finde ich den Ansatz mit
    der statischen Klasse doch etwas unelegant.

    Ich denke, das eine Reflektierende Fensterklasse für die Timer-Nachricht
    besser ist.

    Vorteil:

    - keine pseudo Singleton-Klasse des Dialogs

    - kein manuelles Abräumen nötig ( sounds perfect! )

    - Reflektor nicht sichtbar für andere Module

    - kein Flackern oder Taskbalken in der Windows-Taskbar

    - Änderungen nur in der App-Cpp Datei

    Schaut mal rein und sagt gerne eure Meinung:

    // HideDialog.cpp : Definiert das Klassenverhalten für die Anwendung.
    //
    
    #include "stdafx.h"
    #include "HideDialog.h"
    #include "HideDialogDlg.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    
    // Reflektor Klasse
    class CTimerWnd : public CWnd
    {
    public:
    	DECLARE_MESSAGE_MAP()
    	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
    	afx_msg void OnTimer(UINT nIDEvent);
    };
    
    BEGIN_MESSAGE_MAP(CTimerWnd, CWnd)
    ON_WM_CREATE()
    ON_WM_TIMER()
    END_MESSAGE_MAP()
    
    int CTimerWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
    // Starte Timer... ( 3 Sekunden )
    	SetTimer(0x01, 3000, NULL);
    
    	return 0;
    }
    
    void CTimerWnd::OnTimer(UINT nIDEvent)
    {
    // Zerstöre Timer
    	KillTimer(nIDEvent);
    
    // Erzeuge den eigentlichen Dialog
    	CHideDialogDlg dlg;
    	dlg.DoModal();
    
    // Zerstöre Reflektor und gehe zum Hauptprogramm zurück
    	DestroyWindow();
    }
    
    // CHideDialogApp
    
    BEGIN_MESSAGE_MAP(CHideDialogApp, CWinApp)
    	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
    END_MESSAGE_MAP()
    
    // CHideDialogApp-Erstellung
    
    CHideDialogApp::CHideDialogApp()
    {
    }
    
    // Das einzige CHideDialogApp-Objekt
    
    CHideDialogApp theApp;
    
    // CHideDialogApp Initialisierung
    
    BOOL CHideDialogApp::InitInstance()
    {
    	InitCommonControls();
    
    	CWinApp::InitInstance();
    
    	AfxEnableControlContainer();
    
    	SetRegistryKey(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"));
    
    // Erzeuge Reflektor Fenster für WM_TIMER
    	CTimerWnd wnd;
    	wnd.Create(_T("STATIC"), _T("TimerWnd"), WS_CHILD, CRect(0,0,0,0), CWnd::FromHandle(GetDesktopWindow()), 0x01);
    
    	m_pMainWnd = &wnd;
    
    // Starte unsichtbares Fenster 
    	wnd.RunModalLoop();
    // und kommme wieder wenn Reflektor zerstört wurde
    
    // Räum alles ab, wenn das Fenster zerstört wird...
    	return FALSE;
    }
    

    Gruß
    Frank



  • Ch3cksum schrieb:

    Folgendes:

    Hab ein ganz simples dialogbasierendes Programm. Beim Start soll der Dialog erstmal unsichtbar sein(per Timer später sichtbar).
    Trotz der Einstellung Sichtbar = FALSE in den Dialog Eigenschaften(Visual Studio) wird der Dialog beim Start der Anwendung immernoch angezeigt. Hab schon versucht in der OnInit Anweisung einfach den Dialog mit ShowWindow(SW_HIDE) zuverstecken, aber dass klappt auch nicht.

    Hab mich schonmal umgeschaut und das hier gefunden:
    http://www.codeproject.com/shell/mfcstartup.asp

    Leider funktioniert diese Lösung überhaupt nicht.

    Hat irgendjemand ne Ratschlag, wie ich den Dialog beim Start der Anwendung verstecken kann? THX

    Was soll an dem mfcstartup Beispiel nicht funzen? Hier gehts wunderbar.

    greetz
    McSnoop


Anmelden zum Antworten