Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос на соображалку, Если не стандартный каркас! 
V
    Опции темы
Rapalex
Дата 8.6.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



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

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

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

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

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

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

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


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Earnest
Дата 8.6.2006, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А как насчет GetFocus? Неужели не поможет? 


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



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

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


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Rapalex
Дата 8.6.2006, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Сделал так:

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

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

И что делать?

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


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Earnest
Дата 8.6.2006, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

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


--------------------
...
PM   Вверх
Rapalex
Дата 9.6.2006, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Код в главной раме:
Код

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 отвели ей? 

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  View.jpg 24,33 Kb


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
Earnest
Дата 9.6.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

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

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

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

Это сообщение отредактировал(а) Earnest - 9.6.2006, 14:52


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

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



Получилось.

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

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

Спасибо!!!

 smile  


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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