Список фреймов в MDI приложении
|
Чтобы сделать перебор всех фреймов в приложении, нужно перебрать все документы. В каждом из них перебрать все виды и получить родительский фрэйм для каждого вида. Проблема в том, что в одном фрэйме может быть несколько видов, разделенных сплиттером к примеру. В этом случае этот фрейм попадется нам несколько раз. Запоминать все фрэймы и сравнивать с текущим не самая лучшая идея. Но в MFC все фрэймы одного документа пронумерованы и номер фрэйма находится в переменной: int CFrameWnd::m_nWindowЭта переменная принимает следующие значения: -1 - неизвестное окно. 0 - единственный фрэйм у документа. 1, 2, и т.д. - номер фрэйма, если у документа их несколько.
int CountFrames() { CDocManager* pDocManager = AfxGetApp()->m_pDocManager; int nFrameCount = 0; POSITION posTemplate = pDocManager->GetFirstDocTemplatePosition(); while(posTemplate) { CDocTemplate* pTemplate = pDocManager->GetNextDocTemplate(posTemplate); POSITION posDoc = pTemplate->GetFirstDocPosition(); while(posDoc) { CDocument* pDoc = pTemplate->GetNextDoc(posDoc);
// Пометим все видимые фрэймы как непосчитанные. POSITION posView = pDoc->GetFirstViewPosition(); while(posView) { CView* pView = pDoc->GetNextView(posView); if (pView->IsWindowVisible()) // Не считаем невидимые окна. { CFrameWnd* pFrame = pView->GetParentFrame(); if (pFrame != NULL) pFrame->m_nWindow = -1; } }
// Считаем фрэймы. int nFrames = 0; posView = pDoc->GetFirstViewPosition(); while(posView) { CView* pView = pDoc->GetNextView(posView); if (pView->IsWindowVisible()) // Не считаем невидимые окна. { CFrameWnd* pFrame = pView->GetParentFrame(); if (pFrame != NULL && pFrame->m_nWindow == -1) { // Пометим фрэйм как подсчитанный. // Номер фрэйма должен быть больше нуля. pFrame->m_nWindow = ++nFrames;
// Вот сюда можно вставить какие-то действия над фрэймом. // pFrame->DoSomething(); } } }
// Если открытый фрэйм для этого документа один, надо пометить его нулем. if(nFrames == 1) { posView = pDoc->GetFirstViewPosition(); while(posView) { CView* pView = pDoc->GetNextView(posView); if (pView->IsWindowVisible()) // Не считаем невидимые окна. { CFrameWnd* pFrame = pView->GetParentFrame(); if (pFrame != NULL) { pFrame->m_nWindow = 0; // Единственный открытый фрэйм нельзя закрывать без сохранения. // MFC закрывает фрэймы помеченные не нулем без сохранения. } } } }
nFrameCount += nFrames; } }
return nFrameCount; } Примечание: в классе документа есть функция подсчета фрэймов. void CDocument::UpdateFrameCounts();Идея взята из этой функции.
Если есть какие-то замечания, предложения или что-то еще, то пишите:
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
.
| | Список фреймов в MDI приложении | A: (
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
) Оригинальная ссылка: нету
Чтобы сделать перебор всех фреймов в приложении, нужно перебрать все документы. В каждом из них перебрать все виды и получить родительский фрэйм для каждого вида. Проблема в том, что в одном фрэйме может быть несколько видов, разделенных сплиттером к примеру. В этом случае этот фрейм попадется нам несколько раз. Запоминать все фрэймы и сравнивать с текущим не самая лучшая идея. Но в MFC все фрэймы одного документа пронумерованы и номер фрэйма находится в переменной: int CFrameWnd::m_nWindowЭта переменная принимает следующие значения: -1 - неизвестное окно. 0 - единственный фрэйм у документа. 1, 2, и т.д. - номер фрэйма, если у документа их несколько.
int CountFrames() { CDocManager* pDocManager = AfxGetApp()->m_pDocManager; int nFrameCount = 0; POSITION posTemplate = pDocManager->GetFirstDocTemplatePosition(); while(posTemplate) { CDocTemplate* pTemplate = pDocManager->GetNextDocTemplate(posTemplate); POSITION posDoc = pTemplate->GetFirstDocPosition(); while(posDoc) { CDocument* pDoc = pTemplate->GetNextDoc(posDoc);
// Пометим все видимые фрэймы как непосчитанные. POSITION posView = pDoc->GetFirstViewPosition(); while(posView) { CView* pView = pDoc->GetNextView(posView); if (pView->IsWindowVisible()) // Не считаем невидимые окна. { CFrameWnd* pFrame = pView->GetParentFrame(); if (pFrame != NULL) pFrame->m_nWindow = -1; } }
// Считаем фрэймы. int nFrames = 0; posView = pDoc->GetFirstViewPosition(); while(posView) { CView* pView = pDoc->GetNextView(posView); if (pView->IsWindowVisible()) // Не считаем невидимые окна. { CFrameWnd* pFrame = pView->GetParentFrame(); if (pFrame != NULL && pFrame->m_nWindow == -1) { // Пометим фрэйм как подсчитанный. // Номер фрэйма должен быть больше нуля. pFrame->m_nWindow = ++nFrames;
// Вот сюда можно вставить какие-то действия над фрэймом. // pFrame->DoSomething(); } } }
// Если открытый фрэйм для этого документа один, надо пометить его нулем. if(nFrames == 1) { posView = pDoc->GetFirstViewPosition(); while(posView) { CView* pView = pDoc->GetNextView(posView); if (pView->IsWindowVisible()) // Не считаем невидимые окна. { CFrameWnd* pFrame = pView->GetParentFrame(); if (pFrame != NULL) { pFrame->m_nWindow = 0; // Единственный открытый фрэйм нельзя закрывать без сохранения. // MFC закрывает фрэймы помеченные не нулем без сохранения. } } } }
nFrameCount += nFrames; } }
return nFrameCount; } Примечание: в классе документа есть функция подсчета фрэймов. void CDocument::UpdateFrameCounts();Идея взята из этой функции. | |