Sdílet prostřednictvím


Makra map zpráv (MFC)

Pro podporu map zpráv poskytuje mfc následující makra:

Deklarace mapy zpráv a demarcation makra

Název Popis
DECLARE_MESSAGE_MAP Deklaruje, že mapa zpráv bude použita ve třídě k mapování zpráv na funkce (musí být použita v deklaraci třídy).
BEGIN_MESSAGE_MAP Začíná definice mapy zpráv (musí být použita v implementaci třídy).
BEGIN_TEMPLATE_MESSAGE_MAP Začíná definice mapy zpráv u typu třídy obsahujícího jeden argument šablony.
END_MESSAGE_MAP Ukončí definici mapy zpráv (musí být použita v implementaci třídy).

Makra mapování zpráv

Název Popis
ON_COMMAND Určuje, která funkce zpracuje zadanou zprávu příkazu.
ON_COMMAND_EX Určuje, která funkce zpracuje zadanou zprávu příkazu.
ON_CONTROL Určuje, která funkce zpracuje zadanou zprávu s oznámením o ovládacím prvku.
ON_MESSAGE Určuje, která funkce bude zpracovávat uživatelem definovanou zprávu.
ON_OLECMD Určuje, která funkce zpracuje příkaz nabídky z Objektu DocObject nebo jeho kontejneru.
ON_REGISTERED_MESSAGE Určuje, která funkce bude zpracovávat zaregistrovanou uživatelem definovanou zprávu.
ON_REGISTERED_THREAD_MESSAGE Určuje, která funkce bude zpracovávat zaregistrovanou uživatelem definovanou CWinThread zprávu, pokud máte třídu.
ON_THREAD_MESSAGE Určuje, která funkce bude zpracovávat uživatelem definovanou CWinThread zprávu, když máte třídu.
ON_UPDATE_COMMAND_UI Určuje, která funkce zpracuje zadanou zprávu příkazu aktualizace uživatelského rozhraní.

Makra rozsahu map zpráv

Název Popis
ON_COMMAND_RANGE Určuje, která funkce bude zpracovávat rozsah ID příkazů zadaných v prvních dvou parametrech makra.
ON_UPDATE_COMMAND_UI_RANGE Určuje, která obslužná rutina aktualizace bude zpracovávat rozsah ID příkazů zadaných v prvních dvou parametrech makra.
ON_CONTROL_RANGE Určuje, která funkce bude zpracovávat oznámení z rozsahu ID ovládacích prvků zadaných ve druhém a třetím parametru makra. Prvním parametrem je zpráva s oznámením o řízení, například BN_CLICKED.

Další informace o mapách zpráv, deklaraci mapy zpráv a demaraci maker a makra mapování zpráv naleznete v tématu Mapy zpráv a zpracování zpráv a mapování témat. Další informace o rozsazích map zpráv naleznete v tématu Obslužné rutiny pro rozsahy map zpráv.

BEGIN_MESSAGE_MAP

Zahájí definici mapy zpráv.

Syntaxe

BEGIN_MESSAGE_MAP( theClass, baseClass )

Parametry

theClass
Určuje název třídy, jejíž zpráva je mapována.

baseClass
Určuje název základní třídy theClass.

Poznámky

V souboru implementace (.cpp), který definuje členské funkce pro vaši třídu, spusťte mapu zpráv pomocí BEGIN_MESSAGE_MAP makra, přidejte položky makra pro každou z funkcí obslužné rutiny zpráv a dokončete mapu zpráv pomocí END_MESSAGE_MAP makra.

Další informace o mapách zpráv najdete v tématu Mapy zpráv.

Příklad

BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
   ON_WM_CREATE()
END_MESSAGE_MAP()

Požadavky

Záhlaví: afxwin.h

BEGIN_TEMPLATE_MESSAGE_MAP

Začíná definice mapy zpráv u typu třídy obsahujícího jeden argument šablony.

Syntaxe

BEGIN_TEMPLATE_MESSAGE_MAP( theClass, type_name, baseClass )

Parametry

theClass
Určuje název třídy, jejíž zpráva je mapována.

type_name
Název parametru šablony určeného pro třídu.

baseClass
Určuje název základní třídy theClass.

Poznámky

Toto makro se podobá BEGIN_MESSAGE_MAP makre. Toto makro je však určeno pro třídy obsahující jeden argument šablony.

V části implementace metody vaší třídy spusťte mapu zpráv s BEGIN_TEMPLATE_MESSAGE_MAP makrem. Potom přidejte položky makra pro každou metodu obslužné rutiny zpráv stejně jako pro standardní mapu zpráv. Stejně jako u BEGIN_MESSAGE_MAP makra dokončete mapu zpráv šablony s END_MESSAGE_MAP makrem.

