Newsgroup: it.comp.lang.c++
Titolo: Customizzare i Common Dialog Box

Utilizzando MFC 4.0 e Visual C++ 4.0, non riesco a customizzare con
miei template la classe CFileDialog. Ho provato a seguire le
istruzioni indicate dal manuale, ma, dopo aver derivato una nuova
classe da CFileDialog, AppWizard non mi permette di impostare il
Dialog Template.
Come posso fare ? Il mio scopo é quello di poter visualizzare una
piccola preview dei documenti che vengono selezionati dall'utente, a
mo' di CorelDraw o Corel PhotoPaint.
Grazie per ogni aiuto che potrete darmi.

Dialog Template.
non hai detto se stai usando la dialog stile explorer o quella vecchia
stile win3.1. Comunque in entrambi i casi e' molto semplice, l'unica
differenza e' che con la finestra vecchio stile devi prendere il
template della dialog originale e modificarlo, con la dialog tipo
explorer devi solo preparare una dialog con i controlli da aggiungere.
Una volta che hai preparato il template e derivato una classe da
CFileDialog aggiungi queste righe nel costruttore:
if (m_ofn.Flags & OFN_EXPLORER)
	m_ofn.lpTemplateName = IDD_EXPLORER_DLG;
else
	m_ofn.lpTemplateName = IDD_OLD_STYLE_DLG;
m_ofn.Flags |= OFN_ENABLETEMPLATE;
m_ofn.hInstance=AfxGetInstanceHandle();
Questa procedura da qualche parte nella documentazione dovrebbe
esserci ma sinceramente non ricordo dove.
Spero ti sia di aiuto.
Gianpaolo Bottin
- Live Long and Prosper -

m_ofn.hInstance=AfxGetInstanceHandle();
Ti prego rispondimi perché sto impazzendo.
Thanks !

Rettifico il mio precedente messaggio : sto usando un dialog di tipo
explorer. In effetti, sembra che la classe CFileDialog (e in
particolare il suo costruttore), abitiliti automaticamente lo stile
OFN_EXPLORER.
Seguendo le tue istruzioni ho preparato un nuovo template che
conteneva semplicemente uno static control. Supponiamo che tale dialog
template sia associato alla resource IDD_DIALOG1, ho provveduto a
passare questo parametro nel seguente modo :
m_ofn.lpTemplateName = MAKEINTRESOURCE(IDD_DIALOG1);
All'inizio non funzionava un bel niente (una parentesi. Ho indagato
sul perché non funzionava niente. Ho scoperto che il parametro m_ofn
viene passato a GetOpenFileName() di Win32. Questa a sua volta chiama
la funzione Dialog(). Ed é proprio in questa funzione che avvengono i
casini. Chiamando la funzione CommDlgExtendedError() ho scoperto che
l'errore di creazione é CDERR_DIALOGFAILURE (o una cosa del genere),
che rappresenta un errore verificatosi proprio dalla funzione
Dialog()).
 Poi, navigando su Internet, ho trovato un documento interessante
sulla personalizzazione di CFileDialog, che suggeriva di inserire
WS_CHILD negli style del dialog.
Modificando a mano il file .rc, inserendo il flag WS_CHILD, ottengo
che, al momento dell'apertura del Dialog, vengono aperte due finestre
separate, una contenente i mie controlli, e l'altra contenente il
vecchio Common Dialog. Ho provato a cancellare dal file WS_CHILD e a
modificare lo stile all'interno dell'Editor delle risorse di VC++.
Quest'ultimo fá si che l'unico flag presente sia proprio WS_CHILD. A
quel punto tutto sembra funzionare a dovere, tranne che, non appena
interagisco con il dialog, scompaiono tutti i controlli del FileDialog
originale, tranne la ListBox con il contenuto della directory. I
controlli sono solo apparentemente scomparsi. In effetti, se provo a
premere dove prima era posizionato un controllo, questo riappare, per
poi socmparire di nuovo.
A questo punto mi chiedo : quali sono esattamente i flag da attivare
nell'editor delle risorse del dialog ?
Grazie per l'aiuto !
 

Tu che cosa consigli ?
il template delle dialog "old style" si trova nel file FILEOPEN.DLG
che sta da qualche parte nel CD, non saprei dirti dove ma c'e' !
Nelle tue prove probabilmente la dialog non si apriva perche' non hai
tolto lo stile OFN_EXPLORER dal campo Flags, ad esempio nel
costruttore di una mia dialog ho messo:
 m_ofn.Flags|=OFN_ENABLETEMPLATE;
 m_ofn.Flags&=~OFN_EXPLORER;
 m_ofn.hInstance=AfxGetInstanceHandle();
 m_ofn.lpTemplateName=MAKEINTRESOURCE(IDD_OPENFILEDLG);
La customizzazione delle common dialog non e' difficile ma ricade in
una di quelle zone grigie dove la documentazione MS e' praticamente
inesistente. Auguri... ;-)


X Control
Tutto ok, grazie ! C'ero arrivato pure io, aprendo l'eseguibile di
CorelDraw con il resource Editor. Una cosa forse hai dimenticato : nel
dialog template che crei, devi piazzare un controllo di tipo static
text con ID = 1119. Lí dentro, Win32 piazza i controlli originali del
File Open Dialog.
Ora inveco ho un altro problema : ho creato un OCX che rappresenta uno
dei controlli da piazzare dentro il custom template. Tuttavia, se
provo ad aprire il template, Win32 si rifiuta di aprirlo.
Avevo letto aulcosa di simile negli archivi della MFC-L, a cui sto
attualmente dando un'occhiata...
se ne sai qualcosa, ti sarei molto grato !
Grazie infinite per la tua pazienza ed il tuo aiuto !

provo ad aprire il template, Win32 si rifiuta di aprirlo.
mi dispiace ma non so nulla a riguardo. Non ho mai messo un OCX su una
common dialog.


common dialog.
Thanks :-) !