Implementazione di una visualizzazione cartelle

Windows Shell fornisce un'implementazione predefinita della visualizzazione cartelle, nota in modo colloquiale come DefView, in modo da evitare gran parte del lavoro di implementazione dell'estensione dello spazio dei nomi. Poiché alcune funzionalità di visualizzazione non possono essere ottenute tramite visualizzazioni personalizzate, è spesso consigliabile usare l'oggetto visualizzazione cartelle di sistema predefinito al posto di una visualizzazione personalizzata. Per altre informazioni, vedere SHCreateShellFolderView. La parte restante di questo argomento illustra l'implementazione di una visualizzazione cartelle personalizzata che non può supportare le funzionalità di visualizzazione più recenti.

A differenza della visualizzazione albero, Esplora risorse non gestisce il contenuto di una visualizzazione cartella. La finestra della visualizzazione cartelle ospita invece una finestra figlio fornita dall'oggetto cartella. L'oggetto cartella è responsabile della creazione di un oggetto visualizzazione cartelle per visualizzare il contenuto della cartella nella finestra figlio.

La chiave per implementare un oggetto visualizzazione cartelle è l'interfaccia IShellView . Questa interfaccia viene usata da Esplora risorse per comunicare con l'oggetto visualizzazione cartelle. Prima di visualizzare una visualizzazione cartelle, Esplora cartelle chiama il metodo IShellFolder::CreateViewObjectimpostato su IID_IShellView dell'oggetto cartella. Creare un oggetto visualizzazione cartelle e restituire l'interfaccia IShellView . L'oggetto visualizzazione cartelle deve quindi creare una finestra figlio della finestra della visualizzazione cartelle e usare la finestra figlio per visualizzare informazioni sul contenuto della cartella.

Oltre a controllare la modalità di visualizzazione dei dati, le estensioni possono anche personalizzare una serie di funzionalità di Esplora risorse. Ad esempio, un'estensione può aggiungere elementi alla barra degli strumenti o alla barra dei menu o visualizzare informazioni sulla barra di stato.

Oggetto Visualizzazione cartelle

Un oggetto visualizzazione cartelle è un oggetto Component Object Model (COM) che espone un'interfaccia IShellView . Questo oggetto è responsabile di:

  • Creazione di una finestra figlio della finestra di visualizzazione cartelle e l'uso per visualizzare il contenuto della cartella.
  • Gestione della comunicazione con Esplora risorse.
  • Aggiunta di comandi specifici della cartella alla barra dei menu di Esplora risorse di Windows e alla barra degli strumenti e alla gestione di tali comandi quando vengono selezionati.
  • Gestione dell'interazione dell'utente con la finestra di visualizzazione cartelle, ad esempio la visualizzazione dei menu di scelta rapida o la gestione delle operazioni di trascinamento della selezione.

Questo documento illustra i primi tre argomenti. Poiché l'interazione dell'utente con la visualizzazione cartella si svolge all'interno della finestra figlio, l'oggetto visualizzazione cartelle è responsabile della gestione di come sarebbe per qualsiasi altra finestra.

Esplora risorse richiede un oggetto visualizzazione cartelle chiamando l'oggetto IShellFolder::CreateViewObjectimpostato su IID_IShellView. La procedura per la creazione di una visualizzazione cartelle è:

  1. L'oggetto cartella crea una nuova istanza dell'oggetto visualizzazione cartelle e restituisce un puntatore all'interfaccia IShellView .
  2. Esplora risorse inizializza l'oggetto visualizzazione cartelle chiamando il metodo IShellView::CreateViewWindow . Creare una finestra figlio della finestra di visualizzazione cartelle e restituire il relativo handle in Esplora risorse.
  3. L'oggetto visualizzazione cartelle usa l'interfacciaIShellBrowser di Esplora risorse per personalizzare la barra degli strumenti di Esplora risorse, la barra dei menu e la barra di stato.
  4. L'oggetto visualizzazione cartelle visualizza il contenuto della cartella nella finestra figlio.
  5. L'oggetto visualizzazione cartelle gestisce l'interazione dell'utente con la visualizzazione cartelle e qualsiasi barra degli strumenti o voci della barra dei menu specifiche della cartella.

