C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Список фреймов в MDI приложении / MFC / Visual C++

Список фреймов в MDI приложении
A: (Leprecon)
Оригинальная ссылка: нету

Чтобы сделать перебор всех фреймов в приложении, нужно перебрать все документы. В каждом из них перебрать все виды и получить родительский фрэйм для каждого вида. Проблема в том, что в одном фрэйме может быть несколько видов, разделенных сплиттером к примеру. В этом случае этот фрейм попадется нам несколько раз. Запоминать все фрэймы и сравнивать с текущим не самая лучшая идея. Но в 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();Идея взята из этой функции.

Если есть какие-то замечания, предложения или что-то еще, то пишите:
leprecon@pisem.net.
Содержание Обсудить на форуме « Предыдущая статья | Следующая статья »
Список фреймов в MDI приложении
A: (Leprecon)
Оригинальная ссылка: нету

Чтобы сделать перебор всех фреймов в приложении, нужно перебрать все документы. В каждом из них перебрать все виды и получить родительский фрэйм для каждого вида. Проблема в том, что в одном фрэйме может быть несколько видов, разделенных сплиттером к примеру. В этом случае этот фрейм попадется нам несколько раз. Запоминать все фрэймы и сравнивать с текущим не самая лучшая идея. Но в 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();Идея взята из этой функции.

Если есть какие-то замечания, предложения или что-то еще, то пишите:
leprecon@pisem.net.