Привет Артем. Решил принять участие в организации "Русского MSDN". Посылаю пример создания заставки при загрузке приложения. SLY - sly@vmz.nnov.ru Спасибо большое. Вот мое описание а исходные код загрузите из проекта. Там все что прислал SLY.
Я просто сделаю комментарии к коду написанного SLY, оставив так как есть. Давайте смотреть. Создано приложение на базе диалогового окна, для которого и должна появляться заставка. Сам класс заставки порожден от класса 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 (sly@vmz.nnov.ru).