Programm zur Laufzeit minimieren



  • Wie kann ich denn mein Programm zur Laufzeit minimieren ohne den Button rechts oben in der Titelzeile zu benutzen.
    Gibt es die Möglichkeit eine minimieren-Nachricht zu schicken?

    plutonium2



  • probier mal: ShowWindow(hwnd, SW_MINIMIZE)
    🙂



  • Das funktioniert nicht so ganz.
    Ich habe das mal in ein OnLButtonDown(UINT.. gelegt.
    Das sieht dann so aus.

    void CTestView::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	HWND hwnd;
    	hwnd = (HWND) GetWindow(GW_OWNER);
    
    	ShowWindow(hwnd, SW_MINIMIZE);
    	CRichEditView::OnLButtonDown(nFlags, point);
    }
    

    error C2660: 'ShowWindow' : Funktion akzeptiert keine 2 Parameter

    habe es nun so geändert.

    ShowWindow(SW_MINIMIZE);

    Nun startet das Programm zwar und wenn ich die linke Maustaste drücke sieht es auch so aus
    als ob das Fenster zusammen fährt aber es bleibt da und ich kann es verschieben. Es bleiben dann Reste des Desktops im Fenster die anscheinend nicht mehr richtig gelöscht werden.
    Aber irgendwie ist das Fenster noch da.

    plutonium2



  • Liegt daran das MFC CWnd diese Funktion auch hat. Musst auf den Global bereich zugreifen:

    void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
    {
        HWND hWnd = static_cast<HWND>(GetWindow(GW_OWNER));
        if (hWnd != NULL)
            ::ShowWindow(hWnd, SW_MINIMIZE);
        CRichEditView::OnLButtonDown(nFlags, point);
    }
    


  • Ich benutze auch ganz Ordinär:

    void CDimuRadioDlg::OnBnClickedButton3()
    {
    ShowWindow(SW_MINIMIZE); // Dialog in Taskleiste
    }
    void CDimuRadioDlg::OnBnClickedButton4()
    {
    ShowWindow(SW_HIDE); // Dialog unsichtbar (nur Trayicon)
    }
    void CDimuRadioDlg::OnPlayerDimuradioplayer()
    {
    ShowWindow(SW_SHOW); // Dialog sichtbar
    }
    das ganze in verbindung mit einem Trayicon um den Dialog auch wieder zu bekommen 😃

    Funktioniert vollkommen fehlerfrei.



  • Hallo Ihr zwei.
    Danke für die Antworten aber beide funktionieren nicht.

    Ich habe zuerst folgendes ausprobiert.

    void CTestView::OnLButtonDown(UINT nFlags, CPoint point) 
    { 
        HWND hWnd = static_cast<HWND>(GetWindow(GW_OWNER)); Hier Fehlermeldung
        if (hWnd != NULL) 
            ::ShowWindow(hWnd, SW_MINIMIZE); 
        CRichEditView::OnLButtonDown(nFlags, point); 
    }
    

    Ich bekomme beim kopilieren diese Fehlermeldung.
    : error C2440: 'static_cast' : 'class CWnd *' kann nicht in 'struct HWND__ *' konvertiert werden
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    Als nächstes habe ich ausprobiert was fmotto_ schreibt.
    Sieht bei mir dann folgendermassen aus.

    void CTestView::OnKlick_1()
    {
    	ShowWindow(SW_MINIMIZE);
    }
    

    Das Programm startet zwar und es sieht beim klick auf den Button auch so aus als würde das Fenster zusammen fahren aber es bleibt wo es ist und lässt sich verschieben. Wenn ich es fast aus dem Bildschirm herausschiebe und dann wieder zurück holen ist der Button der gerade noch da war verschwunden und es sind nur wirre Sachen in der Ansicht zu sehen. Ich benutze Visual Studio 6 zum programmieren.

    plutonium2



  • Ach mist hab vergessen in welcher Klasse du da bist ^^

    void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
    {
        HWND hWnd = GetWindow(GW_OWNER)->GetSafeHwnd(); // GetSafeHwnd gibt den HWND des CWnd Pointers wieder.
        if (hWnd != NULL)
            ::ShowWindow(hWnd, SW_MINIMIZE);
        CRichEditView::OnLButtonDown(nFlags, point);
    }
    


  • Hallo (D)Evil.
    Es funktioniert nicht. Ich habe mal ein TRACE eingefügt und festgestellt das hWnd immer 0 ist.
    Warum es immer 0 ist ist mir ein Rätsel.

    void CTestView::OnLButtonDown(UINT nFlags, CPoint point) 
    {
    	HWND hWnd = GetWindow(GW_OWNER)->GetSafeHwnd();
            TRACE("\n HWND = %i \n\n", hWnd);
    	if (hWnd != NULL)
            	::ShowWindow(hWnd, SW_MINIMIZE);
    
    	CRichEditView::OnLButtonDown(nFlags, point);
    }
    

    Ich war aber nicht untätig und habe zwei andere Lösungen für mein Problem gefunden.
    entweder

    AfxGetApp()->m_pMainWnd->ShowWindow(SW_MINIMIZE);
    

    oder

    CWnd* pWnd = CWnd::FindWindow(NULL, "fenster4");
    pWnd->ShowWindow(SW_MINIMIZE);
    

    Jetzt kann ich das Fenster endlich minimieren.

    plutonium2



  • Achso.. ja musst auch sagen das du DAS Fenster meinst ... dann ist das klar ...



  • Hallo (D)Evil.
    Was dachtest du was ich meine.
    Ich schrieb “Wie kann ich denn mein Programm zur Laufzeit minimieren ohne den Button rechts oben in der Titelzeile zu benutzen.“
    Was kann man denn mit deinem Code schliessen?

    void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
    {
        HWND hWnd = GetWindow(GW_OWNER)->GetSafeHwnd(); 
        if (hWnd != NULL)
            ::ShowWindow(hWnd, SW_MINIMIZE);
        CRichEditView::OnLButtonDown(nFlags, point);
    }
    

    plutonium2



  • Wie wärs damit?

    this->ShowWindow(SW_MINIMIZE);
    


  • Hallo 2340it9 .
    Funktioniert nicht.
    Sieht so aus als ob aber das Fenster bleibt. Beim hin und herschieben
    wird die Ansicht nicht mehr richtig gelöscht und es sind lauter
    Fensterfragmente der anderen Fenster auf meinem Desktop zu sehen.

    plutonium2



  • Naja ...

    void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
    {
        HWND hWnd = GetWindow(GW_OWNER)->GetSafeHwnd();
        if (hWnd != NULL)
            ::ShowWindow(hWnd, SW_MINIMIZE);
        CRichEditView::OnLButtonDown(nFlags, point);
    }
    

    ist halt dein Code optimiert ^^ bzw. GetWindow(GW_OWNER) gibt halt das Fenster, dem dein CTestView Fentser gehört, zurück.

    void CTestView::OnLButtonDown(UINT nFlags, CPoint point)
    {
        CWnd* pMainWnd = AfxGetMainWnd();
        if (pMainWnd != NULL)
            pMainWnd->ShowWindow(SW_MINIMIZE);
    
        CRichEditView::OnLButtonDown(nFlags, point);
    }
    

    Vllt ist das das was du haben willst ^^


Anmelden zum Antworten