MFC: лучшее место для обработки сообщений контекстного меню?

Использование C ++ с MFC. Я использую элемент управления сеткой, производный от CWnd (в частности, элемент управления сеткой MFC в кодовом проекте). Я хочу отображать контекстное меню, когда пользователь щелкает ячейку правой кнопкой мыши. Я думаю, что нужно обработать сообщение ON_WM_CONTEXTMENU ().

Однако где лучше всего справиться с этим: в OnContextMenu в моем (производном) классе элемента управления сеткой или в OnContextMenu в классе диалогового окна, содержащем элемент управления сеткой? Есть ли в MFC условность?


person User    schedule 26.05.2011    source источник


Ответы (2)


Если есть условность, я не заметил.

Я бы выбрал на основе того, у кого есть информация, необходимая для создания меню, и кто будет обрабатывать команды, полученные в результате выбора меню.

person Mark Ransom    schedule 26.05.2011
comment
Сначала я не подумал, что это ответ на него, потому что, чтобы иметь независимый дизайн, я делегирую действие команды отдельному классу типа уровня сервиса. Поэтому я решил, что не имеет значения, кто звонил в этот класс обслуживания. Но потом я понял, что мой класс диалога имеет ссылку на класс обслуживания. - person User; 27.05.2011

С точки зрения удобства использования я должен сказать, что контекстное меню содержит только те вещи, которые на самом деле являются просто ярлыками для других элементов пользовательского интерфейса. Приведу пример: в MS Word у вас есть контекстное меню «копировать» на случай, если вы щелкнете правой кнопкой мыши по выделенному тексту. Пункт меню «Копировать» на самом деле является ярлыком к пункту «Правка» -> «Копировать» в главном меню. Итак, с точки зрения удобства вашему приложению требуется меню (или кнопка) или что-то еще, что делает то же самое.

Теперь, синусоидальная обработка главного меню не может выполняться в самой сетке, почему контекстное меню должно обрабатываться в сетке? Мне это кажется непоследовательным.

Мне кажется более естественным обрабатывать это в диалоговом окне, а не в самом элементе управления. Это не связано с используемой вами средой. В C # я бы сделал то же самое.

person Bart Gijssens    schedule 27.05.2011
comment
Хорошо, я мог неправильно истолковать твой вопрос. Возникает вопрос: где отображать контекстное меню или где обрабатывать нажатие контекстного меню? - person Bart Gijssens; 27.05.2011
comment
Вопрос заключался в том, где обрабатывать сообщение WM_CONTEXTMENU, и действие, которое вы выполняете для этого сообщения, заключается в отображении контекстного меню. - person Mark Ransom; 27.05.2011