Dialog Fenster beim Start verstecken
-
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
Rhombicosidodecahedronzu: (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.
alsostatic 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.aspLeider 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