Dialog verliert Focus = nicht mehr maximierbar



  • Und schon bahnen sich neue Probleme an 😞

    Nachdem ich meiner Testanwendung einen Slidedialog spendiert habe
    kann ich nun, wenn dieser Slidedialog sichtbar ist, die Hauptanwendung
    nicht mehr maximieren.

    Ich sehe sie zwar nach Ablage in der Taskbar da unten noch, bekomme
    sie aber nicht mehr zurück.

    Vermutlich muss ich irgendeine Message einfügen, die mir die zwei
    Dialoge wieder nach oben bringt. Nur welche 😕



  • Als Idee hätte ich jetzt noch gedacht ich verwende:

    ShowWindow(SW_RESTORE);
    

    Nur wo setze ich das hin? Welche Funktion wird gerufen, wenn ich aus dem
    Taskbar den Dialog zurück haben will?



  • Auch wenn ich nerve noch ein wichtiger Nachtrag (mein Gott ich
    führe schon Selbstgespräche 😃 ):

    Wenn ich einen Rechtsklick auf den Eintrag in der Taskbar mache,
    kann ich erfolgreich mit "Wiederherstellen" beide Fenster anzeigen.

    Any ideas?



  • Hat denn da niemand eine Idee woran sowas liegen könnte?
    🙄


  • Mod

    Also wenn Dein Dialog per DoModal geöffnet ist, dann ist dieser modal. In diesem Fall ist das Elternfenster disabled. Das ist normal. Du müsstest den Dialog entsprechend nicht modal erzeugen.



  • Nabend Martin,

    ich habe den Slidedialog mit

    (SlideDialog von Codeproject)

    m_pModeless = new haus(this);
    if(m_pModeless->GetSafeHwnd()==0)
    {
       m_pModeless->Create();
       m_pModeless->SetSlideSpeed(10);
       m_pModeless->SetSlideDirection(RIGHT);
       m_pModeless->StartSlide();
    }
    

    aufgerufen. Er ist also neben der Hauptanwendung gleichzeitig zu nutzen.
    Also nicht modal.

    Ich verstehe nicht was mir dazwischen funkt. Denn in der Anwendung von
    Codeproject tritt das Problem nicht auf. Ebenso in einer weiteren Anwendung
    die ich testweise genauso angelegt habe.

    Ich muss die relevante Stelle finden, die in meinem aktuellen Projekt das
    Problem verursacht. Hab nur keine Ahnung was da überhaupt für Funktionen
    beim "Restore" gerufen werden.

    Denn, nutze ich per Rechtsklick "Wiederherstellen" in Windows, dann habe ich
    beide Dialoge wieder. Es tritt auch nur auf, wenn ich den Slidedialog offen
    habe und dann in die Taskleiste minimiere.



  • Habe die Stelle gefunden, die das Problem verursacht, aber noch keine
    Idee für eine Lösung.

    Sobald ich den Aufruf für OnMove mit Reposition setze hakelt es.

    void CTest::OnMove(int x, int y)
    	{
    	CDialog::OnMove(x, y);
    
    	//ab hier die Problemstelle!!
    	if (m_bOpen)
    	{
    
    		m_pModeless->RePosition();
    
    	}
    
      	}
    

    RePosition sieht wie folgt aus:

    BOOL CSlideSon::RePosition() 
    
    {
    	this->m_pDlg->GetWindowRect(&m_MyPos);
    	int xPos = m_MyPos.right ;
    	SetWindowPos(&wndTop,xPos,m_MyPos.top+4,OrigPos.Width(),m_MyPos.Height()-8,SWP_SHOWWINDOW);
    	return TRUE;
    }
    

    Ist in anderen Anwendungen jedoch so anwendbar, ohne dass die Dialoge nicht
    mehr hoch kommen. 😕



  • Um den halben Monolog zu beenden hier doch eine mögliche, aber unfeine Lösung:

    this->m_pDlg->GetWindowRect(&m_MyPos);
    	int xPos = m_MyPos.right ;
    	SetWindowPos(&wndTop,xPos,m_MyPos.top+4,OrigPos.Width(),m_MyPos.Height()-8,SWP_SHOWWINDOW);
    
    	::AfxGetMainWnd()->ShowWindow(SW_RESTORE);
    
    	return TRUE;
    

    Dadurch, dass bei ausgeklapptem Slidedialog in OnMove nun immer
    SW_RESTORE gerufen wird, kann man bei ausgeklapptem Fenster in der
    Hauptanwendung leider nicht mehr "Minimieren" klicken, da dies
    unweigerlich zu einem OnMOve() führt....

    Naja, halbwegs zusammengefrickelt 🙄

    Aber besten Dank an dich Martin! 👍



  • Im Nachhinein finde ich das Restore doch etwas unglücklich.

    Habt ihr eine Idee den Dialog anderweitig wieder herzustellen?


Anmelden zum Antworten