2017-02-02 5 views
1

У меня есть два небольших вопроса в технологии программирования Visual Studio MFC-GUI, касающийся обработки группы переключателей в VS2015 CE.MFC-переключатель группового сообщения обработчик

У меня есть небольшое диалоговое приложение. Это приложение рисует некоторые строки в моем диалоговом окне с указанным пером. Теперь я сделал группу переключателей, чтобы иметь возможность использовать разные цвета для пера. Поэтому я создал поле группы, поместил радиокнопки в это групповое окно, включил свойство группы первого переключателя и проверил последовательность табуляции, чтобы все переключатели были правильно в последовательности.

Это нормально - тестирование GUI. Я могу выбрать только один из переключателей, как и планировалось, потому что я не смог бы провести линию в разные цвета одновременно. Теперь я добавил обработчик для сообщения BN_CLICKED первого объекта переключателя в ClassWizard, чтобы добавить выбор различных цветных ручек.

Теперь идет интересная часть. Этот обработчик выполняется только тогда, когда я нажимаю первый переключатель. Включен объект с включенным групповым свойством. Я думал, что он должен выполняться всякий раз, когда я нажимаю любую из переключателей этой группы. Следующее, что я попробовал, это добавить BN_CLICKED-Message-манипулятор ко всем этим переключателям, но ClassWizard не отображает сообщение BN_CLICKED для других переключателей - только для тех, у кого включен групповой прокси.

После поиска в Интернете я прочитал сообщение о том, что можно было бы добавить BN_CLICKED-Messagehandler для кнопки, просто дважды щелкнув по нему в диалоговом окне. Поэтому я дважды щелкнул все мои переключатели и добавил вызов обработчика BN_CLICKED-Message первого переключателя. Это работает как обходной путь, так что теперь моя линия рисуется в разных цветах всякий раз, когда я нажимаю на любую из этих переключателей (черный, синий, красный и т. Д.).

У меня есть два вопроса - это поведение предназначено? Я полагаю, причина, по которой я могу только добавить BN_CLICKED-Messagehandler в ClassWizard для первого переключателя, заключается в том, что он будет вызываться любой из переключателей в моей группе, не так ли?

Другой вопрос: я бы предпочел написать обработчик один раз и дать возможность мастеру класса использовать этот конкретный обработчик вместо создания уникального обработчика для каждой из кнопок. Это не зависит от этих переключателей. Я протестировал это с помощью простого приложения, которое состоит из сборки нескольких кнопок - у которых могут быть свои собственные BN_CLICKED-Messagehandlers, прикрепленные мастером классов. Когда я не принимал автоматически сгенерированное имя функции от мастера и вводил имя моей собственной функции handler, он просто утверждает, что он не сможет перезаписать его. Как я могу выбрать существующий обработчик для сообщения объекта в мастере классов или это невозможно, и я должен сделать это вручную в коде для себя?

Надежда есть более VS2015 MFC Guy там быть в состоянии сказать мне ..

+0

Просто добавьте обработчики вручную, он отлично работает. –

+0

Между Visual Studio 6 и Visual Studio 2010 у нас не было мастера классов MFC. Это удобство, и вам нужно быть готовым написать код MFC без него. Jeff Prosise '[Программирование Windows с MFC, второе издание] (https://www.amazon.com/dp/1572316950) рекомендуется читать. Он объясняет, что стоит за всеми этими макросами и автоматически сгенерированным кодом. – IInspectable

ответ

2

Это действительно дизайн. Вы могли бы хотеть различного поведения для каждого нажатия кнопки - если вы не просто связываете все BN_CLICKED с тем же обработчиком сообщений и удаляете те, которые были автоматически сгенерированы. Вы также можете использовать ON_CONTROL_RANGE (BN_CLICKED, id1, id2, memberFxn) - убедитесь, что ваши кнопки находятся в том же диапазоне в вашем ресурсе.h Надеюсь, что это поможет!

+0

Спасибо.Жаль, что это невозможно решить с помощью сборки функции класса мастера. Но этот ON_CONTROL_RANGE Makro, о котором вы говорили, кажется, стоит посмотреть. Хотя определение контрольных идентификаторов представляется немного сложнее. Я просто прочитал несколько примеров и определенность в MSDN. Я попробую. – Wciibb