Další informace o implementaci map zpráv pro třídy šablon najdete v tématu Postupy: Vytvoření mapy zpráv pro třídu šablony.

Požadavky

Záhlaví: afxwin.h

DECLARE_MESSAGE_MAP

Deklaruje, že třída definuje mapu zpráv. Každá CCmdTarget-odvozená třída v programu musí poskytovat mapu zpráv pro zpracování zpráv.

Syntaxe

DECLARE_MESSAGE_MAP( )

Poznámky

DECLARE_MESSAGE_MAP Použijte makro na konci deklarace třídy. Potom v souboru .cpp, který definuje členské funkce pro třídu, použijte BEGIN_MESSAGE_MAP makro, položky maker pro každou z funkcí obslužné rutiny zpráv a END_MESSAGE_MAP makro.

Poznámka:

Pokud deklarujete některý člen po DECLARE_MESSAGE_MAP, je nutné zadat nový typ přístupu (public, privatenebo protected) pro ně.

Další informace o mapách zpráv a DECLARE_MESSAGE_MAP makrech naleznete v tématu Zpracování zpráv a mapování témat.

Příklad

class CMainFrame : public CMDIFrameWnd
{
   DECLARE_MESSAGE_MAP()

   // Remainder of class declaration omitted.

Požadavky

Záhlaví: afxwin.h

END_MESSAGE_MAP

Ukončí definici mapy zpráv.

Syntaxe

END_MESSAGE_MAP( )

Poznámky

Další informace o mapách zpráv a END_MESSAGE_MAP makrech naleznete v tématu Zpracování zpráv a mapování témat.

Požadavky

Záhlaví: afxwin.h

ON_COMMAND

Toto makro mapuje zprávu příkazu na členovou funkci.

Syntaxe

ON_COMMAND( commandId, memberFxn )

Parametry

commandId
ID příkazu.

memberFxn
Název funkce obslužné rutiny zprávy, na kterou je příkaz namapován.

Poznámky

Určuje, která funkce bude zpracovávat zprávu příkazu z objektu uživatelského rozhraní příkazu, jako je například položka nabídky nebo tlačítko panelu nástrojů.

Když objekt cíle příkazu obdrží zprávu systému Windows WM_COMMAND se zadaným ID, zavolá členovou funkcimemberFxn, ON_COMMAND která zprávu zpracuje.

Slouží ON_COMMAND k mapování jednoho příkazu na členovou funkci. Slouží ON_COMMAND_RANGE k mapování rozsahu ID příkazů na jednu členovou funkci. Pouze jedna položka mapy zpráv může odpovídat danému ID příkazu. To znamená, že nemůžete namapovat příkaz na více než jednu obslužnou rutinu. Další informace a příklady naleznete v tématu Zpracování zpráv a mapování témat.

Příklad

BEGIN_MESSAGE_MAP(CMFCListViewDoc, CDocument)
   ON_COMMAND(ID_MYCOMMAND, &CMFCListViewDoc::OnMycommand)
END_MESSAGE_MAP()

Požadavky

Záhlaví: afxmsg_.h

ON_COMMAND_EX

Rozšířená členová funkce obslužné rutiny příkazů.

Syntaxe

ON_COMMAND_EX(commandId, memberFxn);

Parametry

commandId
ID příkazu.

memberFxn
Název funkce obslužné rutiny zprávy, na kterou je příkaz namapován.

Poznámky

Rozšířená forma obslužných rutin zpráv příkazů je k dispozici pro pokročilé použití. Makro ON_COMMAND_EX se používá pro takové obslužné rutiny zpráv a poskytuje nadmnožinu ON_COMMAND funkcí. Rozšířené členské funkce obslužné rutiny příkazů přebírají jeden parametr, UINT obsahující ID příkazu a vrátí hodnotu BOOL. Návratová hodnota by měla značit TRUE , že byl příkaz zpracován. Jinak směrování bude pokračovat k jiným cílovým objektům příkazu.

Další informace najdete v technické poznámce [TN006: Mapy zpráv]tm006-message-maps.md).

Požadavky

Hlavičkový soubor: afxmsg_.h

ON_CONTROL

Označuje, která funkce zpracuje zprávu s oznámením vlastního ovládacího prvku.

Syntaxe

ON_CONTROL( wNotifyCode, commandId, memberFxn )

Parametry

wNotifyCode
Kód oznámení ovládacího prvku.

commandId
ID příkazu.

memberFxn
Název funkce obslužné rutiny zprávy, na kterou je příkaz namapován.

