1. ┌vod
Asi mi dßte za pravdu, ₧e Stavov² °ßdek (StatusBar) je stejn∞ d∙le₧itß souΦßst
aplikace jako nap°φklad Nßstrojovß liÜta (ToolBar). AvÜak pokud prostudujeme knihovnu MFC zjistφme, ₧e Stavov²
°ßdek nemß zdaleka takovΘ grafickΘ mo₧nosti jako zmφn∞nß Nßstrojovß liÜta.
Uka₧me si tedy jak²m zp∙sobem m∙₧eme sami vykreslit obsah panelu ve stavovΘm
°ßdku.
2. Stavov² °ßdek vs. MFC
Standardnφ stavov² °ßdek je zobrazen na
p°edchßzejφcφm obrßzku. Takto jej m∙₧ete vid∞t nap°φklad v MDI aplikaci, kterß
je vygenerovanß pomocφ AppWizardu. Tento °ßdek se sklßdß ze Φty° panel∙.
|
Tento panel nemß
prostorov² rßmeΦek a slou₧φ pro zobrazenφ nßpov∞dy k polo₧kßm menu a
tlaΦφtk∙m v nßstrojovΘ liÜt∞. Standardn∞ zabφrß zb²vajφcφ plochu celΘho
stavovΘho °ßdku. |
|
Indikßtor klßvesy Caps Lock,
pokud je klßvesa zapnutß je zobrazen text "CAP". |
|
Indikßtor klßvesy Num Lock,
pokud je klßvesa zapnutß je zobrazen text "NUM". |
|
Indikßtor klßvesy Scroll Lock,
pokud je klßvesa zapnutß je zobrazen text "SCRL". |
Stavov² °ßdek je v
knihovn∞ MFC reprezentovßn t°φdou CStatusBar.
Tato t°φda umo₧≥uje vytvß°et panely a nastavovat jim text. Za vytvo°enφ °ßdku je
obvykle odpov∞dnß t°φda CMainFrame. V
implementaΦnφm souboru (.CPP) tΘto t°φdy je jeÜt∞ umφst∞no pole, kterΘ definuje
jednotlivΘ panely. Podφvejme se na nßsledujφcφ zdrojov² k≤d.
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
|
Pole urΦuje poΦet panel∙ ve stavovΘm °ßdku a
ka₧dΘmu panelu p°i°azuje jednoznaΦn² identifikßtor (ID). Jak uvidφme pozd∞ji
p°idßnφ panelu se provede p°idßnφm polo₧ky do tohoto pole. Vytvo°enφ stavovΘho °ßdku se provßdφ v metod∞ OnCreate ve t°φd∞ CMainFrame.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
...
}
|
Jak je vid∞t z ukßzky
zdrojovΘho k≤du, nejd°φve se volß metoda Create, kterß Stavov² °ßdek vytvo°φ a nßsledn∞ jsou vytvo°eny
panely volßnφm metody SetIndicators.
3. Stavov² °ßdek vs. MFC
NaÜφm prvnφm ·kolem bude vlo₧enφ novΘho
panelu do StavovΘ °ßdky. Pokud jeÜt∞ nemßte p°ipraven² projekt, tak pomocφ AppWizardu vygenerujte MDI aplikaci (nenφ
t°eba m∞nit ₧ßdnΘ nastavenφ). Do tabulky °et∞zc∙ (string table) vlo₧φme novou polo₧ku jejφ₧ jmΘno bude ID_INDICATOR_NEW.
V
implementaΦnφm souboru t°φdy CMainFrame rozÜφ°φme pole indicators o nov∞ vzniklΘ ID.
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_NEW, // Nov² panel
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
|
Pokud p°elo₧φte a spustφte bude Stavovß liÜta
vypadat nßsledovn∞. VÜimn∞te si, ₧e Üφ°ka vlo₧enΘho panelu je odvozena od
Üφ°ky textu.
Nastavenφ textu v panelu
provedeme pomocφ metody SetPaneText ze t°φdy CStatusBar. Pokud chceme zjistit jak² text se v panelu nachßzφ pou₧ijeme
metodu GetPaneText.
BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText,
BOOL bUpdate = TRUE );
CString GetPaneText( int nIndex ) const;
|
3. Vykreslenφ panelu
Proto₧e t°φda CStatusBar nßm nedßvß mo₧nost zm∞nit vizußlnφ vzhled panelu
(krom∞ zm∞ny prostorovΘho rßmeΦku), zkusφme si obsah panelu vykreslit sami. Pomocφ ClassWizardu vygenerujte novou
t°φdu CMyStatusBar, kterß bude d∞dit ze
t°φdy CStatusBar. V tΘto t°φd∞
implementujte virtußlnφ metodu DrawItem. Tato metoda je automaticky
volßna pro vykreslenφ jednoho panelu. V naÜem p°φpad∞
vykreslφme panel p°idan² v p°edchozφ kapitole (jeho index je 1).
class CMyStatusBar : public CStatusBar
{
...
virtual void DrawItem(LPDRAWITEMSTRUCT lpdis);
...
};
void CMyStatusBar::DrawItem(LPDRAWITEMSTRUCT lpdis)
{
ASSERT(lpdis->itemID == 1);
CDC* pdc = CDC::FromHandle(lpdis->hDC);
CRect rcItem(lpdis->rcItem);
int nBkMode = pdc->SetBkMode(TRANSPARENT);
COLORREF nBkColor = pdc->GetBkColor();
pdc->FillSolidRect(rcItem, RGB(255, 0, 0));
pdc->DrawText(GetPaneText(1),
rcItem, DT_SINGLELINE|DT_CENTER|DT_VCENTER);
pdc->SetBkMode(nBkMode);
pdc->SetBkColor(nBkColor);
}
|
Pokud mßme t°φdu sprßvn∞ p°ipravenou, m∙₧eme
p°istoupit k jejφ u pou₧itφ. Ve t°φd∞ CMainFrame zm∞nφme typ prom∞nnΘ m_wndStatusBar.
class CMainFrame : public CMDIFrameWnd
{
...
protected: // control bar embedded members
CMyStatusBar m_wndStatusBar;
CToolBar m_wndToolBar;
...
};
|
Poslednφm krokem je nastavenφ
specißlnφho stylu, kter² zajistφ volßnφ metody DrawItem tφmto stylem je SBT_OWNERDRAW, kter² se nastavuje ka₧dΘmu panelu zvlßÜ¥. My tento styl
nastavφme naÜemu novΘmu panelu. Nastavenφ se provßdφ v metod∞ OnCreate ve t°φd∞ CMainFrame.
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
UINT nID, nStyle;
int cxWidth;
m_wndStatusBar.GetPaneInfo(1, nID, nStyle, cxWidth);
m_wndStatusBar.SetPaneInfo(1, nID, nStyle|SBT_OWNERDRAW,
cxWidth);
return 0;
}
|
Pokud vÜe sprßvn∞
naprogramujete a p°elo₧φte m∞l by Stavov² °ßdek vypadat nßsledovn∞.
|