none
Fenstereigenschaften des MainFrame bei SDI Anwendung RRS feed

  • Frage

  • Hallo Forum

    Ich möchte eine SDI Anwendung bauen, die im MainFrame keinen Caption-Bar und auch kein Menü hat. Ich hab daher mal zwei ModifyStyle in die CWinApp::Initinstance Methode reingeschrieben.

            

    C...App::InitInstance() {

    ...

    // Dispatch commands specified on the command line. Will return FALSE if ... // The one and only window has been initialized, so show and update it m_pMainWnd->ModifyStyle(WS_CAPTION,0); // remove caption bar m_pMainWnd->ModifyStyleEx(WS_EX_CLIENTEDGE,0,0); // remove client edge m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); // call DragAcceptFiles only if there's a suffix // In an SDI app, this should occur after ProcessShellCommand // Enable drag/drop open m_pMainWnd->DragAcceptFiles(); return TRUE;

    Das funktioniert zwar grundsätzlich, aber nicht sofort. Wenn ich die Anwendung starte, hat sie einen Caption-Bar. Erst wenn man die Fenstergröße verändert, verschwindet der Caption-Bar und man kann das Fenster nicht mehr zum Verschieben "anfassen".

    Ich hab schon versucht, die Reihenfolge von ShowWindow und UpdateWindow zu vertauschen, aber alles ohne Erfolg.

    Grüße

    FireHeart

    Dienstag, 17. September 2013 10:47

Antworten

  • Schmeiß alle Stile weg und setze WS_POPUP!

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    • Als Antwort markiert Fire-Heart Donnerstag, 19. September 2013 11:45
    Mittwoch, 18. September 2013 13:14
    Moderator
  • Hallo Martin

    Natürlich hab ich einige Kombinationen ausprobiert, aber die Wesentlichen wohl nicht. Du hast natürlich recht, mit dem folgenden Code:

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    	if(cs.hMenu != NULL)  {
               ::DestroyMenu(cs.hMenu);      // delete menu if loaded
               cs.hMenu = NULL;              // no menu for this window
            }
    	if( !CFrameWnd::PreCreateWindow(cs) )
    		return FALSE;
    
    	cs.style = WS_POPUP | WS_BORDER;
    	return TRUE;
    }

    krieg ich das Menü weg und auch der Rahmen und alles andere ist weg (bloß ein zarter, ein-pixel-breiter Rahmen rundherum).

    Danke

    FireHeart


    • Bearbeitet Fire-Heart Donnerstag, 19. September 2013 11:45
    • Als Antwort markiert Fire-Heart Donnerstag, 19. September 2013 11:45
    Donnerstag, 19. September 2013 11:44

Alle Antworten

  • 1. Kannst Du den Stil des Fensters bereits in PreCreateWindow des Mainframes manipulieren.

    2. Ohne Caption kann man ein Fenster eben nicht verschieben. Das ist nun mal so. Wenn Du da Abhilfe schafen willst must Du WM_NCHITTEST bearbeiten und für irgend einen Bereich HTCAPTION zurückgeben, der für das Ziehen des Fensters dienen soll.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    Mittwoch, 18. September 2013 09:37
    Moderator
  • Hallo Martin

    Genau das hab ich auch versucht, aber ohne Erfolg:

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    	if( !CFrameWnd::PreCreateWindow(cs) )
    		return FALSE;
    
    	// TODO: Modify the Window class or styles here by modifying
    	//  the CREATESTRUCT cs
    	cs.style     &= 0xFFFFFFFF ^ WS_CAPTION;
    	cs.dwExStyle &= 0xFFFFFFFF ^ WS_EX_CLIENTEDGE;
    	
    	return TRUE;
    }

    Ich hab's auch vor dem Aufruf von CFrameWnd::PreCreateWindow versucht...auch ohne Erfolg. Ich kann in cs.style reinschreiben was ich will, es ist ihm einfach egal...

    Die Sache mit dem Fenster nicht verschieben können war nur informatives Beiwerk. Ich will ja gerade, dass niemand mein Fenster verschieben kann. Das hätte ja so gepasst, aber wie gesagt, erst nachdem ich an dem Fenster herummanipuliert habe (Größe ändern). Offenbar fehlt ihm ein Redraw nachdem ich die Styles verändert habe.

    Grüße

    FireHeart


    • Bearbeitet Fire-Heart Mittwoch, 18. September 2013 10:34
    Mittwoch, 18. September 2013 10:31
  • Schmeiß alle Stile weg und setze WS_POPUP!

    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de

    • Als Antwort markiert Fire-Heart Donnerstag, 19. September 2013 11:45
    Mittwoch, 18. September 2013 13:14
    Moderator
  • Hallo Martin

    Natürlich hab ich einige Kombinationen ausprobiert, aber die Wesentlichen wohl nicht. Du hast natürlich recht, mit dem folgenden Code:

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
    	if(cs.hMenu != NULL)  {
               ::DestroyMenu(cs.hMenu);      // delete menu if loaded
               cs.hMenu = NULL;              // no menu for this window
            }
    	if( !CFrameWnd::PreCreateWindow(cs) )
    		return FALSE;
    
    	cs.style = WS_POPUP | WS_BORDER;
    	return TRUE;
    }

    krieg ich das Menü weg und auch der Rahmen und alles andere ist weg (bloß ein zarter, ein-pixel-breiter Rahmen rundherum).

    Danke

    FireHeart


    • Bearbeitet Fire-Heart Donnerstag, 19. September 2013 11:45
    • Als Antwort markiert Fire-Heart Donnerstag, 19. September 2013 11:45
    Donnerstag, 19. September 2013 11:44