Window Styles



  • Hallo zusammen,

    wenn man zB. den Explorer an der Titelleiste anfasst und ganz nach oben schiebt,
    dann vergrössert er sich und füllt den ganzen Bildschirm.

    Genau dieses Verhalten möchte ich auch für mein Programm.

    Ich habe alle Window Styles durchgesehen, aber keinen Entdeckt welcher diesen Effekt erzeugt.

    Bei Google habe ich nur haufenweis Hinweise gefunden welche dieses Verhalten
    abstellen wollen.

    Bei meinem Programm geht's um eine Maschinensteuerung und es ist das einzige Programm
    welches auf dieser Maschine benutzt wird.

    Gruss
    Walter



  • Wenn dein Fenster größenveränderbar ist, dann sollte es doch unter Windows automatisch funktionieren!?



  • Hallo,

    mein Fenster ist grössenveränderbar aber es tut sich nichts,
    wenn ich die Titelbar an den oberen Rand ziehe.

    Hier noch meine PreCreateWindow Funktion,
    die ist noch unverändert von etwa 2005.

    Die membervariable mFrameRect habe ich damals dazu benutzt
    um über eine Menu das Fenster wieder in voller Grösse anzuzeigen.

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    	if( !CFrameWnd::PreCreateWindow(cs) )
    		return FALSE;
    
    	int fw = GetSystemMetrics (SM_CXSIZEFRAME);
    	int fh = GetSystemMetrics (SM_CYSIZEFRAME);
    	mFrameRect.left = 0;
    	mFrameRect.top = 0;
    	mFrameRect.right = GetSystemMetrics (SM_CXMAXIMIZED) - (2 * fw);
    	mFrameRect.bottom = GetSystemMetrics (SM_CYMAXIMIZED) - (2 * fh);
    
    	cs.dwExStyle &= ~(WS_EX_CLIENTEDGE | WS_THICKFRAME);
    	cs.x = mFrameRect.left;
    	cs.y = mFrameRect.top;
    	cs.cx = mFrameRect.Width ();
    	cs.cy = mFrameRect.Height ();
    
    	cs.lpszName = _T("MX_FinalTuner");
    	cs.style = WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_EX_APPWINDOW;
    
    	return TRUE;
    }
    

    Eventuell verhindert hier ein Style das automatische aufzoomen.

    Gruss
    Walter


  • Mod

    Hier geht es um das maximieren. Das hat nichts mit diesem Verschieben an den oberen Rand zu tun. Geht genauso mit einem Doppelklick auf den Rahmen.

    Also eher die Frage: Hast Du einen Maximize Button. Was hast Du für Handler, die evtl. den Maximize blockieren?



  • Hallo Martin,

    Sorry dass ich so spät antworte, aber ich war mitten in einer Inbetriebnahme.

    Nein, ich habe keinen Maximize Button. Um genauer zu sein, ich habe überhaupt keine Buttons in der Titelleiste.

    Ich habe das ganze MainFrm durchgesehen und nichts entdeckt was diese Buttons ausblendet.

    Gruss
    Walter



  • Ich hab's rausgefunden 😉

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
        if( !CFrameWnd::PreCreateWindow(cs) )
            return FALSE;
    
        int fw = GetSystemMetrics (SM_CXSIZEFRAME);
        int fh = GetSystemMetrics (SM_CYSIZEFRAME);
        mFrameRect.left = 0;
        mFrameRect.top = 0;
        mFrameRect.right = GetSystemMetrics (SM_CXMAXIMIZED) - (2 * fw);
        mFrameRect.bottom = GetSystemMetrics (SM_CYMAXIMIZED) - (2 * fh);
    
        cs.dwExStyle &= ~(WS_EX_CLIENTEDGE | WS_THICKFRAME);
        cs.x = mFrameRect.left;
        cs.y = mFrameRect.top;
        cs.cx = mFrameRect.Width ();
        cs.cy = mFrameRect.Height ();
    
        cs.lpszName = _T("MX_FinalTuner");
        // cs.style = WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_EX_APPWINDOW;
    
        cs.style = WS_OVERLAPPEDWINDOW;
    
        return TRUE;
    }
    

    Und dann noch:

    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
    	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
    		return -1;
    
    	CMenu *pSysMenu = GetSystemMenu	(FALSE);
    	ASSERT (pSysMenu != NULL);
    	VERIFY (pSysMenu->RemoveMenu (SC_CLOSE, MF_BYCOMMAND));
    	ModifyStyle (WS_MINIMIZEBOX, 0, SWP_FRAMECHANGED);
    

    damit das Produktionspersonal nicht unabsichtlich durch herumclicken das Programm beenden kann.

    Gruss
    Walter


  • Mod

    Wenn Du keinen Maximize Button hast, dann ist diese Funktion auch nicht verfügbar... ist doch logisch. Du verbietest den Maximize. Die Operation "Andocken oben" ist aber ein Maximize.



  • Hallo Martin,

    der zuletzt gepostete Code macht aber genau das was ich will 🙂

    - der maximize Button ist aktiv
    - der minimize Button ist disabled
    - der close Button ist disabled
    - ein doppelclick in die Titelzeile oder ziehen an den oberen Rand maximiert das Fenster

    Gruss
    Walter


  • Mod

    Ja. Aber der Grund war der fehlende Maximize-Button.


Log in to reply