Dialog kommt nicht in Vordergrund
-
Hiho,
momentan nervt mich wieder ein typisches MFC-Problem.
Ich habe eine SDI-Anwenung aus mehreren Fenstern. In meiner Menüeiste gibt es nun Befehle, um Eigenschaften-Dialog modal zu öffnen. Nun passiert folgendes: ab und an kommt der Dialog nicht in den Vordergrund, sondern ich muss erst die alt-Taste drücken.
Meine Fenster in der SDI fangen ein paar Nachrichten ab. Bei diesen rufe ich auch meistens die Elternmethode auf. Bei OnBackground rufe ich sie mal nicht auf, aber da gibts ja auch entspechende MFC-Bsp, wo das genauso gehandhabt wird, damit kein Flackern auftritt (bei meiner Anwendung ist gesichert, das der ganze Bildschirm neu gezeichnet wird, daher brauche ich das Erase da nicht).
Bei den OnPaints rufe ich auch die Elternmethode aus, außer bei den Views, weil dort als MFC-Kommentar direkt drinne steht, das man es nicht tun soll. Aber selbst mit Aufruf kommt mein Dialog auch nicht immer in den Vordergrund.Woran kann das noch liegen? Ich kenn es nur, dass dieses Problem auftritt, wenn man vergisst bei bestimmten Nachrichten die Elternmethode aufzurufen. So langsam nervt dieses Problemchen oO
MfG Pellaeon
-
Das mit den Elternmethoden ist hier glaube ich nicht die Ursache.
Eher könnte es ein Problem sein, wen Du als Elternfenster bei definieren des Dialoges angibst.
Oder:
- Hast Du auch nicht modale Fenster?
- Sendest Du während des Öffnens des Dialoges (OnInitDialog), Nachrichten an ein anderes Fenster, die evtl. ein anderes Fenster aktivieren (SetFocus ausführen etc.)
- Hast Du beim Verwenden von SetWindowPos evtl. SWP_NOZORDER vergessen?
-
Hiho,
momentan setz ich gar kein Elternfenster. Das werde ich mal durchleiten und testen ob das hilft. Ansonsten andere nicht modale Dialoge gibt es nicht. Es ist eine einfache SDI-Anwendung welche selber mehrere andere CWnd und CScrollView-Objekte besitzt (http://img190.imageshack.us/img190/5614/mfcgui.png).
Was passiert, ist ein Timer, welcher eine Grafik regelmäßig aktualisiert. Der läuft die ganze Zeit. Ändert der den Fokus?Ansonsten SetWindowPos benutze ich nicht, sondern das MoveWindow (Tipp von dir gewesen^^)
MfG Pellaeon
-
Es kommt darauf an, was der Timer macht...
Zeig Code!
-
Timer:
// void COpenSGWnd::OnTimer(UINT_PTR nIDEvent) { CWnd::OnTimer(nIDEvent); if (nIDEvent == 1) Invalidate(); }
OnPaint:
// void COpenSGWnd::OnPaint() { CWnd::OnPaint(); ICamera::Resolution size = CArManager::getInstance().getImageSize(); const char* pBuffer = CArManager::getInstance().getImage(); m_opengl.activateRenderContext(); if (pBuffer) { copyToMyBuffer(pBuffer); m_document.getOsgGraphic().setBackground(&m_imgBuffer[0],size.first,size.second); int markerFound = CArManager::getInstance().calcCameraPosition(reinterpret_cast<const unsigned char*>(pBuffer)); if (markerFound) { Matrix trafo; trafo.setValue(CArManager::getInstance().getProjectionMatrix(),true); m_document.getOsgManager().getCamera()->setProjectionMatrix(trafo); trafo.setValue(CArManager::getInstance().getViewMatrix(),true); m_document.getOsgManager().getCamera()->setModelviewMatrix(trafo); } m_document.getOsgGraphic().activate(markerFound); CString tmp; tmp.Format(_T("ARViewer - %dx%d Marker gefunden? %d"),size.first,size.second,markerFound); this->GetParent()->GetParent()->SetWindowText(tmp); } m_document.getOsgManager().render(); m_opengl.endRendering(); }
-
Was macht
m_document.getOsgGraphic().activate(markerFound);
?
-
Die Klasse hat nichts mit der MFC zu tun. Die Methode (de-)aktiviert einen Szenegraph-Knoten aus OpenSG.