SDB>Если я Вас правильно понял, то нечто подобное реализовано у меня в UpdateIt! на стадии обработки файлов — там и анимация и прогресс-бары. Правда, там это все на property-page'ах делается, но они суть диалоговые окна. "Ключевым" являются методы CBetterPropPage::OnSetActive() и CBetterPropPage::ActivationWatcher().
Метод, о котором Вы написали, приминим в большей степени для страниц свойств. С "диалогами", как мне кажется, все по-другому.
Для наглядности и более полного восприятия привиду свой код (на недостатки внимание прошу не обращать, ведь этот код только для
выявления причины):
Объявление класса диалога:
class CMyDlg : public CDialog
{
...
// Dialog Data
//{{AFX_DATA(CSearchBluetoothDlg)
enum { IDD = IDD_MY_DIALOG };
CAnimateCtrl m_AnimateCtrl;
//}}AFX_DATA
...
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CMyDlg)
virtual void OnCancel();
//}}AFX_MSG
afx_msg void OnActivate(UINT, CWnd*, BOOL);
DECLARE_MESSAGE_MAP()
// Эта переменная нужна ждя того, чтобы функция поиска вызывалась
// только один раз за время существования окна
BOOL m_bRunSearch;
void OnMyBeginEnd(WPARAM, LPARAM);
void SearchDevice();
};
Реализация:
static const UINT WM_MYBEGINEND = RegisterWindowMessage("IDD_MY_DIALOG");
HANDLE g_hThread;
DWORD __stdcall ThreadProc(LPVOID pVoid)
{
const HWND hWnd = reinterpret_cast<HWND> (pVoid);
if (IsWindow(hWnd)) SendMessage(hWnd, WM_MYBEGINEND, TRUE, 0);
return 0L;
}
/////////////////////////////////////////////////////////////////////////////
// CSearchBluetoothDlg dialog
CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMyDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CMyDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_bRunSearch = FALSE; // поиск не производился
}
BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
//{{AFX_MSG_MAP(CMyDlg)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_ACTIVATE, OnActivate)
ON_REGISTERED_MESSAGE(WM_MYBEGINEND, OnMyBeginEnd)
END_MESSAGE_MAP()
// В этом потоке запускается открытие и проигрывание avi-ресурса.
// НО НАЧИНАЯ С МОМЕНТА ПОЯВЛЕНИЯ ОКНА И НАЧАЛОМ АНИМАЦИИ
// ПРОХОДИТ 5 СЕКУНД
void CMyDlg::OnMyBeginEnd(WPARAM wParam, LPARAM lParam)
{
if ((BOOL) wParam)
{
m_AnimateCtrl.Open(IDR_SEARCH);
m_AnimateCtrl.Play(0, -1, -1);
TRACE0("****** Run\n");
}
}
/////////////////////////////////////////////////////////////////////////////
// CSearchBluetoothDlg message handlers
void CMyDlg::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized)
{
CDialog::OnActivate(nState, pWndOther, bMinimized);
if (nState == WA_ACTIVE && m_bRunSearch == FALSE)
{
m_bRunSearch = TRUE; // больше не запускать
// запускаем поток, который проигрывает avi-ресурс
g_hThread = CreateThread(NULL, 0, ThreadProc,(LPVOID) m_hWnd, 0, 0);
// начинаем поиск устройств
SearchDevice();
}
}
void CMyDlg::OnCancel()
{
m_AnimateCtrl.Stop();
m_AnimateCtrl.Close();
if (g_hThread) CloseHandle(g_hThread);
CDialog::OnCancel();
}
По идее вся анимация должна работать без тормозов, но как оказывается на практике........
Буду рад если появятся еще идеи