Splash screens
Richard Steadman -- rsteadma@mmltd.com Tuesday, July 16, 1996 Environment: VC++ 1.5 / Win 95 Hi. Is there an easy way to implement a splash screen with MFC? I tried to copy from the Superpad example with VC 1.5, but I ended up creating a child window of an invisible window (I think). When minimized, the window went to the bottom left corner of the screen, not the bar at the bottom of the screen in Win95. Thanks, Richard Steadman rsteadma@micromedia.on.ca Here's the InitInstance function as I tried it: BOOL CSplashApp::InitInstance() { SetDialogBkColor(); CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CSplashDoc), RUNTIME_CLASS(CMainFrame), // main SDI frame window RUNTIME_CLASS(CSplashView)); AddDocTemplate(pDocTemplate); // create main window CMainFrame* pMainFrame = new CMainFrame; if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE; m_pMainWnd = pMainFrame; int nCmdShow = m_nCmdShow; // setup main window nCmdShow = SW_HIDE; m_nCmdShow = SW_HIDE; // ((CMainFrame*)m_pMainWnd)->InitialShowWindow(nCmdShow); ((CMainFrame*)m_pMainWnd)->ShowWindow(nCmdShow); m_pMainWnd->UpdateWindow(); if (!m_pMainWnd->IsIconic() && !m_lpCmdLine[0] && m_splash.Create(m_pMainWnd)) { m_splash.ShowWindow(SW_SHOW); m_splash.UpdateWindow(); } sleep(1); // Wait one second m_splash.DestroyWindow(); OnFileNew(); return TRUE; }
Chandra Venkatraman -- chandru@fcpl.co.in Sunday, July 21, 1996 [Mini-digest: 2 responses] [Moderator's note: Since he specified VC++ 1.5, I tossed the VC++ 4.x specific solutions.] ---------- > From: Richard Steadman> To: mfc-l@netcom.com > Subject: Splash screens > Date: Tuesday, July 16, 1996 11:05 PM > > Environment: VC++ 1.5 / Win 95 > > Hi. > > Is there an easy way to implement a splash screen with MFC? I tried to > copy from the Superpad example with VC 1.5, but I ended up creating a > child window of an invisible window (I think). When minimized, the > window went to the bottom left corner of the screen, not the bar at the > bottom of the screen in Win95. > > Thanks, > Richard Steadman > rsteadma@micromedia.on.ca > > Here's the InitInstance function as I tried it: > > BOOL CSplashApp::InitInstance() > { > SetDialogBkColor(); > CSingleDocTemplate* pDocTemplate; > pDocTemplate = new CSingleDocTemplate( > IDR_MAINFRAME, > RUNTIME_CLASS(CSplashDoc), > RUNTIME_CLASS(CMainFrame), // main SDI frame window > RUNTIME_CLASS(CSplashView)); > AddDocTemplate(pDocTemplate); > > // create main window > CMainFrame* pMainFrame = new CMainFrame; > if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) > return FALSE; > m_pMainWnd = pMainFrame; > int nCmdShow = m_nCmdShow; > > // setup main window > nCmdShow = SW_HIDE; > m_nCmdShow = SW_HIDE; > // ((CMainFrame*)m_pMainWnd)->InitialShowWindow(nCmdShow); > ((CMainFrame*)m_pMainWnd)->ShowWindow(nCmdShow); > > m_pMainWnd->UpdateWindow(); > > if (!m_pMainWnd->IsIconic() && !m_lpCmdLine[0] && m_splash.Create(m_pMainWnd)) { > m_splash.ShowWindow(SW_SHOW); > m_splash.UpdateWindow(); > } > sleep(1); // Wait one second > m_splash.DestroyWindow(); > OnFileNew(); > return TRUE; > } You Donot Use sleep(1) or any such code to Stop Windows from Loading the Parent. You must override the "OnIdle" Function of the App. In your OnIdle Loop Setup a Timer for the time interval for which you would like the Splash Window to appear. If the time limit is reached, Destroy the Splash Window and Enable the MainFrame Hope this Helps Happ MFC Prog Chandru Chandrasekar Venkataraman ---------------------------------------------------------------------------- ---------------------- Residence : Office : Room no. 19, Frontier Computers (P) Ltd. J.P.Trivedi Guest House, Vastu Chambers, IInd Floor, Ghole Road, 1202/39, Shirole Road, Shivaji Nagar, Shivaji Nagar, Pune - 411005 Pune - 411004 Tel : (0212) - 323474 Tel : (0212) - 321536 ---------------------------------------------------------------------------- ---------------------- "Results! Why, man, I have gotten a lot of results. I know several thousand things that won't work." Thomas A. Edison ---------------------------------------------------------------------------- ---------------------- -----From: sja@gte.net What I've done before is to make the CAboutdlg become the splash screen. Add some code to the InitDialog function to start a timer which closes the dialog when it expires, add some code to the constructor which sets a flag indicating whether or not to splash: --- in MyApp.h (manually moved here from MyApp.cpp AppWizard): ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(BOOL splashflg); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // Implementation BOOL m_bSplash; // True if splashing, False if direct UINT m_nTimer; // splash autoclose dialog timer virtual BOOL OnInitDialog(); protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //{{AFX_MSG(CAboutDlg) afx_msg void OnTimer(UINT nIDEvent); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; --- in MyApp.cpp, InitInstance(): // splash the about dialog CAboutDlg aboutDlg(TRUE); aboutDlg.DoModal(); --- in MyApp.cpp, App Commands: // App command to run the dialog void CMyApp::OnAppAbout() { // normal about dialog CAboutDlg aboutDlg(FALSE); aboutDlg.DoModal(); } --- in MyApp.cpp, CAboutdlg: ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About CAboutDlg::CAboutDlg(BOOL splashflg) : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT m_bSplash = splashflg; } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) ON_WM_TIMER() //}}AFX_MSG_MAP END_MESSAGE_MAP() BOOL CAboutDlg::OnInitDialog() { CDialog::OnInitDialog(); CenterWindow(); if (m_bSplash) { // hide the OK button GetDlgItem(IDOK)->ShowWindow(SW_HIDE); // start a timer that will eventually kill this dialog m_nTimer = CWnd::SetTimer(1, 2000, (TIMERPROC)NULL); } return TRUE; // return TRUE unless you set the focus to a control } ///////////////////////////////////////////////////////////////////////////// // CMyApp commands void CAboutDlg::OnTimer(UINT nIDEvent) { if (m_nTimer) CWnd::KillTimer(1); CDialog::OnOK(); } --- Steven J. Ackerman, Consultant ACS, Sarasota, FL sja@gte.net http://www.acscontrol.com
Mike Morel -- mmorel@mushroomsoft.com Wednesday, July 31, 1996 There is a CSplasher class in the MFC For Yourself preview issue from April, 1995. You can download it by going to http://www.mushroomsoft.com/mushroom and navigating down to the MFC For Yourself previews. The parent window creates the CSplasher on the heap, passing to the destructor how long the splash window should exist. After that, CSplasher takes care of everything. It sets a timer and / or reacts to a user click, destroys the window when appropriate, and evens deletes itself (the C++ object). It's very easy to use, and you can examine the code to see how it works. Mike Morel Mushroom Software At 01:35 PM 7/16/96 -0400, you wrote: > Environment: VC++ 1.5 / Win 95 > >Hi. > >Is there an easy way to implement a splash screen with MFC? I tried to >copy from the Superpad example with VC 1.5, but I ended up creating a >child window of an invisible window (I think). When minimized, the >window went to the bottom left corner of the screen, not the bar at the >bottom of the screen in Win95. > >Thanks, >Richard Steadman >rsteadma@micromedia.on.ca > >Here's the InitInstance function as I tried it: > >BOOL CSplashApp::InitInstance() >{ > SetDialogBkColor(); > CSingleDocTemplate* pDocTemplate; > pDocTemplate = new CSingleDocTemplate( > IDR_MAINFRAME, > RUNTIME_CLASS(CSplashDoc), > RUNTIME_CLASS(CMainFrame), // main SDI frame window > RUNTIME_CLASS(CSplashView)); > AddDocTemplate(pDocTemplate); > > // create main window > CMainFrame* pMainFrame = new CMainFrame; > if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) > return FALSE; > m_pMainWnd = pMainFrame; > int nCmdShow = m_nCmdShow; > > // setup main window > nCmdShow = SW_HIDE; > m_nCmdShow = SW_HIDE; > // ((CMainFrame*)m_pMainWnd)->InitialShowWindow(nCmdShow); > ((CMainFrame*)m_pMainWnd)->ShowWindow(nCmdShow); > > m_pMainWnd->UpdateWindow(); > > if (!m_pMainWnd->IsIconic() && !m_lpCmdLine[0] && m_splash.Create(m_pMainWnd)) { > m_splash.ShowWindow(SW_SHOW); > m_splash.UpdateWindow(); > } > sleep(1); // Wait one second > m_splash.DestroyWindow(); > OnFileNew(); > return TRUE; >} > > > > Mike Morel Mushroom Software mmorel@mushroomsoft.com 216-659-4743
| Вернуться в корень Архива |