Inizializzazione dell'oggetto Visualizzazione cartelle

Esplora risorse inizializza l'oggetto visualizzazione cartelle chiamando il metodo IShellView::CreateViewWindow . I parametri del metodo forniscono all'oggetto visualizzazione cartelle le informazioni necessarie per creare la finestra figlio che verrà usata per visualizzare il contenuto della cartella:

  • Puntatore all'interfaccia IShellView dell'oggetto visualizzazione cartelle precedente. Questo parametro può essere impostato su NULL.
  • Struttura FOLDERSETTINGS contenente le impostazioni della visualizzazione cartelle precedente.
  • Puntatore all'interfacciaIShellBrowser di Esplora risorse .
  • Struttura RECT con le dimensioni della finestra di visualizzazione cartelle.

Il metodo IShellView::CreateViewWindow viene chiamato prima che l'oggetto visualizzazione cartelle precedente venga eliminato. Il puntatore dell'interfaccia IShellView consente quindi di comunicare con l'oggetto visualizzazione cartelle precedente. Questa interfaccia è principalmente utile se la cartella precedente appartiene all'estensione e usa lo stesso schema di visualizzazione. In tal caso, è possibile comunicare con l'oggetto visualizzazione cartelle precedente per scopi come lo scambio di impostazioni private.

Un modo semplice per determinare se il puntatore IShellView appartiene all'estensione consiste nell'esporre tutti gli oggetti visualizzazione cartelle a un'interfaccia privata. Chiamare IShellView::QueryInterface per richiedere l'interfaccia privata ed esaminare il valore restituito per determinare se l'oggetto visualizzazione cartelle è uno dei propri. È quindi possibile usare un metodo privato su tale interfaccia per scambiare informazioni.

La struttura FOLDERSETTINGS contiene le impostazioni di visualizzazione della cartella precedente. L'impostazione primaria è la modalità di visualizzazione: icona grande, icona piccola, elenco o dettagli. Esiste anche un flag che contiene le impostazioni di un'ampia gamma di opzioni di visualizzazione, ad esempio se la visualizzazione deve essere allineata a sinistra. La visualizzazione della cartella deve seguire queste impostazioni per quanto possibile, per offrire agli utenti un'esperienza coerente mentre passano da una cartella a un'altra. È consigliabile archiviare questa struttura e aggiornarla come cambiano le impostazioni. Esplora risorse chiama IShellView::GetCurrentInfo per ottenere il valore più recente di questa struttura prima di aprire la visualizzazione della cartella successiva.

L'interfaccia IShellBrowser è esposta da Esplora risorse. Questa interfaccia è complementare a IShellView e consente a un oggetto visualizzazione cartelle di comunicare con Esplora cartelle. Non è possibile recuperare questo puntatore dell'interfaccia, quindi l'oggetto visualizzazione cartelle deve archiviarlo per un uso successivo. In particolare, sarà necessario chiamare IShellBrowser::GetWindow per recuperare la finestra di visualizzazione della cartella padre che verrà usata per creare la finestra figlio. Si noti che il metodo IShellBrowser::GetWindow non è incluso nella documentazione di IShellBrowser perché ereditata da IOleWindow. Dopo aver archiviato il puntatore dell'interfaccia, ricordarsi di chiamare IShellBrowser::AddRef per incrementare il numero di riferimenti dell'interfaccia. Quando non è più necessaria l'interfaccia, chiamare IShellBrowser::Release.

Per creare la finestra figlio:

  1. Esaminare le strutture FOLDERSETTINGS e RECT .
  2. Se necessario, ottenere impostazioni private dall'oggetto visualizzazione cartelle precedente.
  3. Chiamare IShellBrowser::GetWindow per recuperare la finestra di visualizzazione della cartella padre.
  4. Creare un elemento figlio della finestra di visualizzazione della cartella ottenuta nel passaggio precedente e restituirlo a Esplora risorse.

Visualizzazione della cartella

