InfoCity
InfoCity - виртуальный город компьютерной документации
Реклама на сайте







Размещение сквозной ссылки

 

Заставка при запуске приложения (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>


Реклама на InfoCity

Яндекс цитирования



Финансы: форекс для тебя








1999-2009 © InfoCity.kiev.ua