Funktion starten nachdem Dialog erscheint?



  • OnInitDialog wird aufgerufen BEVOR der Dialog erscheint. Ich möchte eine Funktion die aufgerufen wird NACHDEM der Dialog (zum ersten mal) erschienen ist.



  • der_micha1981 schrieb:

    OnInitDialog wird aufgerufen BEVOR der Dialog erscheint. Ich möchte eine Funktion die aufgerufen wird NACHDEM der Dialog (zum ersten mal) erschienen ist.

    Also entweder du machst es in OnInitDialog (aber nach CDialog::OnInitDialog, damit die Controls initialisiert sind!), oder du nimmst z.B. einen Timer, der am Ende von OnInitDialog gestartet wird und nach einer sehr kurze Zeitspanne ausgelöst wird. Der führt dann deine Funktion aus und deaktiviert sich selbst.



  • Du könntest auch am Ende von OnInitDialog mit PostMessage() eine selbstdefinierte Message (siehe WM_APP) senden, auf die Du dann wiederum über ein ON_MESSAGE in der Messagemap deines Dialoges reagierst.



  • Ich hab das mit dem Timer mal gemacht. Es gibt jetzt nur noch ein Problem: die Einträge in die Listbox werden erst nach dem vollständigem Durchlaufen der Funktion AfterInitDialog getätigt. D.h. der Nutzer sieht einige sekunden lang das leere Listbox Feld und dann mit einem Schlag alles was passiert ist. Ein UpdateData(false) nützt nichts.
    Habt ihr Vorschläge, wie ich die Einträge sichtbar mache bevor GetPosition ausgeführt wird?

    UINT m_Timer = 0;
    BOOL CMeasuringDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	m_Timer = SetTimer(1,700,NULL);	//Führt zu AfterInitDialog
    
    	return TRUE;  // 
    }
    void CMeasuringDlg::OnTimer(UINT_PTR nIDEvent)
    {
    	AfterInitDialog();
    
    	KillTimer(m_Timer);
    	m_Timer=0;
    
    	CDialog::OnTimer(nIDEvent);
    }
    void CMeasuringDlg::AfterInitDialog(void)
    {
         m_StatusList.AddString(_T("Trying to get position information..."));
         UpdateData(false);
         if(GetPosition(lon, lat))//braucht einige Sekunden...
    		{
    			CString help;
    			help.Format(_T("Your position: \n\tlon = %lf\n\tlat = %lf"),lon,lat);
    			m_StatusList.AddString(help);
    		}
    		else 
    			m_StatusList.AddString(_T("No position aviable"));
    


  • Du brauchst einen 2. Thread dafür. Die Events werden ja nacheinander abgearbeitet und du hängst nur weitere Events hintendran.
    Also zeitintensive Sachen in nen Thread auslagern und per PostMessage/SendMessage Nachrichten an den Dialog schicken.



  • Wenn du möchtest dass die Applikation "responsive" bleibt während GetPosition() läuft, dann brauchst du einen Worker-Thread.

    Wenn es dir reicht dass der "Trying to get position information..." Text angezeigt wird, bevor GetPosition() losläuft, dann könntest du im 1. Timer einfach den Text rausschreiben, und danach nen 2. Timer setzen (oder den Timer einfach nochmal feuern lassen), und im 2. Timer Callback dann erst GetPosition() starten.

    Ansonsten gibt's glaube ich eine UpdateWindow() Funktion (bin mir nichtmehr ganz sicher wie die heisst), die das Fenster neu zeichnet. Wenn du die nach UpdateData() aufrufst, müsste das eigentlich auch reichen.



  • für das neuzeichnen der dialogs muß der Messahgeloop von Windowsin gang gesetzt werden, das kann man machen über den timer oder in dem man einen thread startet oder am einfachsten in dem man den Messageloop vor GetPosition integrieren.

    siehe hier:
    http://www.mpdvc.de/html.htm#Q75

    und ich denke an der stelle geht das schon mal ok sich eines tricks zu bedienen. natürlich ist wenn dein GetPosition, länger braucht ein Thread mit PostMesasage besser, da sonnst dein Dialog bei längeren lauf aussieht als währe er in die ewigen Jagdgründe aufgestigen, also der reagiert net mehr auf irgendwelche bedienungen


  • Mod

    BTW: Wenn das Ressourcen Template den Dialog als Visible deklariert, dann ist der Dialog auch bereits sichtbar, wenn OnInitDialog ausgeführt wird...



  • CTecS schrieb:

    das kann man machen über den timer oder in dem man einen thread startet oder am einfachsten in dem man den Messageloop vor GetPosition integrieren.

    Also bei einem Message-Loop vor GetPosition hätte ich persönlich kein gutes Gefühl.


  • Mod

    Meine Lösung sehe so aus:
    - Visible Stil in Dialog Ressource. Zur Not einfach ShowWindow in OnInitDialog ausführen.
    - Zusätzlich den Verzögerungstext anzeigen als Static im Dialog einblenden.
    - UpdateWindow
    - Dann noch Hourglas Cursor und gut ists.
    - Wenn fertig. Verzögerungstext ausblenden (DestroyWindiw, ShowWindow mit SW_HIDE)


Anmelden zum Antworten