PreCreateWindow



  • 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! 🙂


Anmelden zum Antworten