Dopo aver creato la finestra figlio e restituita in Esplora risorse, è possibile visualizzare il contenuto della cartella. In genere, le estensioni visualizzano le informazioni tramite l'host della finestra figlio di un controllo visualizzazione elenco o un controllo WebBrowser. Il controllo visualizzazione elenco consente di replicare la visualizzazione classica di Esplora risorse di Windows. Il controllo WebBrowser consente di usare un documento DHTML (Dynamic HTML) per visualizzare le informazioni, molto simile alla visualizzazione Web esplora risorse di Windows. Per altre informazioni, vedere la documentazione di tali controlli.

La finestra della visualizzazione cartelle esiste sempre, anche se non ha lo stato attivo. È quindi consigliabile mantenere tre stati per la finestra figlio:

  • Attivato con lo stato attivo. La visualizzazione cartelle è stata creata e ha lo stato attivo. Impostare la barra dei menu o le voci della barra degli strumenti appropriate per uno stato attivo.
  • Attivato senza messa a fuoco. La visualizzazione cartelle è stata creata ed è attiva, ma non ha lo stato attivo. Impostare la barra dei menu o le voci della barra degli strumenti appropriate per uno stato non incentrato. Omettere gli elementi che si applicano alla selezione di elementi all'interno della visualizzazione cartella.
  • Disattivato. La visualizzazione cartelle sta per essere eliminata. Rimuovere tutte le voci di menu specifiche della cartella.

Esplora risorse notifica all'oggetto visualizzazione cartelle quando lo stato della finestra cambia chiamando IShellView::UIActivate. A sua volta, l'oggetto visualizzazione cartelle deve inviare una notifica a Esplora cartelle quando un utente attiva la finestra della visualizzazione cartelle chiamando IShellBrowser::OnViewWindowActive. Per altre informazioni su questa interfaccia, vedere Uso di IShellBrowser per comunicare con Esplora risorse.

Mentre la visualizzazione cartelle è attiva, è necessario elaborare eventuali messaggi di Windows, ad esempio WM_SIZE, che appartengono alla finestra figlio. La procedura della finestra riceverà anche WM_COMMAND messaggi per tutti gli elementi aggiunti alla barra dei menu o alla barra degli strumenti di Esplora risorse di Windows.

Dopo aver creato la visualizzazione cartella, Esplora cartelle chiama l'interfaccia IShellView dell'oggetto visualizzazione cartelle per passarlo a un'ampia gamma di informazioni. L'oggetto deve modificare di conseguenza la visualizzazione. Quando la visualizzazione cartella sta per essere eliminata, Esplora risorse notifica all'oggetto visualizzazione cartelle chiamando il relativo metodo IShellView::D estroyViewWindow .

Implementazione di IShellView

Dopo aver creato l'oggetto cartella, Esplora risorse chiama vari metodi IShellView per richiedere informazioni o notificare l'oggetto di una modifica nello stato di Esplora risorse. Questa sezione illustra come implementare i metodi IShellView . I metodi rimanenti vengono usati per scopi più specializzati, ad esempio la finestra di dialogo Apri file comune. Per informazioni dettagliate, vedere la documentazione di IShellView .

AddPropertySheetPages

Quando un utente seleziona Opzioni cartella dal menuStrumenti di Esplora risorse di Windows, viene visualizzato un foglio delle proprietà che consente all'utente di modificare le opzioni della cartella. Esplora risorse chiama il metodo IShellView::AddPropertySheetPages della visualizzazione cartella per consentire di aggiungere una pagina a questo foglio delle proprietà.

Esplora risorse passa un puntatore a una funzione di callback AddPropSheetPageProc nel parametro lpfn di IShellView::AddPropertySheetPages. Chiamare CreatePropertySheetPage per creare la pagina e quindi chiamare AddPropSheetPageProc per aggiungerlo al foglio delle proprietà. Per altre informazioni su come gestire i fogli delle proprietà, vedere Fogli delle proprietà.

GetCurrentInfo

