Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Вопрос на соображалку


Автор: Rapalex 8.6.2006, 14:55
У меня изменённый каркас MDI, я его сам уродовал, и получилось довольно сносно, если не учесть что там многое до меня было не слишком коасиво smile

У меня получается "проект ориентированное" приложение, в том смысле что есть причяленый к MainFrame ControlBar в котором есть список, и по двойному шелчку открывается ChildFarme с нормальным видом который отображает только определённую часть документа. Следовательно документ есть а дочерних фреймов нет.

И сегодня возник вопрос о перенаправлении командных сообщений в этот причяленый список (это для того чтоб меншка работала, с акселератором).

С поставленной задачей на 100% справиться не смог, так как не смог определить кому отправлять:
- Причаленному ControlBar
- Активному ChildFrame

Обычно делают так: один не обработал другому пошлём. Но у меня на одну и туже менюшку разные действия должны произходить когда юзер в списке, и когда в ChildFrame!

ВОПРОС: Так как мне определить где находится пользователь?

Буду рад услышать все высказывания, можно и матерные лиш бы для пользы дела!  smile 
Шутка! 

Автор: Earnest 8.6.2006, 15:34
А как насчет GetFocus? Неужели не поможет? 

Автор: Rapalex 8.6.2006, 15:52
Попробывал оно возвращяет контролы, в моём случае ListCtrl а у меня их 4 на 3-х вкладках, а если исходить из того что появятся новые и новые контролы то этот вариант не идеален.

Но спасибо! Хорошая идея. 

Автор: Rapalex 8.6.2006, 16:36
Сделал так:

При ришении кому отправить сообщение, делаю GetFocus смотрю RunTimeClass и если это не класс моего отображения в ChildFrame отправляю пристыкованому окну.

НО. оно не работает я смотру в дебагере сообщение есть (в меседж маме прописано) и не отрабатывает  smile 

И что делать?

Я такого не видел... smile  

Автор: Earnest 8.6.2006, 16:40
Конечно, нужно не прямо  GetFocus использовать, а сначала получить фокус, а потом спросить у ControlBar IsChild (pFocus), тоже самое - у ChildFrame.
Чей чайлд в фокусе, туда и слать.
Предваряя возможные сомнения, поясню, что IsChild говорит да не только в случае прямого родителя, но и дедушки до любого колена...

Добавлено @ 16:42 
Цитата(Rapalex @  8.6.2006,  17:36 Найти цитируемый пост)
НО. оно не работает я смотру в дебагере сообщение есть (в меседж маме прописано) и не отрабатывает 

Информации недостаточно. Главное помни, что чудес не бывает: у всего есть причина.
Это очень помогает, несмотря на банальность.
Можешь выложить часть кода, но сегодня не обещаю (сейчас ухожу). 

Автор: Rapalex 9.6.2006, 12:23
Код в главной раме:
Код

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
    CWnd *pFocusWnd = CWnd::GetFocus();
    BOOL bResult = FALSE;
    if ( IsWindow(m_oConrolBarView.m_hWnd) && m_oConrolBarView.IsChild(pFocusWnd) )
    {
        // Полшём ControlBar
        bResult = m_oConrolBarView.m_poProjectFrame->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
    }

    if (!bResult)
    {
        // Пошлём себе и фреймам
        bResult = CPDIFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
    }

    return bResult;
}


За IsChild спасибо, честно, не знал...

Внешний вид причаленого окна прикрепил. Из него видно что вложенасть там проста зверская:
В окно вписан фрейм, в него вью, в него Проперти щит, в него 3 вкладки, в первую вкладку, врейм с 3-я форм вью, и в каждом из них чтото есть...

Поетому я передаю сообщение дальше а там разбираюся в какую вкладку пойдёт.

Вообще такая реализация мне понравилась, может есть какиенибудь пожелания.

Но у меня тут осталась проблемма, сообщение доходит до нужного вида в месадж мапе всё прописано, но она не срабатывает и какимто образом  стразу приходит в вид в чилдфрейме, страным способом, щяс сижу разбираюсь.

Добавлено @ 12:29 
У меня что-то подозрения на функцию OnCommand, я не знаю какую роль создатели MFC отвели ей? 

Автор: Earnest 9.6.2006, 14:50
Цитата(Rapalex @  9.6.2006,  13:23 Найти цитируемый пост)
сообщение доходит до нужного вида в месадж мапе всё прописано, но она не срабатывает и какимто образом  стразу приходит в вид в чилдфрейме

Не совсем понятно, доходит оно куда надо или не доходит...

Из твоего кода следует, что, даже если фокус находится с потомке контрол-бара, то сообщение может отправиться в chilld-frame, если никто его никто не обработал (в первом if возвращается false)... Это так и задумано?

Кстати, false может вернуться даже в том случае, если обработчик есть: например в виде команды COMMAND_EX: вернул там false и привет... Может, в этом дело?

А вообще отследить несложно: если команда попадает куда надо, а потом - куда не надо, поставь точку прерывания на первый обработчик, и проследи какого ...
А если команда не попадает, куда надо, поставь условную точку прерывания в CMainFrm::OnCmdMsg на эту команду, только отшиби апдейты (pExtra и pHandlerInfo д.б. 0), а то задолбают...  

Автор: Rapalex 9.6.2006, 15:09
Получилось.

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

Ну я перегрузил, иф поставил и заработало.

Спасибо!!!

 smile  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)