OnTimer-Problem

titanic

Mitglied
Hallo Leute,

ich habe eine SDI-Anwendung. In der InitInstance() der Applikation
zeige ich ein nicht modales Dialog an. Dann starte ich in der OnInitDialog()
einen Timer, aber das WM_TIMER Ereignis empfange ich nicht.
Wieso? Ich vermute, das hat was mit der Nachrichtentabelle zu tun.
Kann mir da jemand helfen?

titanic
 
Hallo,

Das ich die Windows-Nachrichen nicht empfangen kann liegt wohl am nicht modalen
Dialog.

Um die Nachrichten zu verarbeiten rufe ich die PeekMessage() auf.

Code:
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
BOOL CMFLStartDlg::OnInitDialog()
{
	
	CDialog::OnInitDialog();

	SetStartDlgTimer();
	UpdateStartDlgMessage();

	return TRUE;  // return TRUE unless you set the focus to a control
	// AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
}
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
void CMFLStartDlg::SetStartDlgTimer()
{
	if (m_uStartDlgTimer == 0)
	{
		m_uStartDlgTimer = (UINT)SetTimer(START_DLG_TIMER_ID, 100, NULL);
	}
}
//-------------------------------------------------------------------------------------
//-------------------------------------------------------------------------------------
void CMFLStartDlg::UpdateStartDlgMessage()
{
	MSG message;
	while(PeekMessage (&message, NULL, 0, 0,PM_REMOVE))
	//while(GetMessage(&message, 0, 0, 0))
	{
		TranslateMessage(&message);
		DispatchMessage(&message);
	}

}
Bleibt mir denn nichts anderes übrig, als die Nachrichten manuell zu verarbeiten?
 
Wenn du innerhalb der Funktion OnInitDialog bist, bist du gerade mitten in der Nachrichten verarbeitung. Deshalb solltest du da keinesfalls eine zweite MessageSchleife mit einbauen.

Nimm mal das UpdateStartDlgMessage da raus, die MessagePump hat MFC schon für dich erledigt (es sei denn, du spielst mit Threads rum).
 
Danke dir Endurion für die Antwort,

ich versuche mal mein Vorhaben etwas konkreter zu beschreiben.

ich habe eine SDI-Anwendung mit einem SplitterWnd.

Ich möchte, dass beim Starten der Anwendung ein Logo(Bild) angezeigt wird.
Umgesetzt habe ich es mit einem ramenlosem Dialog, wo ich eine Bitmap platziere.
Das Dialogfeld wird in CMainFrame::OnCreateClient(..) zu Begin der Funktion
nicht modal angezeigt und am Schluss(der Funktion) zerstört.

Eins der Panes des SplitterWnd-Objekts ist ein TreeView, wo ich die Laufwerke anzeige. Dieser Prozess kann unterschiedlich lang dauern. Deshalb wollte ich mit dem Timer die Zeit messen und so die Anzeige-Dauer des Dialogs steuern.

Wenn ich die Windows-Nachrichten des Dialogs nicht manuell bearbeite, bekomme ich sie gar nicht(OnTimer()) wird gar nicht aufgerufen.

Wieso einfach, wenn es auch kompliziert geht?
Beim Erzeugen des Dialogs merke ich mir die System-Zeit
und vor dem Zerstören rechne ich die Differenz aus,


Tja,
wie holt man die Systemzeit?
 
Danke,
ich habe es jetzt so umgesetzt:

Code:
BOOL CMFLStartDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	m_createTime = CTime::GetCurrentTime();

	return TRUE;  // return TRUE unless you set the focus to a control
	// AUSNAHME: OCX-Eigenschaftenseite muss FALSE zurückgeben.
}
inline void CMFLStartDlg::LeerLauf(int in_nAnzeigeDauerSec)
{
	CTime destroyTime = CTime::GetCurrentTime();
	CTimeSpan timeSpan = destroyTime - m_createTime;
	int sec = (int)timeSpan.GetTotalSeconds();
	if (sec<0) sec=0;

	while (sec < in_nAnzeigeDauerSec)
	{
		Sleep(1000);
		sec += 1;
	}
}
//-----------------------------------------------------------------------
//-----------------------------------------------------------------------
void CMainFrame::DeleteStartDlg()
{
	if (m_pStartDlg != NULL)
	{
		m_pStartDlg->LeerLauf();
		delete m_pStartDlg;
		m_pStartDlg = NULL;
	}
}

Eine offene Frage habe ich noch.
Glaube irgendwo gelesen zu haben,
dass die WM_TIMER-Nachricht eine sehr geringe Priorität hat,
könnte man sie denn auch ändern?

blei
Trotzdem wüsste ich gern, wie ich
 

Neue Beiträge

Zurück