Quando l'utente passa da una cartella a un'altra, Esplora risorse tenta di mantenere una visualizzazione di cartelle simile. Ad esempio, se la visualizzazione cartella precedente mostra icone di grandi dimensioni, il successivo dovrebbe anche. Quando Esplora risorse chiama IShellView::CreateViewWindow per inizializzare l'oggetto visualizzazione cartelle, il metodo riceve una struttura FOLDERSETTINGS . Questa struttura contiene informazioni che consentono di rendere la visualizzazione della cartella coerente con la visualizzazione cartella precedente.

Per assicurarsi che la visualizzazione successiva sia coerente con la visualizzazione corrente, archiviare la struttura FOLDERSETTINGS . Se la visualizzazione cambia, ad esempio da icone grandi a piccole, aggiornare di conseguenza la struttura. Prima di passare le visualizzazioni, Esplora risorse chiamerà IShellView::GetCurrentInfo per richiedere ai valori FOLDERSETTINGS correnti di passarli all'oggetto di visualizzazione della cartella successiva.

Aggiorna

L'utente può assicurarsi che la visualizzazione cartella rifletta lo stato corrente della cartella selezionando Aggiorna dal menu Visualizza o premendo il tasto F5. Quando l'utente esegue questa operazione, Esplora risorse chiama il metodo IShellView::Refresh . L'oggetto visualizzazione cartelle deve aggiornare immediatamente la visualizzazione della cartella.

Saveviewstate

Esplora risorse chiama il metodo IShellView::SaveViewState per richiedere all'oggetto visualizzazione cartelle di salvare lo stato di visualizzazione. È quindi possibile recuperare lo stato alla successiva visualizzazione della cartella. Il modo preferito per salvare uno stato di visualizzazione è chiamando il metodo IShellBrowser::GetViewStateStream . Questo metodo restituisce un'interfaccia IStream che l'oggetto visualizzazione cartelle può usare per salvare lo stato. Quando si crea un'altra visualizzazione cartelle, è possibile chiamare lo stesso metodo IShellBrowser::GetViewStateStream per ottenere un puntatore IStream che consente di leggere le impostazioni salvate dalle visualizzazioni delle cartelle precedenti.

TranslateAcelerator

Quando l'utente preme un tasto di scelta rapida, Esplora risorse passa il messaggio all'oggetto visualizzazione cartella chiamando IShellView::TranslateAccelerator. Restituire S_FALSE per avere Windows Explorer elaborare il messaggio. Se l'oggetto visualizzazione cartelle ha elaborato il messaggio, restituire S_OK.

Quando la finestra della visualizzazione cartelle ha lo stato attivo, Esplora risorse chiama IShellView::TranslateAccelerator prima di elaborare il messaggio. Poiché la maggior parte dei messaggi è in genere associata ai comandi della barra dei menu o della barra degli strumenti di Windows Explorer, l'oggetto visualizzazione cartelle dovrebbe in genere restituire S_FALSE. Esplora risorse può quindi elaborare normalmente il messaggio. Restituisce S_OK solo se il messaggio è specifico della cartella e non si vuole che Esplora risorse di Windows eselabori ulteriormente. Se la visualizzazione cartella non ha lo stato attivo, Esplora risorse elabora prima il messaggio. Chiama IShellBrowser::TranslateAcceleratorSB solo se non gestisce il messaggio.

Uso di IShellBrowser per comunicare con Esplora risorse

L'interfaccia IShellBrowser viene usata dall'oggetto visualizzazione cartelle per comunicare con Esplora risorse per diversi scopi, tra cui:

Modifica della barra dei menu di Esplora risorse di Windows

La barra dei menu di Esplora risorse di Windows consente all'utente di avviare un'ampia gamma di comandi. Per impostazione predefinita, la barra dei menu supporta solo i comandi specifici di Esplora risorse. I messaggi di WM_COMMAND correlati vengono elaborati da Esplora risorse di Windows e non vengono passati all'oggetto visualizzazione cartelle. È tuttavia possibile modificare la barra dei menu in modo da includere una o più voci di menu specifiche della cartella con IShellBrowser. Esplora risorse passa i messaggi di WM_COMMAND associati di tali elementi alla routine della finestra dell'oggetto cartella per l'elaborazione. È anche possibile rimuovere o disabilitare tutti i comandi standard che non si applicano all'applicazione.

