Aggiunta di una pagina di proprietà (Esercitazione di ATL, parte 6)
Nota
La Creazione guidata provider OLE DB ATL non è disponibile in Visual Studio 2019 e versioni successive.
Le pagine delle proprietà vengono implementate come oggetti COM separati, che ne permettono la condivisione se necessario. In questo passaggio verranno eseguite le attività seguenti per aggiungere una pagina delle proprietà al controllo:
Creazione della risorsa pagina delle proprietà
Aggiunta di codice per creare e gestire la pagina delle proprietà
Aggiunta della pagina delle proprietà al controllo
Creazione della risorsa pagina delle proprietà
Per aggiungere la pagina delle proprietà al controllo, usare il modello Pagina delle proprietà ATL.
Per aggiungere una pagina delle proprietà
In Esplora soluzioni fare clic con il pulsante destro del mouse su
Polygon
.Scegliere Aggiungi>Nuovo elemento dal menu di scelta rapida.
Nell'elenco dei modelli selezionare ATL>Pagina delle proprietà ATL e fare clic su Aggiungi.
Quando viene visualizzata la Creazione guidata pagina delle proprietà ATL, immettere PolyProp come nome in Nome breve.
Fare clic su Stringhe per aprire la pagina Stringhe e immettere &Polygon come Titolo.
Il valore di Titolo della pagina delle proprietà è la stringa visualizzata nella scheda per la pagina. Il valore di Stringa doc è una descrizione usata da una finestra delle proprietà per inserire una riga di stato o una descrizione comando. Si noti che la finestra delle proprietà standard attualmente non usa questa stringa e di conseguenza è possibile lasciarla con il contenuto predefinito. Poiché al momento non si genererà un file della Guida, eliminare la voce nella casella di testo.
Fare clic su Fine perché venga creato l'oggetto pagina delle proprietà.
Vengono creati i file seguenti:
File | Descrizione |
---|---|
PolyProp.h | Contiene la classe C++ CPolyProp , che implementa la pagina delle proprietà. |
PolyProp.cpp | Include il file PolyProp.h. |
PolyProp.rgs | Script del Registro di sistema che registra l'oggetto pagina delle proprietà. |
Vengono anche apportate le modifiche seguenti al codice:
La nuova pagina delle proprietà viene aggiunta alla mappa di voci dell'oggetto in Polygon.cpp.
La classe
PolyProp
viene aggiunta al file Polygon.idl.Il nuovo file di script del Registro di sistema Polyprop.rgs viene aggiunto alla risorsa del progetto.
Un modello di finestra di dialogo viene aggiunto alla risorsa del progetto per la pagina delle proprietà.
Le stringhe delle proprietà specificate vengono aggiunte alla tabella delle stringhe delle risorse.
Aggiungere ora i campi che dovranno essere visualizzati nella pagina delle proprietà.
Per aggiungere campi alla pagina delle proprietà
In Esplora soluzioni fare doppio clic sul file di risorse Polygon.rc. Verrà visualizzata la finestra Visualizzazione risorse.
In Visualizzazione risorse espandere il nodo
Dialog
e fare doppio clic suIDD_POLYPROP
. Si noti che la finestra di dialogo visualizzata è vuota, ad eccezione di un'etichetta che indica di inserire qui i controlli.Selezionare l'etichetta e modificarla in modo che indichi
Sides:
modificando il testo Didascalia nella finestra Proprietà.Ridimensionare la casella dell'etichetta in base alle dimensioni del testo.
Trascinare un elemento Controllo di modifica dalla Casella degli strumenti a destra dell'etichetta.
Infine, modificare il valore di ID del controllo di modifica in
IDC_SIDES
usando la finestra Proprietà.
Questa operazione completa il processo di creazione della risorsa pagina delle proprietà.
Aggiunta di codice per creare e gestire la pagina delle proprietà
Ora che è stata creata la risorsa pagina delle proprietà, è necessario scrivere il codice di implementazione.
Prima di tutto, abilitare la classe CPolyProp
per impostare il numero di lati dell'oggetto quando viene premuto il pulsante Applica.
Per modificare la funzione Applica per impostare il numero di lati
Sostituire la funzione
Apply
in PolyProp.h con il codice seguente:STDMETHOD(Apply)(void) { USES_CONVERSION; ATLTRACE(_T("CPolyProp::Apply\n")); for (UINT i = 0; i < m_nObjects; i++) { CComQIPtr<IPolyCtl, &IID_IPolyCtl> pPoly(m_ppUnk[i]); short nSides = (short)GetDlgItemInt(IDC_SIDES); if FAILED(pPoly->put_Sides(nSides)) { CComPtr<IErrorInfo> pError; CComBSTR strError; GetErrorInfo(0, &pError); pError->GetDescription(&strError); MessageBox(OLE2T(strError), _T("Error"), MB_ICONEXCLAMATION); return E_FAIL; } } m_bDirty = FALSE; return S_OK; }
Poiché a una pagina delle proprietà può essere collegato più di un client per volta, la funzione Apply
esegue un ciclo e chiama put_Sides
in ogni client con il valore recuperato dalla casella di modifica. Viene usata la classe CComQIPtr, che esegue QueryInterface
su ogni oggetto per ottenere l'interfaccia IPolyCtl
dall'interfaccia IUnknown
(archiviata nella matrice m_ppUnk
).
Il codice verifica ora che l'impostazione della proprietà Sides
funzioni effettivamente. In caso contrario, il codice visualizza una finestra di messaggio contenente i dettagli dell'errore dall'interfaccia IErrorInfo
. In genere, un contenitore richiede un oggetto per l'interfaccia ISupportErrorInfo
e chiama prima InterfaceSupportsErrorInfo
per determinare se l'oggetto supporta l'impostazione delle informazioni sugli errori. È possibile ignorare questa attività.
CComPtr gestisce automaticamente il conteggio dei riferimenti, in modo che non sia necessario chiamare Release
nell'interfaccia. CComBSTR
semplifica l'elaborazione delle stringhe BSTR, per evitare di effettuare la chiamata SysFreeString
finale. È necessario usare una delle diverse classi di conversione delle stringhe in modo da poter convertire la stringa BSTR se necessario (questo è il motivo per cui la macro USES_CONVERSION è all'inizio della funzione).
È anche necessario impostare il flag di stato modificato ma non salvato della pagina delle proprietà per indicare che il pulsante Applica deve essere abilitato. Questo si verifica quando l'utente modifica il valore nella casella di modifica Sides.
Per gestire il pulsante Applica
In Visualizzazione classi fare clic con il pulsante destro del mouse su
CPolyProp
e scegliere Proprietà dal menu di scelta rapida.Nella finestra Proprietà fare clic sull'icona Eventi.
Espandere il nodo
IDC_SIDES
nell'elenco di eventi.Selezionare
EN_CHANGE
e dal menu a discesa a destra fare clic su <Aggiungi> OnEnChangeSides. Verranno aggiunte la dichiarazione del gestoreOnEnChangeSides
a PolyProp.h e l'implementazione del gestore a PolyProp.cpp.
È ora necessario modificare il gestore.
Per modificare il metodo OnEnChangeSides
Aggiungere il codice seguente in PolyProp.cpp al metodo
OnEnChangeSides
(eliminando tutto il codice inserito dalla procedura guidata):LRESULT CPolyProp::OnEnChangeSides(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) { SetDirty(TRUE); return 0; }
OnEnChangeSides
verrà chiamato quando viene inviato un messaggio WM_COMMAND
con la notifica EN_CHANGE
per il controllo IDC_SIDES
. OnEnChangeSides
chiama quindi SetDirty
e passa TRUE per indicare che la pagina delle proprietà è ora modificata ma non salvata e che il pulsante Applica deve essere abilitato.
Aggiunta della pagina delle proprietà al controllo
Il modello Pagina delle proprietà ATL e la procedura guidata non aggiungono automaticamente la pagina delle proprietà al controllo, perché il progetto potrebbe includere più controlli. È necessario aggiungere una voce alla mappa delle proprietà del controllo.
Per aggiungere la pagina delle proprietà
Aprire PolyCtl.h e aggiungere queste righe alla mappa delle proprietà:
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT) PROP_PAGE(CLSID_PolyProp)
La mappa delle proprietà del controllo sarà simile alla seguente:
BEGIN_PROP_MAP(CPolyCtl)
PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
#ifndef _WIN32_WCE
PROP_ENTRY_TYPE("FillColor", DISPID_FILLCOLOR, CLSID_StockColorPage, VT_UI4)
#endif
PROP_ENTRY_TYPE("Sides", 1, CLSID_PolyProp, VT_INT)
PROP_PAGE(CLSID_PolyProp)
// Example entries
// PROP_ENTRY("Property Description", dispid, clsid)
// PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()
È possibile aggiungere una macro PROP_PAGE
con il CLSID della pagina delle proprietà, ma se si usa la macro PROP_ENTRY
come mostrato, viene salvato anche il valore della proprietà Sides
quando viene salvato il controllo.
I tre parametri per la macro sono la descrizione della proprietà, il DISPID della proprietà e il CLSID della pagina delle proprietà che contiene la proprietà. Questo è utile, ad esempio, quando si carica il controllo in Visual Basic e si imposta il numero di lati in fase di progettazione. Poiché il numero di lati viene salvato, quando si ricarica il progetto di Visual Basic verrà ripristinato.
Compilazione e test del controllo
Compilare ora il controllo e inserirlo in ActiveX Control Test Container. In Test Container scegliere Oggetto classe PolyCtl dal menu Modifica. Viene visualizzata la pagina delle proprietà con le informazioni aggiunte.
Il pulsante Applica è inizialmente disabilitato. Iniziare a digitare un valore nella casella Sides e il pulsante Applica verrà abilitato. Dopo aver immesso il valore, fare clic sul pulsante Applica. Il controllo visualizza le modifiche e il pulsante Applica viene disabilitato di nuovo. Provare a immettere un valore non valido. Verrà visualizzata una finestra di messaggio contenente la descrizione dell'errore impostato dalla funzione put_Sides
.
Si inserirà ora il controllo in una pagina Web.
Tornare al passaggio 5 | al passaggio 7