Newsgroup: it.comp.programmare.win32
Titolo: Subclassing

Linguaggio di programmazione: Visual C++ 6.0
S.O. Windows 98 SE
-------------------------------------------------------
Mi potreste dare qualche informazione in merito? Sia per un controllo che
per una classe.
Grazie

 ha scritto nel messaggio
news:3a28cc36.0@inetnews...

Il subclassing è un concetto di MFC utilizzato per collegare una finestra ad
una classe CWnd o derivata da essa.
Windows non sa niente di classi, di MFC o roba varia; quando viene creata un
finestra a livello di API vengono invocate le funzioni CreateWindow o
CreateWindowEx, a seguito di queste chiamate le finestre vengono create e
vengono restituiti i rispettivi HANDLE.
MFC però deve darti la possibilità di manipolare queste finestre attraverso
una classe CWnd o derivata da essa.
Per prima cosa il membro m_hWnd di CWnd viene impostato con l'hwnd ritornato
dalla CreateWindow(Ex).
Per seconda cosa MFC ti deve permettere il "routing" dei messaggi, quindi
modifica la funzione standard di risposta ai messaggi con la funzione di
risposta di MFC (mi pare AfxWindowProc) che si occupa poi di interrogare le
mappe dei messaggi delle varie classi e di chiamare le funzioni appropriate
di risposta ai messaggi.
I due punti sopra esposti sono gli aspetti salienti del subclassing.
In genere il subclassing  è automatico; ad esempio se chiamo il metodo
Create di una CWnd, allora MFC automaticamente mi gestisce
il subclassing.
Altre volte non è automatico perché potrebbe non essere necessario.
Ti faccio un esempio pratico e piuttosto tipico.
Quando crei un dialog, cosa fai.....crei il template attraverso l'editor
delle risorse.
Poi attraverso l'IDE ci abbini una CDialog tua (ad esempio CMyDialog).
In questo caso il subclassing è automatico, puoi gestire tranquillamente i
messaggi dalla tua dialog.
Per i controlli presenti sulla dialog no.
Supponiamo che tu abbia un controllo di edit sulla dialog e che tu voglia
fare in modo che si comporti in una determinata maniera (ad esempio una
formattazione numerica avanzata), coas fai ?
Ti crei una classe derivata da CEdit (supponiamo CMyEdit) e da questa classe
derivata gestisci il comportamente e le varie funzionalità.
Aggiungi alla tua dialog uno o più membri di tipo CMyEdit.
Ora devi fare in modo che il tuo controllo a video sia gestibile attraverso
il nuovo membro di tipo CMyEdit e che si comporti secondo le funzionalità
implementate in questa nuova classe.
Il subclassing in questo caso deve essere forzato.
Sempre l'IDE ti permette di fare questa operazione in maniera molto
semplice, dall'editor delle risorse.
Ti permette di associare ad ogni controllo a video una variabile membro
della classe.
Il codice aggiunto in genere è una chiamata ad una funzione DDX_Control
nella funzione DoDataExchange, che alla creazione della dialog viene
invocata e la funzione DDX_Control effettua il subclassing.
Porlock

> 
P> Il subclassing č un concetto di MFC utilizzato per collegare una finestra ad
P> una classe CWnd o derivata da essa.
P> Windows non sa niente di classi, di MFC o roba varia;
Ni. Ci sono  2 subclassing in windows, uno č  quello dei linguaggi che
sono o permettono la programmazione  ad oggetti e l'altro si riferisce
alle  window class  di  sistema,  in questo  caso  il glossario  della
documentazione del VB6 recita :
subclassing 
A  technique  that allows  an  application  to  intercept and  process
messages sent or posted to a particular window before the window has a
chance to process them. See also subclass procedure.
subclass procedure 
An  application-defined  window  procedure  that replaces  a  window's
original  window procedure  when the  window is  subclassed.  See also
subclassing, window procedure
\begin{avviso}
 
Attenzione: Leggersi lo header riguardo al mio e-mail!
Warning: read header for infos about my e-mail.
\end{avviso}
+----------------------------------------------------------------+
| Gian Uberto Lauri * "So, are you working on fixing that bug    |
| 
sa...@eng.it
      *  *now* or leaving it until later ?" - YES  |
+----------------------------------------------------------------+