Gli oggetti visualizzazione cartelle modificano in genere la barra dei menu prima che venga visualizzata la visualizzazione cartelle. Devono restituire la barra dei menu allo stato originale quando la visualizzazione cartelle viene eliminata. Potrebbe anche essere necessario modificare la barra dei menu ogni volta che la visualizzazione cartelle ottiene o perde lo stato attivo.

Poiché Esplora risorse chiama IShellView::UIActivate ogni volta che cambia lo stato della finestra della visualizzazione cartelle, la modifica della barra dei menu viene normalmente inclusa nell'implementazione del metodo. La procedura di base per la modifica della barra dei menu di Esplora risorse di Windows è:

  1. Chiamare CreateMenu per creare un handle di menu.
  2. Passare tale handle di menu a Esplora risorse chiamando IShellBrowser::InsertMenusSB. Esplora risorse riempirà le informazioni del menu.
  3. Modificare il menu in base alle esigenze.
  4. Chiamare IShellBrowser::SetMenuSB per visualizzare la barra dei menu modificata.

Esplora risorse include sei menu popup sulla barra dei menu. Come per tutti i contenitori OLE, il menu Esplora windows è suddiviso in sei gruppi: File, Modifica, Contenitore, Oggetto, Finestra e Guida. Nella tabella seguente sono elencati i menu popup di Windows Explorer e il relativo gruppo associato, insieme agli ID del menu.

Menu a comparsa ID Gruppo
File FCIDM_MENU_FILE File
Modifica FCIDM_MENU_EDIT File
Visualizzazione FCIDM_MENU_VIEW Contenitore
Preferiti FCIDM_MENU_FAVORITES Contenitore
Strumenti FCIDM_MENU_TOOLS Contenitore
Help FCIDM_MENU_HELP Finestra

 

Quando si passa l'handle del menu a Esplora risorse chiamando IShellBrowser::InsertMenusSB, è necessario passare anche un puntatore a una struttura OLEMENUGROUPWIDTHS i cui membri sono stati inizializzati su zero.

Quando IShellBrowser::InsertMenusSB restituisce, Esplora risorse di Windows aggiungerà le voci di menu. È quindi possibile usare l'handle di menu restituito con funzioni di menu di Windows standard, ad esempio InsertMenuItem per:

  • Aggiungere elementi ai menu popup di Esplora risorse di Windows.
  • Modificare o eliminare elementi esistenti nei menu a comparsa di Esplora risorse.
  • Aggiungere nuovi menu popup.

Usare gli ID elencati nella tabella per identificare i vari menu a comparsa di Esplora risorse.

Nota

Per evitare conflitti con gli ID dei comandi di Esplora risorse, gli ID di tutte le voci di menu aggiunte devono essere compresi tra FCIDM_SHVIEWFIRST e FCIDM_SHVIEWLAST. Questi due valori sono definiti in Shlobj.h.

 

Dopo aver modificato il menu, chiama IShellBrowser::SetMenuSB per visualizzare la nuova barra dei menu.

Dopo aver visualizzato inizialmente la visualizzazione cartelle, Esplora risorse chiama IShellView::UIActivate ogni volta che la visualizzazione cartelle ottiene o perde lo stato attivo. Se sono presenti voci di menu sensibili allo stato della visualizzazione cartelle, è necessario modificare il menu di conseguenza, ogni volta che lo stato cambia. Ad esempio, potrebbe essere presente una voce di menu che agisce su un elemento nella visualizzazione cartelle selezionata dall'utente. È consigliabile disabilitare o rimuovere questa voce di menu quando la visualizzazione cartelle perde lo stato attivo.

Quando Esplora risorse chiama IShellView::UIActivate per indicare che la visualizzazione cartelle viene disattivata, ripristinare lo stato originale della barra dei menu chiamando IShellBrowser::RemoveMenusSB.

Modifica della barra degli strumenti di Esplora risorse

