Поиск:

Ответ в темуСоздание новой темы Создание опроса
> связь CView и CMainFrame, связь CView и CMainFrame 
V
    Опции темы
Maxx
Дата 28.5.2007, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня есть данные в CView которые постоянно изменяются(мною). Задача состоит в следующем: нужно вывести эти данные в строку состояния и что бы значения в строке изменялись при изменении моих значений!!!
PM MAIL   Вверх
imm
Дата 28.5.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



объект класса CMainFrame является родителем (parent) объекту клсаа CView.

Код

    CMainFrame *pFrame = (CMainFrame *)this->GetParent();
    pFrame->SetMessageText(_T("Hello from view"));


Отправляешь текстовые сообщения в стандартный StatusBar.
PM MAIL WWW ICQ   Вверх
Maxx
Дата 28.5.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пробовал так! Не работает!!! Ошибка дебагера: Debug Assertion Failed!
Может есть еще способы? smile 
PM MAIL   Вверх
zkv
Дата 28.5.2007, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



Цитата(imm @  28.5.2007,  14:40 Найти цитируемый пост)
  CMainFrame *pFrame = (CMainFrame *)this->GetParent();
    pFrame->SetMessageText(_T("Hello from view"));

 smile 

Maxx, залезаешь в класс CMainFrame, дописываешь такую функцию:
Код

CStatusBar *GetStatusBar() 

  return &m_wndStatusBar; //тут имя твоего статус бара, должно где то неподалеку валяться :)
}

потом во __View.cpp подключаешь хидер с классом CMainFrame, дальше в коде, добираешься до статус бара так:
Код

((CMainFrame *)AfxGetMainWnd())->GetStatusBar()->SetPaneText(0,  "Hello from view" );

это только один из способов  smile

Это сообщение отредактировал(а) zkv - 28.5.2007, 19:59
PM MAIL   Вверх
imm
Дата 29.5.2007, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Странно почему не заработал мой пример.
Классы производные от CView обычно имеют родителя в виде класса производного от CFrameWnd.

Согласен к zkv, перед использование приведения типа к CMainFrame* нужно подключить *.h с его описанием (по дефолту MainFrm.h)

Далее в любом месте в CView пример должен работать.
Код

CMainFrame* pFrame = (CMainFrame*)GetParent();
pFrame->SetMessageText(_T("Hello from view"));


Если же ты используешь CView способом, что он не является дочерним от фрейма главного окна (например MDI), то используй, способ предложенный zkv, только передавай сообщение не в pane с индексом 0, а используя функцию твоего фрейма SetMessageText, так как сообщения отправляются обычно в pane с ID равным ID_SEPARATOR, а он не обязательно должен иметь индекс 0.
Код

((CMainFrame *)AfxGetMainWnd())->SetMessageText(_T("Hello from view"));

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



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

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



imm, пардон, невнимательно прочитал ваши посты, про метод SetMessageText() не знал, спасибо за просвещение smile
PM MAIL   Вверх
Earnest
Дата 29.5.2007, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(imm @  29.5.2007,  17:43 Найти цитируемый пост)
Классы производные от CView обычно имеют родителя в виде класса производного от CFrameWnd

Строго говоря, это не совсем так. Например, если во фрейме сплиттер, то родителем вида является именно он, а фрейм только гм... дедом.
Есть специальная функция GetParentFrame, которая позволяет добраться от окна до фрейма-предка, не вдаваясь в подробности генеалогического древа. Ну и результат ее, конечно, нужно проверить на 0...
Кроме того, если у нас MDI, это тоже не сработает: парент-фреймом является ChildFrame, у которого нет статус-бара, так что просто ничего не произойдет.
Так что удобнее всего обращаться непосредственно к главному окну, через AfxGetMainWnd(), как написал
zkv. Только подключать MainFrame вовсе не обязательно (зачем лишние зависимости плодить), достаточно преобразовать возврат AfxGetMainWnd к CFrameWnd... Прямой доступ к строке состояния и запись в нее текста использовать не стоит: недолго оно там продержится... 


--------------------
...
PM   Вверх
Maxx
Дата 30.5.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


 




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


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

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