TN025: documento, exibição e criação de quadro

Observação

A nota técnica a seguir não foi atualizada desde que foi incluída pela primeira vez na documentação online. Como resultado, alguns procedimentos e tópicos podem estar desatualizados ou incorretos. Para obter as informações mais recentes, é recomendável que você pesquise o tópico de interesse no índice de documentação online.

Esta nota descreve os problemas de criação e propriedade para WinApps, DocTemplates, Documentos, Quadros e Exibições.

WinApp

Há um objeto CWinApp no sistema.

Ele é construído e inicializado estaticamente pela implementação interna da estrutura de WinMain. Você deve derivar de CWinApp para fazer qualquer coisa útil (exceção: DLLs de extensão MFC não devem ter uma instância CWinApp — em vez disso, a inicialização é feita em DllMain).

O único objeto CWinApp possui uma lista de modelos de documento (uma CPtrList). Há um ou mais modelos de documento por aplicativo. DocTemplates geralmente são carregados do arquivo de recurso (ou seja, uma matriz de cadeia de caracteres) em CWinApp::InitInstance.

pTemplate = new CDocTemplate(IDR_MYDOCUMENT, ...);

AddDocTemplate(pTemplate);

O único objeto CWinApp possui todas as janelas de quadro no aplicativo. A janela de quadro principal para o aplicativo deve ser armazenada em CWinApp::m_pMainWnd. Geralmente, você define m_pMainWnd na implementação InitInstance se não tiver deixado o AppWizard fazer isso por você. Para a SDI (interface de documento único), essa é uma CFrameWnd que serve como a janela principal do quadro do aplicativo, bem como a única janela de quadro de documento. Para a MDI (várias interfaces de documento), essa é um Quadro de MDI (classe CMDIFrameWnd) que serve como a janela principal do quadro do aplicativo que contém todos os CFrameWnd filhos. Cada janela filho é de classe CMDIChildWnd (derivada de CFrameWnd) e serve como uma das potencialmente muitas janelas de quadros de documentos.

DocTemplates

O CDocTemplate é o criador e gerente de documentos. Ele é proprietário dos documentos que cria. Se o aplicativo usar a abordagem baseada em recursos descrita abaixo, ele não precisará derivar de CDocTemplate.

Para um aplicativo de SDI, a classe CSingleDocTemplate mantém o controle de um documento aberto. Para um aplicativo de MDI, a classe CMultiDocTemplate mantém uma lista (uma CPtrList) de todos os documentos abertos no momento criados a partir desse modelo. CDocTemplate::AddDocument e CDocTemplate::RemoveDocument fornecem as funções membro virtuais para adicionar ou remover um documento do modelo. CDocTemplate é um amigo do CDocument, então podemos definir o ponteiro de voltar CDocument::m_pDocTemplate protegido para apontar de volta para o modelo que criou o documento.

CWinApp manipula a implementação padrão OnFileOpen, que, por sua vez, consultará todos os modelos de documento. A implementação inclui procurar documentos já abertos e decidir em qual formato abrir novos documentos.

CDocTemplate gerencia a associação de interface do usuário para documentos e quadros.

CDocTemplate mantém uma contagem do número de documentos sem nome.

CDocument

Um CDocument é propriedade de um CDocTemplate.

Os documentos têm uma lista de exibições abertas no momento (derivadas de CView) que estão exibindo o documento (uma CPtrList).

Os documentos não criam/destroem as exibições, mas são anexados uns aos outros depois de serem criados. Quando um documento é fechado (ou seja, por meio de Arquivo/Fechar), todas as exibições anexadas serão fechadas. Quando a última exibição em um documento for fechada (ou seja, Janela/Fechar), o documento será fechado.

A interface de CDocument::AddView, RemoveView, é usada para manter a lista de exibição. CDocument é um amigo de CView, de modo que podemos definir o ponteiro de voltar CView::m_pDocument.

CFrameWnd

Um CFrameWnd (também conhecido como quadro) desempenha a mesma função que no MFC 1.0, mas agora a classe CFrameWnd foi projetada para ser usada em muitos casos sem derivar uma nova classe. As classes derivadas CMDIFrameWnd e CMDIChildWnd também foram aprimoradas, então muitos comandos padrão já estão implementados.

O CFrameWnd é responsável pela criação de janelas na área de cliente do quadro. Normalmente, há uma janela principal preenchendo a área de cliente do quadro.

Para uma janela de Quadro de MDI, a área de cliente é preenchida com o controle MDICLIENT, que, por sua vez, é o pai de todas as janelas de quadro Filhos de MDI. Para uma janela de Quadro de SDI ou uma janela de quadro Filho de MDI, a área de cliente geralmente é preenchida com um objeto de janela derivado de CView. No caso de CSplitterWnd, a área do cliente da exibição é preenchida com o objeto de janela CSplitterWnd e os objetos de janela derivados de CView (um por painel dividido) são criados como janelas filho do CSplitterWnd.

Confira também

Observações técnicas por número
Observações técnicas por categoria