Oltre a modificare la barra dei menu di Esplora risorse, è anche possibile aggiungere pulsanti alla barra degli strumenti. Come per la barra dei menu, la modifica della barra degli strumenti fa in genere parte dell'implementazione IShellView::UIActivate . La procedura per aggiungere pulsanti alla barra degli strumenti di Esplora risorse è:

  1. Aggiungere la bitmap del pulsante all'elenco di immagini della barra degli strumenti.
  2. Definire la stringa di testo del pulsante.
  3. Aggiungere il pulsante alla barra degli strumenti.

Per aggiungere una bitmap all'elenco di immagini di una barra degli strumenti, inviare alla barra degli strumenti un messaggio TB_ADDBITMAP chiamando IShellBrowser::SendControlMsg. Per specificare il controllo barra degli strumenti, impostare il parametro ID del metodo su FCW_TOOLBAR. Impostare wParam sul numero di immagini del pulsante nella bitmap e lParam sull'indirizzo di una struttura TBADDBITMAP . L'indice dell'immagine viene restituito nel parametro pret .

Esistono due modi per definire una stringa per il pulsante:

  • Assegnare la stringa al membro iString della struttura TBBUTTON del pulsante.
  • Chiamare IShellBrowser::SendControlMsg per inviare il controllo della barra degli strumenti a un messaggio TB_ADDSTRING . Il parametro wParam deve essere impostato su zero e il parametro lParam sulla stringa. L'indice stringa viene restituito nel parametro pret .

Per aggiungere il pulsante alla barra degli strumenti, compilare una struttura TBBUTTON e passarla a IShellBrowser::SetToolbarItems. Come nel menu, l'ID comando deve essere compreso tra FCIDM_SHVIEWFIRST e FCIDM_SHVIEWLAST. La barra degli strumenti aggiungerà quindi il pulsante a destra dei pulsanti esistenti.

Ad esempio, il frammento di codice seguente aggiunge un pulsante standard alla barra degli strumenti di Esplora risorse con un ID comando di IDB_MYBUTTON.

TBADDBITMAP tbadbm;
int iButtonIndex;
TBBUTTON tbb;

tbadbm.hInst = g_hInstance;    // The module's instance handle
tbadbm.nID = IDB_BUTTONIMAGE;  // The bitmap's resource ID

psb->SendControlMsg(FCW_TOOLBAR, TB_ADDBITMAP, 1,
                    reinterpret_cast<LPARAM>(&tbadbm), &iButtonIndex);

psb->SendControlMsg(FCW_TOOLBAR, TB_ADDSTRING, NULL,
                    reinterpret_cast<LPARAM>(szLabel), &iStringIndex);

ZeroMemory(&tbb, sizeof(TBBUTTON));
tbb.iBitmap = iButtonIndex;
tbb.iCommand = IDB_MYBUTTON;
tbb.iString = iStringIndex;
tbb.fsState = TBSTATE_ENABLED;
tbb.fsStyle = TBSTYLE_BUTTON;

psb->SetToolbarItems(&tbb, 1, FCT_MERGE);

Per altre informazioni su come gestire i controlli della barra degli strumenti, vedere Controlli della barra degli strumenti.

Modifica della barra di stato di Esplora risorse

È possibile utilizzare la barra di stato di Esplora risorse per visualizzare un'ampia gamma di informazioni utili. Esistono due modi per usare la barra di stato:

Il primo metodo è semplice ma sufficiente per molti scopi. Per una maggiore flessibilità, è possibile inviare messaggi direttamente al controllo barra di stato chiamando IShellBrowser::SendControlMsg con il parametro id impostato su FCW_STATUS. Per altre informazioni su controlli barra di stato, vedere Barre di stato.

Archiviazione di informazioni specifiche della visualizzazione

Quando una visualizzazione sta per essere eliminata definitivamente, spesso è utile archiviare informazioni come lo stato o le impostazioni della visualizzazione. Esplora risorse richiede di eseguire questa attività chiamando IShellView::SaveViewState. Il modo migliore per salvare informazioni specifiche della visualizzazione consiste nel chiamare IShellBrowser::GetViewStateStream. Questo metodo fornisce un'interfaccia IStream che è possibile usare per archiviare le informazioni. È possibile usare qualsiasi formato di dati appropriato.