Message nach Fenster Verkleinern, Schließen, Maximieren

gabifi

Mitglied
Gibt es spezeielle Nachrichten, die man abfangen kann wenn ich auf "Verkleinern" oder "Maximieren" in meinem Programm klicke? Möchte dann das Fesnter entsprechend positionieren, nur weiß ich net wo ich das reinschreiben kann.

Danke
Gabriel
 
Es gibt eine generelle Nachricht, die du NACH dem Effekt (minimieren/maximieren/usw.) erhältst, WM_SIZE. Wenn du darauf hin aber etwas am Fenster rumschiebst, wirst du ein Zucken bemerken.

Du kannst aber die Nachrichten direkt abfangen (WM_SYSCOMMAND, SC_MINIMIZE, SC_MAXIMIZE). Wenn du die Nachrichten dann selbst bearbeitest, darfst du die in der WindowProc allerdings NICHT mehr an die DefWindowProc weitergeben.
 
Habe in meiner CMainFrame-Klase mal beide hinzugefügt:

Code:
LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
	if( wParam == SC_RESTORE)
		//return 0;
		AfxMessageBox("WindowProc");
	

	return CFrameWnd::WindowProc(message, wParam, lParam);
}

void CMainFrame::OnSysCommand(UINT nID, LPARAM lParam)
{
	if (nID == SC_RESTORE )
		AfxMessageBox("OnSysCommand");

	CFrameWnd::OnSysCommand(nID, lParam);
}

Jedoch kommt die Nachricht zuerst in der WindowProc an, wenn ich sie dort rauslösche kommt sie ja nie in die OnSysCommand. Oder was muss ich in der WindowProc zurückgeben, um sie abzufangen, habs mal mit ner 0 versucht, hat au geklappt.
Aber prinzipell bin ich schon mal schlauer als vorher...
 
Ich glaube, Endurion meinte, daß Du die Nachricht in der WindowProc abfangen und bearbeiten sollst und sie dann eben nicht mehr weiterleitest.
 
Übrigens, mach bloss die if( wParam == SC_RESTORE) aus der WindowProc raus!
Du prüfst da ja gar nicht auf die Nachricht WM_SYSCOMMAND. Das könnte auch auf irgendeine Nachricht, bei der WPARAM gerade zufällig den Wert SC_RESTORE hat, zutreffen.

Für deinen Fall reicht OnSysCommand ja schon aus.

Und wie in der MSDN steht, wenn du das Ereignis selber schon bearbeitest, nicht mehr CFrameWnd::OnSysCommand aufrufen, sondern direkt return 0 machen.
 
Habe das schon umgeändert.
An sich möchte ich mein Fenster beim Starten des Programms wieder an der Stelle erstellen, an der es beendet wurde. Beim Beenden kann ich ja nachschauen, woe es ist, wie groß und ob Maximert und so.
Nur wenn ich in der InitInstance() der Application-Klasse jetzt über SetWindowPos() die Koordinaten setzte und dann m_pMainWnd->ShowWindow(SW_SHOWMAXIMIZED) aufrufe, hauts net hin, da er das Fenster an na andere Stelle schiebt. Mit SW_RESTORE gehts. Hab au schon über SetWindowPlacement() gearbeitet, aber da zeigt er mir dann gar nichts an. Gibts da ne Standardlösung für sowas?
 
Ok, hat sich erledigt, bin gerade auf die Lösung gestoßen, hier falls es mal jemand braucht:
Code:
BOOL CMainFrame::DestroyWindow()
{
	WINDOWPLACEMENT wp;
    GetWindowPlacement(&wp);
    AfxGetApp()->WriteProfileBinary(REG_DIR_CUSTOM, "WP", (LPBYTE)&wp, sizeof(wp));

	return CFrameWnd::DestroyWindow();
}

Code:
void CMainFrame::OnShowWindow(BOOL bShow, UINT nStatus)
{
	CFrameWnd::OnShowWindow(bShow, nStatus);

    static bool bOnce = true;

    if(bShow && !IsWindowVisible()
        && bOnce)
    {
        bOnce = false;

        WINDOWPLACEMENT *lwp;
        UINT nl;

        if(AfxGetApp()->GetProfileBinary(REG_DIR_CUSTOM, "WP", (LPBYTE*)&lwp, &nl))
        {
            SetWindowPlacement(lwp);
            delete [] lwp;
        }
    }
}

und dann in der InitInstance einfach mit m_pMainWnd->ShowWInod(SW_SHOW) zeigen.
 

Neue Beiträge

Zurück