Poznámky

Zprávy s oznámením o ovládacím prvku se odesílají z ovládacího prvku do nadřazeného okna.

V mapě zpráv by měl být přesně jeden ON_CONTROL příkaz makra pro každou zprávu oznámení o ovládacím prvku, který musí být namapován na funkci obslužné rutiny zpráv.

Další informace a příklady naleznete v tématu Zpracování zpráv a mapování témat.

Požadavky

Záhlaví: afxmsg_.h

ON_MESSAGE

Určuje, která funkce bude zpracovávat uživatelem definovanou zprávu.

Syntaxe

ON_MESSAGE( message, memberFxn )

Parametry

message
ID zprávy.

memberFxn
Název funkce obslužné rutiny zprávy, na kterou je zpráva namapována.

Typ funkce musí být afx_msg LRESULT (CWnd::*)(WPARAM, LPARAM).

Poznámky

Uživatelem definované zprávy jsou všechny zprávy, které nejsou standardními zprávami systému Windows WM_MESSAGE . Při výběru ID zprávy je nutné použít hodnoty v rozsahu WM_USER (0x0400) k 0x7FFF nebo WM_APP (0x8000) k 0xBFFF. Další informace o ID zpráv najdete v tématu WM_APP.

V mapě zpráv by měl být přesně jeden ON_MESSAGE příkaz makra pro každou uživatelem definovanou zprávu, která musí být namapována na funkci obslužné rutiny zpráv.

Poznámka:

Kromě uživatelem definovaných zpráv ON_MESSAGE zpracovává méně běžné zprávy systému Windows. Další informace naleznete v tématu Mapy zpráv.

Další informace a příklady najdete v tématu Zpracování zpráv a mapování témat a uživatelsky definovaných obslužných rutin.

Příklad

#define WM_MYMESSAGE (WM_USER + 100)

BEGIN_MESSAGE_MAP(CMyWnd2, CWnd)
   ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()

// inside the class declaration
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);

LRESULT CMyWnd2::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
   UNREFERENCED_PARAMETER(wParam);
   UNREFERENCED_PARAMETER(lParam);

   // Handle message here.

   return 0;
}

Požadavky

Záhlaví: afxmsg_.h

ON_OLECMD

Směruje příkazy přes rozhraní IOleCommandTargetpro odesílání příkazů .

Syntaxe

ON_OLECMD( pguid, olecmdid, commandId )

Parametry

pguid
Identifikátor skupiny příkazů, do které příkaz patří. Používá se NULL pro standardní skupinu.

olecmdid
Identifikátor příkazu OLE.

commandId
ID nabídky, ID panelu nástrojů, ID tlačítka nebo jiné ID prostředku nebo objektu, který příkaz vydává.

Poznámky

IOleCommandTarget umožňuje kontejneru přijímat příkazy, které pocházejí z uživatelského rozhraní Objektu DocObject, a umožňuje kontejneru odesílat stejné příkazy (například New, Open, SaveAs a Print v nabídce Soubor; a Kopírovat, Vložit, Zpět atd.) do DocObjectu.

IOleCommandTarget je jednodušší než automatizace OLE IDispatch. IOleCommandTarget spoléhá zcela na standardní sadu příkazů, které mají zřídka argumenty, a nejsou zapojeny žádné informace o typu (bezpečnost typů se snižuje i pro argumenty příkazů). Pokud potřebujete odesílat příkazy s argumenty, použijte COleServerDoc::OnExecOleCmd.

Standardní IOleCommandTarget příkazy nabídky byly implementovány prostředím MFC v následujících makrech:

ON_OLECMD_CLEARSELECTION( )

Odešle příkaz Upravit vymazat. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_CLEARSELECTION, ID_EDIT_CLEAR)

ON_OLECMD_COPY( )

Odešle příkaz Upravit kopii. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_COPY, ID_EDIT_COPY)

ON_OLECMD_CUT( )

Odešle příkaz Upravit vyjmout. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_CUT, ID_EDIT_CUT)

ON_OLECMD_NEW( )

Odešle příkaz Nový soubor. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_NEW, ID_FILE_NEW)

ON_OLECMD_OPEN( )

Odešle příkaz Otevřít soubor. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_OPEN, ID_FILE_OPEN)

ON_OLECMD_PAGESETUP( )

Odešle příkaz Nastavení stránky souboru. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_PAGESETUP, ID_FILE_PAGE_SETUP)

ON_OLECMD_PASTE( )

Odešle příkaz Upravit vložení. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_PASTE, ID_EDIT_PASTE)

ON_OLECMD_PASTESPECIAL( )

