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