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
, private
nebo 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í IOleCommandTarget
pro 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 CWinThread
funkce -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 CWinThread
funkce -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