Odešle příkaz Upravit vložit jinak. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_PASTESPECIAL, ID_EDIT_PASTE_SPECIAL)

ON_OLECMD_PRINT( )

Odešle příkaz Tisk souboru. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_PRINT, ID_FILE_PRINT)

ON_OLECMD_PRINTPREVIEW( )

Odešle příkaz Náhled souboru. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_PRINTPREVIEW, ID_FILE_PRINT_PREVIEW)

ON_OLECMD_REDO( )

Odešle příkaz Upravit znovu. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_REDO, ID_EDIT_REDO)

ON_OLECMD_SAVE( )

Odešle příkaz Uložit soubor. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_SAVE, ID_FILE_SAVE)

ON_OLECMD_SAVE_AS( )

Odešle příkaz Uložit jako. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_SAVEAS, ID_FILE_SAVE_AS)

ON_OLECMD_SAVE_COPY_AS( )

Odešle příkaz Uložit kopii jako souboru. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_SAVECOPYAS, ID_FILE_SAVE_COPY_AS)

ON_OLECMD_SELECTALL( )

Odešle příkaz Upravit vybrat vše. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_SELECTALL, ID_EDIT_SELECT_ALL)

ON_OLECMD_UNDO( )

Odešle příkaz Upravit zpět. Implementováno jako:

ON_OLECMD(NULL, OLECMDID_UNDO, ID_EDIT_UNDO)

Požadavky

Záhlaví: afxdocob.h

ON_REGISTERED_MESSAGE

Funkce Windows RegisterWindowMessage slouží k definování nové zprávy okna, která je zaručena jedinečná v celém systému.

Syntaxe

ON_REGISTERED_MESSAGE( nMessageVariable, memberFxn )

Parametry

nMessageVariable
Proměnná ID registrované zprávy okna.

memberFxn
Název funkce obslužné rutiny zprávy, na kterou je zpráva namapována.

Poznámky

Toto makro označuje, která funkce zpracuje zaregistrovanou zprávu.

Další informace a příklady naleznete v tématu Zpracování zpráv a mapování témat.

Příklad

static UINT NEAR WM_FIND = RegisterWindowMessage(_T("COMMDLG_FIND"));

BEGIN_MESSAGE_MAP(CMyWnd3, CWnd)
   ON_REGISTERED_MESSAGE(WM_FIND, OnFind)
END_MESSAGE_MAP()

Požadavky

Záhlaví: afxmsg_.h

ON_REGISTERED_THREAD_MESSAGE

Určuje, která funkce bude zpracovávat zprávu zaregistrovanou funkcí Systému Windows RegisterWindowMessage .

Syntaxe

ON_REGISTERED_THREAD_MESSAGE(nMessageVariable, memberFxn )

Parametry

nMessageVariable
Proměnná ID registrované zprávy okna.

memberFxn
Název CWinThreadfunkce -message-handler, na kterou je zpráva mapována.

Poznámky

RegisterWindowMessage slouží k definování nové zprávy okna, která zaručuje, že bude v celém systému jedinečná. ON_REGISTERED_THREAD_MESSAGE místo ON_REGISTERED_MESSAGE toho, když máte CWinThread třídu.

Požadavky

Záhlaví: afxmsg_.h

ON_THREAD_MESSAGE

Určuje, která funkce bude zpracovávat uživatelem definovanou zprávu.

Syntaxe

ON_THREAD_MESSAGE( message, memberFxn )

Parametry

message
ID zprávy.

memberFxn
Název CWinThreadfunkce -message-handler, na kterou je zpráva mapována.

Poznámky

ON_THREAD_MESSAGE místo ON_MESSAGE toho, když máte CWinThread třídu. Uživatelem definované zprávy jsou všechny zprávy, které nejsou standardními zprávami systému Windows WM_MESSAGE . V mapě zpráv by měl být přesně jeden ON_THREAD_MESSAGE příkaz makra pro každou uživatelem definovanou zprávu, která musí být namapována na funkci obslužné rutiny zpráv.

Požadavky

Záhlaví: afxole.h

ON_UPDATE_COMMAND_UI

Toto makro označuje, která funkce bude zpracovávat zprávu příkazu update uživatelského rozhraní.

Syntaxe

ON_UPDATE_COMMAND_UI( messageId, memberFxn )

Parametry

messageId
ID zprávy.

memberFxn
Název funkce obslužné rutiny zprávy, na kterou je zpráva namapována.

Poznámky

V mapě zpráv by měl být přesně jeden ON_UPDATE_COMMAND_UI příkaz makra pro každý příkaz aktualizace uživatelského rozhraní, který musí být namapován na funkci obslužné rutiny zpráv.

