BOOL CStatusbarAnimate::Create(
UINT nIDanimation, int nPane /*=1*/ )
{
CStatusBar *pStatusBar = GetStatusBar();
if (!pStatusBar)
return FALSE;
Als Stil setzt die Methode
DWORD dwStyle = WS_CHILD | WS_VISIBLE |
ACS_AUTOPLAY | ACS_TRANSPARENT | ACS_CENTER;
Die Koordinaten des betroffenen Panel-Rechtecks liefert:
CRect paneRect;
pStatusBar->GetItemRect(nPane, &paneRect);
paneRect.InflateRect(-1,-1);
Nach diesen Vorbereitungen kann die Control über die ererbte Methode Create() erzeugt werden.
if (!CAnimateCtrl::Create( dwStyle, paneRect, pStatusBar, 0 ))
return FALSE;
Abschließend wird der Panelindex übernommen und das Fenster in seiner Größe angepaßt. Den Rückgabewert der Methode definiert dann der Aufruf von Open() mit der Ressourcen-ID als Parameter.
m_nPane = nPane;
Resize();
return Open( nIDanimation );
}
Einen Zeiger auf die Statusbar liefert die Methode GetStatusBar(), die allerdings dann, wenn das Hauptfenster ein FrameWindow ist, auf die normalen Funktionen zurückgreift.
CStatusBar* CStatusbarAnimate::GetStatusBar()
{
CWnd *pMainWnd = AfxGetMainWnd();
if (!pMainWnd)
return NULL;
if (pMainWnd->IsKindOf(RUNTIME_CLASS(CFrameWnd)))
{
CWnd* pMessageBar = ((CFrameWnd*)pMainWnd)->GetMessageBar();
return DYNAMIC_DOWNCAST(CStatusBar, pMessageBar);
}
Ist das Hauptfenster kein FrameWindow, durchläuft die Methode die Liste der Kindfenster und sucht nach einer Statuszeile.
else return DYNAMIC_DOWNCAST(
CStatusBar,
pMainWnd->GetDescendantWindow(AFX_IDW_STATUS_BAR));
}
Der Event-Handler für das Ereignis OnEraseBkgnd() stellt sicher, daß das Panelsegment auf die richtige Größe gesetzt ist, bevor der geerbte Event-Handler aufgerufen wird.
|