Handle von einem DoModal-Fenster im Hauptdialog?



  • Hi

    Ich verwende ein TrayIcon in meiner Anwendung, und möchte nun das bei einem Linksklick auf das Icon, das aktuelle Fenster "minimiert" wird (ShowWindow(SW_HIDE)). Die Verarbeitung des Linksklicks passiert aber in der Hauptdialog-Klasse in OnTrayNotification().

    Das Problem ist, dass ich mehrere Fenster per DoModal() erstellt haben könnte.
    Wie bekomme ich nun ein Handle auf das Fenster, dass ich per DoModal() in einer Funktion der Hauptdialog-Klasse erstellt habe, damit ich es in OnTrayNotification mit ShowWindow minimieren kann?

    So sieht das aus:

    CHauptDlg::Funk1()
    {
    	...
    	CKind KindDlg;
    	if (KindDlg.DoModal() == IDOK)	// Fenster da
    	...
    }
    ...
    ...
    CHauptDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam)
    {
    	if (lParam == WM_LBUTTONDOWN )
    	{
    		ShowWindow( KindDlghwnd ,SW_HIDE);	// hier brauch ich das Handle vom KindDlg
    	}
    	...
    }
    

    Wenn jemand weiß, wie man das anders/einfacher lösen kann, immer her damit.

    mfg
    Andreas



  • Du kannst den Dialoghandle (child) in einem Datenelement des Hauptdialoges speichern.

    CHauptDlg::CHauptDlg():
        KindDlghwnd = NULL;
    {
    }
    
    CHauptDlg::Funk1() 
    { 
        ... 
        CKind KindDlg;
        KindDlghwnd = KindDlg.GetSafeHwnd();
        if (KindDlg.DoModal() == IDOK)    // Fenster da 
        ... 
        KindDlghwnd = NULL;
    } 
    ... 
    ... 
    CHauptDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam) 
    { 
        if (lParam == WM_LBUTTONDOWN ) 
        { 
            ShowWindow( KindDlghwnd ,SW_HIDE);    // hier brauch ich das Handle vom KindDlg 
        } 
        ... 
    }
    


  • Sorry, muss natürlich so aussehen...

    CHauptDlg::CHauptDlg(): 
        KindDlghwnd(NULL) 
    { 
    }
    


  • Das geht ja eben nicht, weil:

    CHauptDlg::Funk1()  
    {  
        ...  
        CKind KindDlg; 
        KindDlghwnd = KindDlg.GetSafeHwnd();  // Fenster noch nicht da !!
        if (KindDlg.DoModal() == IDOK)        // Fenster da  
        ...  
        KindDlghwnd = NULL; 
    }
    

    Ergebnis:

    KindDlghwnd = 0x00000000

    Das Fenster wird in DoModal() ja erst erstellt. 😉



  • Stimmt, hast recht :p
    Dann definier doch eine Message, die du in der Create-Methode
    an das Eltern-Fenster sendest und den Handle übergibst, etwa so....

    int CModalDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CDialog::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
    	HWND hParent = GetParent()->m_hWnd;
    	::SendMessage(hParent, MESSAGE_HANDLE, (WPARAM) m_hWnd, 0);
    
    	return 0;
    }
    

    hab's leider nicht getestet 🙄



  • Hi

    Ob es in OnCreate funktioniert, weiß ich nicht, da ich ja DoModal benutze. Also hab ich es da probiert. Geht auch nicht. Aber in OnInitDialog funktioniert es einwandfrei.

    Danke für die Hilfe. 🙂



  • BOOL ChildDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    
    	static_cast<MyParentDlg*> (GetParent())->SetMyChild(this);
    	// oder
    	static_cast<MyParentDlg*> (GetParent())->myChild = this;
    }
    

    Kannst auch mit FindWindowEx (hwndParent = m_hWnd) nach einem Child mit dem Klassennamen "#32770" suchen. Natürlich nur sinnvoll wenn du nur einen untergeordneten Dialog hast.

    Aber wieso willst du nur das Child minimieren? Dann hast du ein sichtbares Fenster das man nicht anklicken kann - ist doch nicht der Sinn - oder?



  • Nemesyzz schrieb:

    Aber wieso willst du nur das Child minimieren? Dann hast du ein sichtbares Fenster das man nicht anklicken kann - ist doch nicht der Sinn - oder?

    Doch, denn das Fenster des Hauptdialogs verstecke ich kurz vor DoModal() mit ShowWindow(SW_HIDE). Ich habe also nur noch das modale Fenster und das Trayicon und kann jetzt mit Linksklick auf das Icon das Fenster ein- und ausblenden.

    Das sieht jetzt so aus:

    LRESULT CHauptDlg::OnTrayNotification(WPARAM wParam, LPARAM lParam)
    {
    	if (WM_LBUTTONDOWN == lParam)
    	{
            if (m_hwnd_Mini != NULL)	// HWND aus DoModal-Fenster per SendMessage
    		{
    			::IsWindowVisible(m_hwnd_Mini)?  ::ShowWindow(m_hwnd_Mini, SW_HIDE):
    						       	      	::ShowWindow(m_hwnd_Mini, SW_SHOWNORMAL);
    		}
    
    		return 0L;
    	}	
    
    	// Verarbeitung in CTrayNotifyIcon
    	m_TrayIcon.OnTrayNotification(wParam, lParam);
    
    	return 0L;
    }
    

    Das Fenster, dass ich per DoModal aufrufe, hat keine Titelleiste, kein Systemmenü und keinen Titel(CAPTION), also auch keine Minimieren-Schaltfläche.

    Bei Doppelklick auf das Trayicon oder bei Auswahl aus dem TrayMenü wird das "DoModal"-Fenster beendet, und das Fenster des Hauptdialogs wiederbelebt (ShowWindow(SW_SHOW)).

    Hört sich ein bisschen krank an. Man muss es gesehen haben. 🙂


Anmelden zum Antworten