Newsgroup: it.comp.lang.c++
Titolo: Ma come fanno le MFC?

A tutti i conoscitori di MFC,
    Scrivendo una piccola gerarchia di classi che incapsulino le funzioni
dell'SDK, mi e' sorto il seguente dubbio:
Come fanno le classi dei controlli (come CButton e derivate) a intercettare
messaggi come WM_CREATE?
Quel messaggio e' mandato direttamente dalla CreateWindow, quindi prima che
la finestra possa essere eventualmente subclassata. E senza subclassing,
l'unico modo che io conosca per gestire i messaggi di una finestra e'
registrarsi una WindowClass con una propria WindowProc; ma non mi sembra
credibile che abbiano riscritto interamente tutti i conntrolli... e dunque?
Che trucco hanno usato?
Grazie per le risposte,
    Al

Prova a leggere questo tutorial su come progettare una 'gerarchia di
classi che incapsulino le API di Windows'.
E' molto interessante.
http://www.relisoft.com/win32/winnie.html
massimo

messaggi come WM_CREATE?
In buona parte grazie alla magia di SetWindowsHookEx,
che MFC si premura sempre di piazzare attorno alle sue
chiamate di CreateWindowsEx attraverso la funzioncina
di utilita` AfxHookWindowCreate.  Cosi` va in esecuzione
al momento giusto _AfxCbtFilterHook, che non fa nulla a
meno che non veda un HCBT_CREATEWND -- nel qual
caso il subclassing puo` gia` farlo (con mille precauzioni
per compatibilita` Win32s ecc ecc, ovviamente), ecc ecc.
I sorgenti delle MFC non sono certo una grande scuola di
progettazione ad oggetti, ma come scuola di trucchistica
Windows sono istruttivi assai -- scuola molto avanzata, OK,
non consiglierei mai di guardarli a chi non sappia il Petzold
a memoria, e comunque il Wingo e Shepherd e` un buon
Virgilio da avere a mano se si deve passare da questa
selva oscura (oops, mo' Alighieri s'arrabbia...!)...
I sorgenti ATL, specificamente ATLWIN .H e .CPP, sono
una scuola molto diversa -- un "guscio" molto piu` scarno
ed essenziale, un'implementazione a colpi di thunk in
linguaggio macchina, veramente "pugilato senza i
guantoni", affascinante... in questo caso, l'approccio
[tutto sommato piu` limpido, secondo me] e` di usare
il subclassing [senza trucchissimi alla MFC...] quando
si puo`, ma, quando si deve (ad esempio per avere un
bottone che pero` fa cose strane alla creazione), si
fa invece il _superclassing_... derivi da CWindowImpl,
usi la macro DECLARE_WND_SUPERCLASS, con
argomento il nome della classe che stai superclassando;
lei registra una nuova classe di finestre, che usa la
CWindowImpl::WindowProc, che ti da` una prima
chance di processare qualsiasi messaggio attraverso
la tua mappa di messaggi, ma poi, se tu non lo hai
"interamente processato", lo passa alla winproc della
classe che hai superclassato.  Il superclassing e` una
tecnica molto valida per questo tipo di esigenze, anche
se il subclassing, naturalmente, e` piu` agevole per
tanti altri casi (infatti CWindowImpl, e ATL in genere,
ti offre ottimo supporto per entrambi, completo dei
vari thunk assembler -- per tutte le architetture di
CPU supportate da W/NT, tra l'altro -- per i casi in
cui usandoli si possa risparmiare un byte o un ciclo
di macchina...).
Ci sono vari altri "framework" per Windows in giro per
la rete, per esempio VWCL, ora alla URL:
 
http://www.barnstormer-software.com/vwcl/
che merita studiarsi, se si e` competenti in questi
campi (o MOLTO decisi a diventarlo!-) e abbastanza
dotati e appassionati per la materia...
Alex