Il Modello Documento con Vista di MFC

Nella programmazione VC/C++ conviene utilizzare il semplice SDK per progetti piccoli o comunque applicazioni che non gestiscono documenti, altrimenti diventa quasi indispensabile ricorrere al modello di progetto Documento/Vista che offre MFC. Questo modello che separa i dati contenuti nel documento dalla loro rappresentazione a video, è molto veloce da implementare in Visual Studio, grazie ad AppWizard bastano pochi clic e si ha pronto un programma per gestire qualsiasi tipo di documento, il testo poi è già fornito utilizzando la vista RichEdit.
Il modello Documento/Vista  ha senso solo nel caso l’applicazione che si sta progettando fa uso del concetto di documento che nel caso di software design prende l’accezione di contenitore di dati di qualunque tipo: testo semplice o formattato, bitmap, dati di un database, pagina di un foglio elettronico, eccetera. Con l’adozione del modello Documento/Vista è possibile creare applicazioni SDI ( Single Document Interface ) ed MDI ( Multiple Document Interface ). Un’applicazione SDI non consente di aprire più di un documento alla volta, ad esempio Notepad di Windows, mentre un’applicazione MDI non pone limiti al numero di documenti e quindi di viste, anche di tipi diversi, che possono essere aperte ad ogni istante, ad esempio Excel, Word e molti altri.
In un’applicazione MFC che fa uso del modello Documento/Vista abbiamo la finestra principale dell’applicazione che si chiama “Frame Window”, essa contiene di solito delle “Child Frame” ( in applicazioni MDI ), la barra degli strumenti ( anche tipo Ribbon ), la barra di stato e tutti gli altri elementi come le diverse finestre mobili ( flat ). La client area della “Frame Window” è invisibile ( nelle applicazioni SDI, “Child Frame” nelle MDI ) perché sovrastata dalla “View” che a sua volta è la parte grafica del documento.
Accanto alla “Frame Window”, “View” e “Document” vi è una quarta componente che non è affatto da trascurare, si tratta del router dei messaggi. In un’applicazione Windows normale con SDK la finestra principale ha la sua window-procedure al centro del traffico dei messaggi; in un’applicazione con MFC, invece, quest’ultima filtra tutti i messaggi e li manda in giro per tutti gli oggetti istanziati finché non raggiunge l’elemento che è abilitato a trattarlo. I punti fondamentali del routing dei messaggi in MFC sono tre:

  • acquisizione e traduzione
  • distinzione tra WM_COMMAND ed altri
  • gestione degli oggetti di interfaccia

In questo articolo non dobbiamo di certo spiegare come funzionano i messaggi in MFC, ma diciamo che una funzione virtuale importante è PreTranslateMessage che viene chiamata a partire dalla finestra che invia il messaggio per tutte quelle che le sono padre o padre del padre, la catena si arresta quando una di queste traduce il messaggio o quando quest’ultimo arriva alla finestra top-most.
Un’applicazione scritta in MFC con il modello Documento/Vista richiede al programmatore di gestire almeno queste classi:

  • CFrameWnd
  • CDocTemplate
  • CDocument
  • CView

La classe CDocTemplate ha il compito di unire i componenti fondamentali di un’architettura Document/View, naturalmente è implementata come classe astratta e le classi derivate CSingleDocTemplate e CMultiDocTemplate vengono utilizzate a seconda della natura dell’applicazione, SDI o MDI. Un template viene creato da queste poche righe di codice:

CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
   IDR_MAINFRAME,
   RUNTIME_CLASS(CMyDoc),
   RUNTIME_CLASS(CMyFrame),
   RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);

I parametri di cui ha bisogno il costruttore della classe CSingleDocTemplate sono rispettivamente l’ID della stringa del documento ( estensione del file ed altro ), i riferimenti alla nostra classe derivata del documento, alla nostra classe derivata del “Frame Window” e alla nostra classe derivata della vista. Nel caso di un’applicazione di tipo MDI i template possono essere più di uno così come le viste ed i vari documenti. Ad esempio un software che gestisca documenti di tipo testo e grafico avrà due template. Consiglio di fare delle prove con Visual Studio e vedrete che al momento dell’apertura del nuovo documento il framework farà in modo di chiedere quale tipo di template vogliamo trattare, in questo modo è possibile creare una suite di documenti gestita da una sola finestra principale.
Non entro di più nei particolari implementativi di un’applicazione Document/View, in fondo questo articolo ha lo scopo di introdurre il concetto, ma se volete posso approfondire l’argomento oppure possiamo trattarlo sul forum.

Informazioni su Giampaolo Rossi

Sviluppatore di software gestionale da oltre 28 anni.
Questa voce è stata pubblicata in VC/C++ e contrassegnata con . Contrassegna il permalink.