Hlavnφ
Hlavnφ strana
Seznam Φlßnk∙
NejΦten∞jÜφ Φlßnky
Progres e-mailem
Visual C++ FAQ

Serißly
COM
ISAPI

banner2.gif (2546 bytes)

Nenechte si ujφt
NeobdΘlnφkovß okna
Tisk bez Preview
MFC a DLL
Logo v MDI ploÜe
Kouzla s kombo-boxem
V²jimky v C++

banner.gif (3305 bytes)

Specißlnφ panel ve stavovΘ °ßdce Jan Odvßrko
11.10.1999
[Hlavnφ strßnka]  |  [Rubrika]

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.

jo_270999_statusbar_obr1.jpg (2672 bytes)

 

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∙.

  • Ready

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.

  • CAP

Indikßtor klßvesy Caps Lock, pokud je klßvesa zapnutß je zobrazen text "CAP".

  • NUM

Indikßtor klßvesy Num Lock, pokud je klßvesa zapnutß je zobrazen text "NUM".

  • SCRL

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.

jo_270999_statusbar_obr2.jpg (23448 bytes)

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.

jo_270999_statusbar_obr3.gif (5681 bytes)

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(25500));
  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∞.

jo_270999_statusbar_obr4.gif (1918 bytes)

 


PodobnΘ Φlßnky: Dynamick² stavov² °ßdek, Kouzla s kombo-boxem dφl 4., Kouzla s kombo-boxem dφl 5.,

Kdo Otßzka nebo p°ipomφnka

Prohlφ₧enφ p°φsp∞vk∙ nebo nov² p°φsp∞vek

O firm∞... Kontakt Ostatnφ