Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как из одного View10 обращаться к членам View11 и наоборот ???

9.4K
07 апреля 2005 года
TanaT
12 / / 07.04.2005
Привет всем!!!
У меня есть MDI окно. ChildFrame разбиваю на 4 фрейма (припустим View00, View01, View10, View11). Как из одного View10 обращаться к членам View11 и наоборот ???
:???:
488
07 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Если я правильно понял, тогда ты используешь CSplitterWindow. Тогда может использовать ф-ию CWnd* GetPane(int row, int col); ?

Или можно получить Document для View
 
Код:
CDocument *pDoc = GetDocument();
POSITION posView = pDoc->GetFirstViewPosition();
while(posView!=NULL)
{
  CView *pView = pDoc->GetNextView(posView);
  ...
}
9.4K
07 апреля 2005 года
TanaT
12 / / 07.04.2005
void CProfileView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
CClientDC ClientDC (this);
int x;

CWnd* pWnd = ((CChildFrame*) AfxGetApp()->GetMainWnd())->m_wndSplitter.GetPane( 1, 1);
CImageView* pImageView = DYNAMIC_DOWNCAST( CImageView, pWnd);

for(int i=0; i<=2000; i++)
x = pImageView->GetIntensity (i);

}

Компилится, но при запуске видаёт ошибки, и закрывается. Без строки x = pImageView->GetIntensity (i); аналогичная ситуация.
Как правильно получить указатель на фрейм CImageView?
_____________________________
| ............| CProfileXView |
|-------------|---------------|
|CProfileYView| CImageView |
-----------------------------
Фактически фрейм (1,1) загруает *.bmp картинку, а в фреймах CProfileXView і CProfileYView нада нарисовать профиль этого изображения.
488
07 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Панели создаются правильно?

Их нужно создать в OnCreateClient, напр.
Код:
if(!m_wnd_Splitter.CreateStatic(this,2,2))
{
  TRACE("Не создаются статические splittera.");
  return FALSE;
}
//вставим первую панель
if(!m_wnd_Splitter.CreateView(0,0,RUNTIME_CLASS(CProfileView),CSize(..,..), pContext))
{
  TRACE("Проблема с созданием CProfileView");
  return FALSE;
}
if(!m_wnd_Splitter.CreateView(0,1,RUNTIME_CLASS(CProfileXView),CSize(..,..), pContext))
{
  TRACE("Проблема с созданием CProfileXView");
  return FALSE;
}
if(!m_wnd_Splitter.CreateView(1,0,RUNTIME_CLASS(CProfileYView),CSize(..,..), pContext))
{
  TRACE("Проблема с созданием CProfileYView");
  return FALSE;
}
if(!m_wnd_Splitter.CreateView(1,1,RUNTIME_CLASS(CImageView),CSize(..,..), pContext))
{
  TRACE("Проблема с созданием CImageView");
  return FALSE;
}
SetActiveView((CView *)m_wndSplitter.GetPane(0,0));
return TRUE;

Но интересно было бы посмотреть какие выдаются ошибки. Конечно только если в них нет ничего личного :).
9.4K
07 апреля 2005 года
TanaT
12 / / 07.04.2005
Панели создаются правильно!
Именно так, как ты написал.
В OnCreateClient (В ChildFrm.cpp).

Ошибка:
Debug Assertion Failed!
Program:F\USER\SiriuS\Image\Debug\Image.exe
File: winsplit.cpp
Line: 361

For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

А также аналогичные ошибки, если нажать "Пропустить" Line: 347, 351, 76, 364.
488
07 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Судя по ошибкам, не работает getPane. При его вызове панель 1, 1 еще не создан. Нужно бы определить глобальную переменную, при создании
CImageView записать в него true. И вызывать getPane в OnDraw, только если эта переменная равнв true. Хотя наверно можно использовать и локальную переменную и не вызывать GetPane при ПЕРВОМ OnDraw. Не исключено, что нужно будет переопределить CreateView, так как создаваемые View разные.
Код:
BOOL CMySplitterWindow::CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext )
{
  if(row==0)
  {
    if(col==0)
    {
      return CSplitterWindow::CreateView(row, col, RUNTIME_CLASS(CProfileView), sizeInit, pContext);
    }
    else
    {
      return CSplitterWindow::CreateView(row, col, RUNTIME_CLASS(CProfileXView), sizeInit, pContext);
    }
  }
  else
  {
  ...
  }
}
9.4K
07 апреля 2005 года
TanaT
12 / / 07.04.2005
Не вызываю getPane в OnDraw первый раз. Но как только я её вызываю, выскакивают указаные ошибки.
Сделал аналог для SDI - пашет как нада с этим кодом:

CWnd *pWnd =((CMainFrame*)AfxGetApp()->GetMainWnd())->m_wndSplitter.GetPane( 1, 1);
CProfileYView *pYView = DYNAMIC_DOWNCAST( CProfileYView, pWnd);

Разница только в том, что OnCreateClient для SDI находится в MainFrm.cpp, а для MDI - ChildFrm.cpp.
488
07 апреля 2005 года
Mоngооsе
465 / / 01.04.2005
Вообще-то m_wndSplitter не создан. Т.е. ты получаешь неправильный указатель. Может
 
Код:
CChildFrame *pFrameWnd = (CChildFrame *)GetParentFrame();
  ASSERT_VALID(pFrameWnd);
  CWnd *pWnd = pFrameWnd->m_wndSplitter.GetPane(1, 1);

Кроме этого можно бы написать в OnCreate событие CImageView команду AfxMessageBox("Hi from CImageView!"); чтоб знать создается он или нет.
9.4K
07 апреля 2005 года
TanaT
12 / / 07.04.2005
Работает!
Большое спасибо за помощь!
Родина Вас не забудет!
;)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог