Сама реализация класса довольно проста. Интересным моментом является получение фона окна реализованного в функции 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>