2015-07-08 5 views
0

Я искал, но не нашел. Я хочу, чтобы макрос карты сообщений связывал действие команды меню с функцией, принимающей числовой идентификатор, и не предоставляя никакого возврата вообще (будучи недействительным).Существует версия ON_COMMAND_EX, которая принимает функцию, возвращающую void?

ON_COMMAND возвращает void, но он слишком ограничен, потому что он не предоставляет идентификатор элемента меню, который мне нужен в этом случае.

ON_COMMAND_EX возвращает BOOL, поэтому он заставляет меня делать много возвратов, что было бы ненужным, если тип возврата был недействительным.

Итак, как я описал в первом абзаце, есть ли такой макрос?

ответ

0

Я не нашел такой макрос, но я пришел с решением: Определить мой собственный макрос на основе определения ON_COMMAND_EX, заменив BOOL на void.

ON_COMMAND_EX макросъемки:

#define ON_COMMAND_EX(id, memberFxn) \ 
    { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_EX, \ 
     (AFX_PMSG) \ 
     (static_cast< BOOL (AFX_MSG_CALL CCmdTarget::*)(UINT) > \ 
    (memberFxn)) }, 

Я просто скопировать и адаптировать его к своим собственным целям:

#define ON_COMMAND_EX_VOID(id, memberFxn) \ 
    { WM_COMMAND, CN_COMMAND, (WORD)id, (WORD)id, AfxSigCmd_EX, \ 
     (AFX_PMSG) \ 
     (static_cast< void (AFX_MSG_CALL CCmdTarget::*)(UINT) > \ 
    (memberFxn)) }, 

Обратите внимание, что только два изменения имя тха макро и изменения от BOOL до void

Чтобы использовать его: На карте сообщений добавить что-то наподобие

ON_COMMAND_EX_VOID(ID_FILE_PREFERENCES, OnFilePreferencesVoid) 

Затем объявить функцию обработчика на файле заголовка: afx_msg недействительным OnFilePreferencesVoid (UINT НДИ);

И, наконец, сделать реализацию на файл исходного кода:

void CMainFrame::OnFilePreferencesVoid(UINT nID) 
{ 
    CString s; 
    s.Format(_T("%d"), nID); 
    AfxMessageBox(s); 
} 

Очевидно, что код размещен здесь теоретический пример, так как есть более полезные вещи, чтобы сделать, чем отображения уже раздражает всплывающее сообщение с идентификатор ресурса раздражителя.

Вдохновения для решения пришло из ON_MESSAGE_VOID размещено на https://stackoverflow.com/a/10619963/383779

0

Вы можете использовать:

ON_COMMAND_RANGE(ID_COMMAND, ID_COMMAND, Handler) 
+1

Можете ли вы объяснить более ваш ответ, пожалуйста? – Zulu