Další informace a příklady naleznete v tématu Zpracování zpráv a mapování témat.

Požadavky

Záhlaví: afxole.h

ON_COMMAND_RANGE

Toto makro slouží k mapování souvislého rozsahu ID příkazů na jednu funkci obslužné rutiny zprávy.

Syntaxe

ON_COMMAND_RANGE( id1, id2, memberFxn )

Parametry

id1
ID příkazu na začátku souvislého rozsahu ID příkazů

id2
ID příkazu na konci souvislého rozsahu ID příkazů

memberFxn
Název funkce obslužné rutiny zprávy, na kterou jsou příkazy mapovány.

Poznámky

Rozsah ID začíná id1 a končí na id2.

Slouží ON_COMMAND_RANGE k mapování rozsahu ID příkazů na jednu členovou funkci. Slouží ON_COMMAND k mapování jednoho příkazu na členovou funkci. Pouze jedna položka mapy zpráv může odpovídat danému ID příkazu. To znamená, že nemůžete namapovat příkaz na více než jednu obslužnou rutinu. Další informace o mapování rozsahů zpráv naleznete v tématu Obslužné rutiny oblasti mapování zpráv.

Rozsahy map zpráv nejsou podporovány automaticky, takže makro musíte umístit sami.

Příklad

// The code fragment below shows how to use ON_COMMAND_RANGE macro
// to map a contiguous range of command IDs to a single message
// handler function (i.e. OnRangeCmds() in the sample below). In
// addition, it also shows how to use CheckMenuRadioItem() to check a
// selected menu item and makes it a radio item.

BEGIN_MESSAGE_MAP(CChildFrame, CMDIChildWnd)
   ON_COMMAND_RANGE(ID_COMMAND_RANGECMD1, ID_COMMAND_RANGECMD3, &CChildFrame::OnRangeCmds)
END_MESSAGE_MAP()

void CChildFrame::OnRangeCmds(UINT nID)
{
   CMenu* mmenu = AfxGetMainWnd()->GetMenu();
   CMenu* submenu = mmenu->GetSubMenu(5);
   submenu->CheckMenuRadioItem(ID_COMMAND_RANGECMD1, ID_COMMAND_RANGECMD3,
      nID, MF_BYCOMMAND);
}

Požadavky

Záhlaví: afxmsg_.h

ON_UPDATE_COMMAND_UI_RANGE

Mapuje souvislou oblast ID příkazů na jednu funkci obslužné rutiny zpráv aktualizace.

Syntaxe

ON_UPDATE_COMMAND_UI_RANGE( id1, id2, memberFxn )

Parametry

id1
ID příkazu na začátku souvislého rozsahu ID příkazů

id2
ID příkazu na konci souvislého rozsahu ID příkazů

memberFxn
Název funkce obslužné rutiny aktualizace zpráv, na kterou jsou příkazy mapovány.

Poznámky

Aktualizovat obslužné rutiny zpráv aktualizují stav položek nabídky a tlačítek panelu nástrojů přidružených k příkazu. Rozsah ID začíná id1 a končí na id2.

Rozsahy map zpráv nejsou podporovány automaticky, takže makro musíte umístit sami.

Požadavky

Záhlaví: afxmsg_.h

ON_CONTROL_RANGE

Toto makro slouží k mapování souvislého rozsahu ID ovládacích prvků na jednu funkci obslužné rutiny zprávy pro zadanou zprávu oznámení systému Windows, například BN_CLICKED.

Syntaxe

ON_CONTROL_RANGE( wNotifyCode, id1, id2, memberFxn )

Parametry

wNotifyCode
Kód oznámení, na který obslužná rutina reaguje.

id1
ID příkazu na začátku souvislého rozsahu ID ovládacích prvků

id2
ID příkazu na konci souvislého rozsahu ID ovládacích prvků

memberFxn
Název funkce obslužné rutiny zprávy, na kterou jsou ovládací prvky mapovány.

Poznámky

Rozsah ID začíná id1 a končí na id2. Obslužná rutina se volá pro zadané oznámení pocházející z některého z mapovaných ovládacích prvků.

Rozsahy map zpráv nejsou podporovány automaticky, takže makro musíte umístit sami.

Další informace o implementaci funkcí obslužné rutiny pro řadu ID ovládacích prvků najdete v obslužných rutinách rozsahů map zpráv.

Požadavky

Záhlaví: afxmsg_.h

Viz také

ON_COMMAND
TN006: Mapy zpráv
COleCmdUI Třída
COleServerDoc::OnExecOleCmd
RegisterWindowMessage
Uživatelem definované obslužné rutiny
CCmdUI Třída