CodeNet / Языки программирования / C / C++ / Microsoft Visual C++ / FAQ - Часто задаваемые вопросы / Visual C++ FAQ
Заставка при запуске приложения (Spash Screen).
Заставка при запуске приложения (Spash Screen).
Давайте смотреть. Создано приложение на базе диалогового окна, для которого и должна появляться заставка. Сам класс заставки порожден от класса CWnd.
class CGRSplashWin : public CWnd { // Construction public: CGRSplashWin(); BOOL Create(CWnd* pParent); // Attributes public: // Operations public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CGRSplashWin) protected: virtual BOOL PreCreateWindow(CREATESTRUCT& cs); //}}AFX_VIRTUAL // Implementation public: virtual ~CGRSplashWin(); // Generated message map functions protected: //{{AFX_MSG(CGRSplashWin) afx_msg BOOL OnEraseBkgnd(CDC* pDC); //}}AFX_MSG DECLARE_MESSAGE_MAP() };
Сама реализация класса довольно проста. Интересным моментом является получение фона окна реализованного в функции OnEraseBkgnd.
BOOL CGRSplashWin::OnEraseBkgnd(CDC* pDC) { ////////////////////////////////////////////////////////// //создадим фон представления ////////////////////////////////////////////////////////// BITMAP m_bkparam; CBitmap m_bkview; CBitmap* m_oldbkview; CDC m_memDC; RECT rect; m_bkview.LoadBitmap(IDB_BKVIEW); m_bkview.GetObject(sizeof(m_bkparam),&m_bkparam); m_memDC.CreateCompatibleDC(pDC); m_oldbkview=m_memDC.SelectObject(&m_bkview); GetClientRect(&rect); //количество строк и столбцов для представления int NumRows=(int)(rect.bottom/m_bkparam.bmHeight); int NumCols=(int)(rect.right/m_bkparam.bmWidth); //заполнить всю рабочую область представления for (int row=0;rowBitBlt(col*m_bkparam.bmWidth, row*m_bkparam.bmHeight,m_bkparam.bmWidth, m_bkparam.bmHeight,&m_memDC,0,0,SRCCOPY); SelectObject(m_memDC,m_oldbkview); return 1; }
Вот главный вопрос - это когда заставку надо создать и когда удалить. Создаем мы ее в классе приложения используя функцию InitInstance.
BOOL CSplashWinApp::InitInstance() { ............ #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic();// Call this when linking to MFC statically #endif ////////////////////////////////////////////// //показать заставку //уничтожить ее при активизации диалога //WM_ACTIVATE ////////////////////////////////////////////// m_wndSplash = new CGRSplashWin(); m_wndSplash->Create(m_wndSplash->FromHandle(GetDesktopWindow())); m_wndSplash->ShowWindow(SW_NORMAL); CSplashWinDlg dlg; m_pMainWnd = &dlg; ..............
Сам класс заставки объявлен в классе приложения
class CSplashWinApp : public CWinApp { public: CSplashWinApp(); CGRSplashWin *m_wndSplash; ...............
А удаляется заставка в классе диалога при его активации.
void CSplashWinDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized) { CDialog::OnActivate(nState, pWndOther, bMinimized); //////////////////////////////////////////// //сделаем задержку а то вдруг не увидим //если прога быстро загружается //////////////////////////////////////////// Sleep(1000); if (((CSplashWinApp*)AfxGetApp())->m_wndSplash!=NULL) { delete ((CSplashWinApp*)AfxGetApp())->m_wndSplash; ((CSplashWinApp*)AfxGetApp())->m_wndSplash=NULL; } }
Вот у кого остались вопросы грузите проект и пишите SLY. <sly@vmz.nnov.ru>