Заставка при запуску додатка (Spash Screen)

SLY, CodeNet

Давайте дивитися. Створено додаток на базі діалогового вікна, для якого і повинна з’являтися заставка. Сам клас заставки породжений від класу 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>


Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*