WM_MENUSELECT не обрабатывается в окнах CFrameWndEx - PullRequest
1 голос
/ 25 января 2012

Я пытаюсь обработать сообщение WM_MENUSELECT в проекте SDI VS2008 (и VS2010), основанном на окне основного кадра CFrameWndEx.

Я создаю простой проект из мастера VS2008 (один документ, «Стандарт MFC», «использовать классическое меню»), который приводит к чему-то вроде (после добавления сообщения WM_MENUSELECT):

class CMainFrame : public CFrameWnd
{
///...
public:
    afx_msg void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu);
};

и

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
    ON_WM_CREATE()
    ON_WM_MENUSELECT()
END_MESSAGE_MAP()

///...
void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
    CFrameWnd::OnMenuSelect(nItemID, nFlags, hSysMenu);
}

Это работает, когда ставит точку останова в CMainFrame :: OnMenuSelect, она срабатывает при использовании меню (в этом случае каждый раз)

Замена CFrameWnd на CFrameWndEx (или путем создания нового проекта с помощью мастера с параметрами отдельного документа «Стандарт MFC», «использовать меню и панель инструментов» (

class CMainFrame : public CFrameWndEx
{
///....
public:
    afx_msg void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu);   
};

и

IMPLEMENT_DYNCREATE(CMainFrame, CFrameWndEx)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWndEx)
    ON_WM_CREATE()
    ON_WM_MENUSELECT()
END_MESSAGE_MAP()

///....    
void CMainFrame::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
    CFrameWndEx::OnMenuSelect(nItemID, nFlags, hSysMenu);
}

Сообщениеникогда не сработает.

Я даже сократил проект, используя CFrameWndEx, до строгого минимума, и до сих пор не могу получить сообщение.

Есть идеи почему?Советы, подсказки всегда приветствуются.Благодарю.Макс.

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Базовый класс должен быть корректным в макросе в начале карты сообщений (выше ON_WM_MENUSELECT). Я предполагаю, что вы не изменили его на CFrameWndEx, когда изменили базовый класс.

1 голос
/ 27 января 2012

А-а-а, старые добрые времена одиночного перехода в исходный код MFC!Это всегда был ключ; -)

CMFCPopupMenu :: SetSendMenuSelectMsg () - ваш новый друг.

Просто добавьте эту строку в ваш CMainFrame::OnCreate():

CMFCPopupMenu::SetSendMenuSelectMsg(TRUE);

Суть в том, что меню и панели инструментов MFC не являются обычными обертками вокруг стандартных объектов Windows.Они реализуют вещи по-разному, используя другую модель.

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

Примечание: вероятно, существуют новые механизмы или лучшие практики для манипулирования этими объектами.Вероятно, стоит изучить их, а не устанавливать параметры совместимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...