Benutzer mit den meisten Antworten
Fenstereigenschaften des MainFrame bei SDI Anwendung

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
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
-
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
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
-
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
-
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
-
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