Как передать значение в функцию отображения сообщений MFC on_command

У меня есть функция, которая выполняет определенное действие в зависимости от получаемого значения std :: string.

Eg:

void performTaskOnStringValue (std :: string);

Теперь у меня есть набор кнопок ленты (CMFCRibbonButton), которым необходимо вызывать эту функцию, передавая соответствующий текст в виде значений при нажатии кнопки.

Я сопоставил идентификаторы этих кнопок с макросом карты сообщений on_command с идентификатором кнопки. Все кнопки имеют один общий идентификатор - например, -

ID_RIBBON_BUTTON_ID

Карта сообщений выглядит следующим образом

ON_COMMAND (ID_RIBBON_BUTTON_ID, & MyClass :: performTaskOnStringValue);

Как передать текст кнопки в качестве параметра этой функции в ButtonClick?


person Eternal Learner    schedule 31.08.2012    source источник


Ответы (2)


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

Если вы можете назначить кнопкам последовательные идентификаторы, вы можете вместо этого использовать ON_COMMAND_RANGE. Это передаст вам идентификатор кнопки, который вы можете передать в GetDlgItemText, чтобы получить текст от кнопки.

person Mark Ransom    schedule 31.08.2012
comment
Поскольку добавление кнопок происходит на лету, я не знаю заранее, сколько кнопок мне нужно создать. Причина, по которой мне нужно знать, - связать идентификаторы с ON_COMMAND_RANGE и вставить их в файл ресурсов, чтобы они распознавались как действительные идентификаторы. - person Eternal Learner; 31.08.2012
comment
@EternalLearner, если вы создаете кнопки на лету, вам не нужно иметь их в файле ресурсов. Просто определите минимальное и максимальное значение, которое вам разрешено использовать, и отслеживайте текущее значение, увеличиваясь каждый раз, когда вы создаете новую кнопку. - person Mark Ransom; 31.08.2012
comment
Все работало, кроме GetDlgItemText, поскольку добавленный мной элемент имел тип CMFCRibbonButton. Я использовал метод FindByID (uint ID). Спасибо. - person Eternal Learner; 31.08.2012

Во-первых, дайте каждой кнопке разные идентификаторы в непрерывном диапазоне.

Во-вторых, используйте ON_COMMAND_RANGE для сопоставления всех кнопки для одного обработчика, который получает идентификатор в качестве параметра.

В-третьих, в этом обработчике используйте идентификатор для получения текста кнопки. Затем вы можете вызвать свой метод performTaskOnStringValue.

person Avi Berger    schedule 31.08.2012