C/C++ Visual C++ >Статьи
Заставка при запуске приложения (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;
}
}
|