Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Меню UI-активного объекта в MFC 
V
    Опции темы
Johnnye
Дата 22.9.2011, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.9.2011

Репутация: нет
Всего: нет



Добрый день.

Очень нужна ваша помощь. Переношу проект написанный на C++ и WINAPI под MFC. От MFC нужен красивый UI. В проекте есть поддержка серверов документов OLE. Хочется оставить реализацию интерфейсов контейнера без изменений не прибегая к помощи MFC. Пока все шло нормально, но столкнулся с проблемой после активации сервера. Проблема в следующем :

Код

HRESULT STDMETHODCALLTYPE COleInPlaceFrame::SetMenu( 
            /* [in] */ __RPC__in HMENU hmenuShared,
            /* [in] */ __RPC__in HOLEMENU holemenu,
            /* [in] */ __RPC__in HWND hwndActiveObject)
{
    if (holemenu != NULL) {

        CMainFrame * pMainFrame = (CMainFrame*)theApp.GetMainWnd();

pMainFrame->DelayUpdateFrameMenu(hmenuShared); // Взято из стандартного MFC-класса //COleFrameHook


HRESULT hResult = OleSetMenuDescriptor(holemenu,pMainFrame->GetSafeHwnd(),hwndActiveObject,
            NULL, NULL);
    }
    ...
    ...
}


Т.е. мне нужно установить меню сервера документов. После упомянутого выше кода у меня появляется меню сервера документов, но естественно оно каркасом обрабатывается неправильно. Доступные только пункты меню ID которых случайным образом совпало с ID стандартного меню. Пробовал так же 
ON_UPDATE_COMMAND_UI для ID, который появиться только после активации объекта (но это не выход). Ни в том, ни в другом случае команда меню не попадает в окно активного объекта. Короче говоря, мне нужно следующее: 
1.    Чтобы после активации объекта были доступны пункты меню, ID которых заведомо неизвестно
2.    Чтобы команды меню проходили в окно UI-активного объкта (насколько я понимаю, OleSetMenuDescriptor субклассирует мое главное окно)

На данном этапе это MDI-приложение с CMFCMenuBar-меню .

Заранее благодарен за Вашу помощь.

PM MAIL   Вверх
Earnest
Дата 23.9.2011, 07:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



В главном окне добавь передачу команд в свой объект (в функции OnCmdMsg). Внимательно изучи параметры. OnCmdMsg вызывается и для выполнения команд, и для их обновления. Не знаю, что можно передать OLE-объекту, но даже если он никаких подходящих интерфейсов не содержит, то можно сделать следующее:
1) проверить, что ID пришедшей команды есть в новом меню
2) если это CN_COMMAND, то послать объекту соответствующую команду
3) если CN_UPDATE, то нужно сделать пункт меню доступным (в виде параметра void* pExtraна самом деле приходит ССmdUI, его и надо энеблить).
Можно попробовать обойтись без п 3), если все пункты меню всегда должны быть доступны. По идее для этого должно хватить п2.
Не забудь вернуть TRUE, если ID обработан.  


--------------------
...
PM   Вверх
Johnnye
Дата 23.9.2011, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.9.2011

Репутация: нет
Всего: нет



Цитата(Earnest @ 23.9.2011,  07:20)
В главном окне добавь передачу команд в свой объект (в функции OnCmdMsg). Внимательно изучи параметры. OnCmdMsg вызывается и для выполнения команд, и для их обновления. Не знаю, что можно передать OLE-объекту, но даже если он никаких подходящих интерфейсов не содержит, то можно сделать следующее:
1) проверить, что ID пришедшей команды есть в новом меню
2) если это CN_COMMAND, то послать объекту соответствующую команду
3) если CN_UPDATE, то нужно сделать пункт меню доступным (в виде параметра void* pExtraна самом деле приходит ССmdUI, его и надо энеблить).
Можно попробовать обойтись без п 3), если все пункты меню всегда должны быть доступны. По идее для этого должно хватить п2.
Не забудь вернуть TRUE, если ID обработан.

Огромное спасибо. То, что надо было. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0841 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.