ERLEDIGT
NEIN
NEIN
ANTWORTEN
5
5
ZUGRIFFE
1362
1362
EMPFEHLEN
-
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.
Bleibt mir denn nichts anderes übrig, als die Nachrichten manuell zu verarbeiten?Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
//----------------------------------------------------------------------- //----------------------------------------------------------------------- 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); } }
-
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?
-
24.10.07 09:26 #5
- Registriert seit
- Jun 2005
- Ort
- Bad Arolsen (Hessen)
- Beiträge
- 556
Hallo,
Code :1 2
SYSTEMTIME stm; GetSystemTime(&stm);
in stm stehen alle Infos.
Mfg
langer
-
Danke,
ich habe es jetzt so umgesetzt:
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
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
Ähnliche Themen
-
[IE7 Problem] Problem mit ul/li Höhen im IE7 bei Verwendung eines vertikalen Menüs
Von josDesign im Forum CSSAntworten: 0Letzter Beitrag: 11.01.11, 21:40 -
Problem: Flash MX (7.1) exportiert meine Fla nicht mehr - dringendes Problem
Von Lukasz im Forum Flash PlattformAntworten: 4Letzter Beitrag: 22.03.06, 20:50 -
OnTimer unterbrechung
Von masa im Forum VisualStudio & MFCAntworten: 3Letzter Beitrag: 18.12.04, 21:04 -
Problem mit hover- background ändern & Problem bei Reload
Von ollioollio im Forum CSSAntworten: 0Letzter Beitrag: 06.10.04, 14:03 -
Problem mit PopUp (Ja ich weiss Suche benutzten, hab ein ganz anderes Problem)
Von killkrog im Forum Javascript & AjaxAntworten: 6Letzter Beitrag: 13.06.02, 12:29





Zitieren
Login






