CDocument *pDoc = GetDocument();
POSITION posView = pDoc->GetFirstViewPosition();
while(posView!=NULL)
{
CView *pView = pDoc->GetNextView(posView);
...
}
Как из одного View10 обращаться к членам View11 и наоборот ???
У меня есть MDI окно. ChildFrame разбиваю на 4 фрейма (припустим View00, View01, View10, View11). Как из одного View10 обращаться к членам View11 и наоборот ???
:???:
Или можно получить Document для View
Код:
{
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 нада нарисовать профиль этого изображения.
Их нужно создать в 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;
{
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;
Но интересно было бы посмотреть какие выдаются ошибки. Конечно только если в них нет ничего личного :).
Именно так, как ты написал.
В 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.
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
{
...
}
}
{
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
{
...
}
}
Сделал аналог для SDI - пашет как нада с этим кодом:
CWnd *pWnd =((CMainFrame*)AfxGetApp()->GetMainWnd())->m_wndSplitter.GetPane( 1, 1);
CProfileYView *pYView = DYNAMIC_DOWNCAST( CProfileYView, pWnd);
Разница только в том, что OnCreateClient для SDI находится в MainFrm.cpp, а для MDI - ChildFrm.cpp.
Код:
CChildFrame *pFrameWnd = (CChildFrame *)GetParentFrame();
ASSERT_VALID(pFrameWnd);
CWnd *pWnd = pFrameWnd->m_wndSplitter.GetPane(1, 1);
ASSERT_VALID(pFrameWnd);
CWnd *pWnd = pFrameWnd->m_wndSplitter.GetPane(1, 1);
Кроме этого можно бы написать в OnCreate событие CImageView команду AfxMessageBox("Hi from CImageView!"); чтоб знать создается он или нет.
Большое спасибо за помощь!
Родина Вас не забудет!
;)