PreCreateWindow
-
Hallo!
Also ich habe ein vom Anwendungsassistenten erstelltes SDI-Programm und möchte die Darstellung des Fensters beeinflussen. Eigentlich sollte dies per Bearbeitung von der CREATESTRUCT-STruktur in der Funktion CFrameWnd::PreCreateWindow gehen, tut es auch meistens. Wenn ich aber als cs.style den Wert WS_MINIMIZE /WS_MAXIMIZE benutze, ändert sich rein GAR NIX, und genau das ist die Änderung, die ich brauche. Ist das ein Fehler, oder mache ich was falsch?
-
Hi,
ich habe es so gelöst ( für maximale Größe ), vielleicht gibt es noch etwas besseres, aber das funktioniert bei mir.
cs.cx = ::GetSystemMetrics(SM_CXSCREEN);
cs.cy = ::GetSystemMetrics(SM_CYSCREEN);MfG
Max
-
Mitlerweile weiß ich wie es geht, ist aber komisch. In der InitInstance Funktion der von CWinApp abgeleiteten Klasse gibt es an einer Stelle den Aufruf m_pMainWnd->ShowWindow(SW_SHOW). Ds Argument kann man zu z.B. SW_SHOWMINIMIZED / SW_SHOWMAXIMIZED ändern und schon hat man den geünschten Effekt. Was mich interessiert ist jetzt aber dann der Sinn von PreCreateWindow, wenn man damit eh nur sehr beschränkt Einfluss nehmen kann. Wieso implemetiert die MFC diese Funktion und stattet sie mit einer möglichkeit aus ds Fensteraussehn zu verändern, wenn dies eh nicht funktioniert?
-
PreCreateWindow(...) wird vor(!) der Anzeige des Fensters aufgerufen. Die Anzeige selbst läuft über ShowWindow(...).
Funktion der Elternklasse: Implementierung in winfrm.cpp
-
Man kann an allem rumschrauben, was cs hergibt
Ja, an allem eben nicht, zumindest hats bei mir nicht funktioniert. Wenn ich nämlich für cs.style unter anderem WS_MINIMIZE angebe, so hat dies keine Wirkung. (Das selbe gilt für WS_MAXIMIZE)
Genau Das hat mich ja gewundert, da es ja EIGENTLICH gehen sollte.
-
Hm, bei mir gehts ...
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return FALSE; cs.style |= WS_MAXIMIZE; return TRUE; }
-
@ReneG
Hab den Code mal GENAU so übernommen, wie du ihn da abgetippt hast.. udnes bringt bei mir REIN GAR NIX
-
Zeig mal die Ecke um ShowWindow(...).
-
BOOL CAsdfApp::InitInstance() { AfxEnableControlContainer(); // Standardinitialisierung // Wenn Sie diese Funktionen nicht nutzen und die Größe Ihrer fertigen // ausführbaren Datei reduzieren wollen, sollten Sie die nachfolgenden // spezifischen Initialisierungsroutinen, die Sie nicht benötigen, entfernen. #ifdef _AFXDLL Enable3dControls(); // Diese Funktion bei Verwendung von MFC in gemeinsam genutzten DLLs aufrufen #else Enable3dControlsStatic(); // Diese Funktion bei statischen MFC-Anbindungen aufrufen #endif // Ändern des Registrierungsschlüssels, unter dem unsere Einstellungen gespeichert sind. // ZU ERLEDIGEN: Sie sollten dieser Zeichenfolge einen geeigneten Inhalt geben // wie z.B. den Namen Ihrer Firma oder Organisation. SetRegistryKey(_T("Local AppWizard-Generated Applications")); LoadStdProfileSettings(); // Standard INI-Dateioptionen laden (einschließlich MRU) // Dokumentvorlagen der Anwendung registrieren. Dokumentvorlagen // dienen als Verbindung zwischen Dokumenten, Rahmenfenstern und Ansichten. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CAsdfDoc), RUNTIME_CLASS(CMainFrame), // Haupt-SDI-Rahmenfenster RUNTIME_CLASS(CAsdfView)); AddDocTemplate(pDocTemplate); // Befehlszeile parsen, um zu prüfen auf Standard-Umgebungsbefehle DDE, Datei offen CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Verteilung der in der Befehlszeile angegebenen Befehle if (!ProcessShellCommand(cmdInfo)) return FALSE; // Das einzige Fenster ist initialisiert und kann jetzt angezeigt und aktualisiert werden. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; }
Ist halt der unveränderte, vom Assistenten erstellte Code.
[ Dieser Beitrag wurde am 10.10.2002 um 18:00 Uhr von DerGhost editiert. ]
-
Hier gibt es die Version mit Darstellung 1/n screensize:
(bei Dir n=1 für Vollbild)BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { // Erstellen eines Fensters ohne min-/max-Schaltflächen oder größenveränderbaren Rahmen cs.style = WS_OVERLAPPED | WS_SYSMENU | WS_BORDER ; // Verändern der Fenstergröße auf 1/n der Bildschirmgröße und anschließendes Zentrieren int n = 1; cs.cy = ::GetSystemMetrics(SM_CYSCREEN) / n; cs.cx = ::GetSystemMetrics(SM_CXSCREEN) / n; cs.y = ((cs.cy * n) - cs.cy) / 2; cs.x = ((cs.cx * n) - cs.cx) / 2; // Aufruf der Basisklassenversion return CFrameWnd::PreCreateWindow(cs); }
[ Dieser Beitrag wurde am 10.10.2002 um 22:06 Uhr von Erhard Henkes editiert. ]
-
Diese "Notlösung" war mir schon klar.. trotzdem danke. Was aber bleibt, ist die Frage nach dem WS_MINIMIZE... das kann ich auf diesem Wege ja nicht "simulieren".
[ Dieser Beitrag wurde am 11.10.2002 um 00:18 Uhr von DerGhost editiert. ]
-
'tschuldigung ...
hab noch mal im vom Assistenten erstellten Code nachgeschaut ...Da steht unter InitInstance noch folgendes:
// Das einzige Fenster ist initialisiert und kann jetzt angezeigt und aktualisiert werden. m_pMainWnd->ShowWindow(SW_SHOWMINIMIZED); m_pMainWnd->UpdateWindow();
Hast Du ja auch schon rausgefunden. Der Punkt ist folgender. Das Fenster wird nicht sichtbar erstellt und einige Initialisierungsarbeit geleistet. Das heisst, hier würde zwar WS_MINIMIZE ansprechen, da das Fenster aber nicht sichtbar ist, hat es keinen Effekt.
Dann folgt erst in InitInstance das ShowWindow ... und das überschreibt WS_MINIMIZE !!!Normal erstellt man das Fenster, so dass es gleich sichtbar ist, und dann greift auch PreCreateWindow ordentlich. Da die Erfahrung der Microsoft-Leute allerdings ist, dass es komisch aussieht, wenn sich das Fenster während der Applikations-Initialisierung ganz langsam aufbaut, hat man es gleich versteckt, und ruft ShowWindow später auf!
[ Dieser Beitrag wurde am 11.10.2002 um 08:17 Uhr von RenéG editiert. ]
-
ok, DANKE an euch alle, habs kapiert!