Sdílet prostřednictvím


Obslužné rutiny pro oblasti map zpráv

Tento článek vysvětluje, jak mapovat rozsah zpráv na jednu funkci obslužné rutiny zprávy (místo mapování jedné zprávy pouze na jednu funkci).

Někdy je potřeba zpracovat více než jednu zprávu nebo řídit oznámení úplně stejným způsobem. V takových případech můžete chtít namapovat všechny zprávy na jednu funkci obslužné rutiny. Rozsahy map zpráv umožňují tuto akci provést u souvislého rozsahu zpráv:

  • Rozsahy ID příkazů můžete mapovat na:

    • Funkce obslužné rutiny příkazu.

    • Funkce obslužné rutiny aktualizace příkazu.

  • Zprávy oznámení ovládacích prvků můžete mapovat pro řadu ID ovládacích prvků na funkci obslužné rutiny zprávy.

Témata probíraná v tomto článku zahrnují:

Zápis položky mapy zpráv

V sadě . Soubor CPP přidejte položku mapy zpráv, jak je znázorněno v následujícím příkladu:

ON_COMMAND_RANGE(ID_MYCMD_ONE, ID_MYCMD_TEN, &OnDoSomething)

Položka mapy zpráv se skládá z následujících položek:

  • Makro rozsahu mapy zpráv:

  • Parametry makra:

    První dvě makra mají tři parametry:

    • ID příkazu, které spouští oblast

    • ID příkazu, které končí oblast

    • Název funkce obslužné rutiny zprávy

    Rozsah ID příkazů musí být souvislý.

    Třetí makro přebírá ON_CONTROL_RANGEdalší první parametr: zprávu s oznámením o ovládacím prvku, například EN_CHANGE.

Deklarace funkce obslužné rutiny

Přidejte deklaraci funkce obslužné rutiny do souboru . H soubor. Následující kód ukazuje, jak to může vypadat, jak je znázorněno níže:

public:
   afx_msg void OnDoSomething(UINT nID);

Funkce obslužné rutiny pro jednotlivé příkazy obvykle neobsahují žádné parametry. S výjimkou funkcí obslužné rutiny aktualizace vyžadují funkce obslužné rutiny pro rozsahy map zpráv další parametr, nID typu UINT. Tento parametr je prvním parametrem. Dodatečný parametr se přizpůsobí ID dalšího příkazu potřebného k určení příkazu, který uživatel skutečně zvolil.

Další informace o požadavcích na parametry pro aktualizaci funkcí obslužné rutiny naleznete v tématu Příklad rozsahu ID příkazů.

Příklad rozsahu ID příkazů

Pokud byste mohli použít rozsahy, jeden příklad je v zpracování příkazů, jako je například příkaz Lupa v ukázce KNIHOVNY MFC HIERSVR. Tento příkaz zobrazení zvětšuje, zvětšuje ho mezi 25 % a 300 % jeho normální velikosti. Třída zobrazení HIERSVR používá rozsah ke zpracování příkazů lupy pomocí položky mapy zpráv, která se podobá tomuto:

ON_COMMAND_RANGE(ID_VIEW_ZOOM25, ID_VIEW_ZOOM300, &OnZoom)

Při zápisu položky mapy zpráv zadáte:

  • Dvě ID příkazů, začátek a ukončení souvislé oblasti

    Tady jsou ID_VIEW_ZOOM25 a ID_VIEW_ZOOM300.

  • Název funkce obslužné rutiny pro příkazy.

    Tady je to OnZoom.

Deklarace funkce by vypadala takto:

public:
   afx_msg void OnZoom(UINT nID);

Případ funkcí obslužné rutiny aktualizace je podobný a pravděpodobně bude užitečnější. Je docela běžné psát ON_UPDATE_COMMAND_UI obslužné rutiny pro řadu příkazů a najít sami sebe psaní nebo kopírování, stejný kód pořád a znovu. Řešením je namapovat rozsah ID příkazů na jednu funkci obslužné rutiny ON_UPDATE_COMMAND_UI_RANGE aktualizace pomocí makra. ID příkazů musí tvořit souvislou oblast. Příklad najdete OnUpdateZoom v obslužné rutině a její ON_UPDATE_COMMAND_UI_RANGE položce mapy zpráv ve třídě zobrazení ukázky HIERSVR.

Funkce obslužné rutiny aktualizace pro jednotlivé příkazy obvykle přebírají jeden parametr pCmdUI typu CCmdUI*. Na rozdíl od funkcí obslužné rutiny funkce obslužné rutiny pro rozsahy map zpráv nevyžadují dodatečný parametr nID typu UINT. ID příkazu, které je potřeba k určení, který příkaz uživatel skutečně zvolil, se nachází v objektu CCmdUI .

Příklad rozsahu ID ovládacích prvků

Dalším zajímavým případem je mapování zpráv oznámení ovládacích prvků pro řadu ID ovládacích prvků na jednu obslužnou rutinu. Předpokládejme, že uživatel může kliknout na libovolné z 10 tlačítek. Pokud chcete namapovat 10 tlačítek na jednu obslužnou rutinu, položka mapy zpráv by vypadala takto:

ON_CONTROL_RANGE(BN_CLICKED, IDC_BUTTON1, IDC_BUTTON10, OnButtonClicked)

Při psaní ON_CONTROL_RANGE makra v mapě zpráv zadáte:

  • Konkrétní zpráva s oznámením o ovládacím prvku.

    Tady je to BN_CLICKED.

  • Hodnoty ID ovládacího prvku přidružené k souvislé oblasti ovládacích prvků.

    Tady jsou IDC_BUTTON1 a IDC_BUTTON10.

  • Název funkce obslužné rutiny zprávy.

    Tady je to OnButtonClicked.

Při psaní funkce obslužné rutiny zadejte další parametr UINT , jak je znázorněno v následujícím příkladu:

void CRangesView::OnButtonClicked(UINT nID)
{
   int nButton = nID - IDC_BUTTON1;
   ASSERT(nButton >= 0 && nButton < 10);
   // ...
}

Obslužná rutina OnButtonClicked jedné zprávy BN_CLICKED nepřijímá žádné parametry. Stejná obslužná rutina pro rozsah tlačítek přebírá jeden UINT. Dodatečný parametr umožňuje identifikovat konkrétní ovládací prvek zodpovědný za generování BN_CLICKED zprávy.

Kód uvedený v příkladu je typický: převedení hodnoty předané do int rozsahu zpráv a tvrzení, že se jedná o tento případ. Pak můžete provést nějakou jinou akci v závislosti na tom, na kterém tlačítku jste klikli.

Viz také

Deklarace funkcí obslužných rutin zpráv