Приветствую Вас ГостьПонедельник, 07.07.2025, 08:59

Light Midnight Inc.


Каталог статей

Главная » Статьи » Программирование » С/С++/MFC

Вид без фрейма, на обычном окне
Что для этого нужно:

1. CWnd *pParentWnd - родительское окно.
2. CDocument* pDoc - документ, для которого вы хотите создать вид.
3. CRect rect - положение вида на родителе.
4. CRuntimeClass* pViewClass - runtime class нового вида.
5. UINT nViewID - идентификатор вида на его родителе.

Вот такая функция по этим параметрам создаст новый вид:
CView* CreateDlgView(CWnd *pParentWnd, CDocument* pDoc, CRect rect, CRuntimeClass* pViewClass, UINT nViewID)
{
    // Сначало мы создаем экземпляр класса вида.
    CView* pView = (CView*) pViewClass->CreateObject();
    
    // Теперь для создания вида нам нужно заполнить структуру CCreateContext
    CCreateContext CreateContext;
    CreateContext.m_pCurrentDoc    = pDoc; // Документ, для которого создаем вид.
    CreateContext.m_pCurrentFrame    = NULL;
    CreateContext.m_pLastView    = NULL;

    CreateContext.m_pNewDocTemplate    = pDoc->GetDocTemplate(); // Шаблон документа.
    CreateContext.m_pNewViewClass    = pViewClass; // runtime class вида.

    // Вот здесь мы создаем окно вида на его родителе.
    if (!pView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
        rect, pParentWnd, nViewID, &CreateContext))
    {
        return NULL;        
    }

    // Первая функция, которую мы должны вызвать после создания вида, это OnInitialUpdate()
    pView->OnInitialUpdate();
    // Перерисуем вид.
    pView->RedrawWindow();

    // И все готово. Теперь мы можем его использовать как обычный контрол.
    return pView;
}
Примечание:
Когда уничтожается документ, он удаляет все виды, привязанные к нему. При удалении, вида, документ ищет среди родителей вида первый попавшийся фрейм и уничтожает. Такая ситуация чревата опасностями. Когда я делал в MDI приложении дополнительный вид справа для каждого документа, то столкнулся с ситуацией когда при закрытии одного из документов у меня закрывалось все приложение. Проблема оказалась в том, что мой дополнительный вид расположен на контрол баре, который расположен на главном фрейме. При закрытии одного из документов, этот документ сначала удалял главный вид и CChildFrame, на котором этот вид расположен. Потом документ удалял второй, дополнительный вид, ближайшим родительским фреймом для которого, был CMainFrame. Соответственно он удалял главное окно приложения.

Происходит это в функции void CDocument::OnCloseDocument(). Вот кусок кода из нее, в которой удаляются все виды и их фреймы.
    while (!m_viewList.IsEmpty())
    {
        // get frame attached to the view
        CView* pView = (CView*)m_viewList.GetHead();
        ASSERT_VALID(pView);
        CFrameWnd* pFrame = pView->GetParentFrame();
        ASSERT_VALID(pFrame);

        // and close it
        PreCloseFrame(pFrame);
        pFrame->DestroyWindow();
            // will destroy the view as well
    }
Если переопределить эту функцию, то можно избежать такой ситуации.
Категория: С/С++/MFC | Добавил: Cromartie (22.08.2012)
Просмотров: 457 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Оцените мой сайт
Всего ответов: 543
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Реклама
Cheсking
Часы
Мини-чат
200
Друзья Сайта
  • Light Midnight - Ваша Еда
  • Light Midnight - Anim as life style
  • Поиск