Controlli ActiveX MFC: utilizzo di immagini in un controllo ActiveX
In questo articolo viene descritto il tipo comune Picture e come poterlo implementare nel controllo ActiveX. Gli argomenti trattati includono
Cenni preliminari sulle proprietà personalizzate dell'immagine
Implementare una proprietà personalizzata dell'immagine nel controllo ActiveX
Aggiunte al progetto di controllo
Cenni preliminari sulle proprietà personalizzate dell'immagine
Un tipo Picture è uno di un gruppo di tipi comuni ad alcuni controlli ActiveX. Il tipo Picture gestisce metafile, bitmap o icone e consente all'utente di specificare un'immagine da visualizzare in un controllo ActiveX. Le proprietà personalizzate dell'immagine vengono implementate mediante un oggetto Picture e le funzioni Get/Set che consentono il controllo dell'accesso dell'utente alla proprietà dell'immagine. Il controllo dell'accesso degli utenti che accedono alla proprietà personalizzata dell'immagine avviene tramite la pagina predefinita delle proprietà dell'immagine.
Oltre al tipo Picture standard, anche i tipi Font e Color sono disponibili. Per ulteriori informazioni sull'utilizzo del tipo di carattere standard del controllo ActiveX, vedere l'articolo Controlli ActiveX MFC: Utilizzo dei tipi di carattere.
Le classi di controlli ActiveX forniscono diversi componenti che è possibile utilizzare per implementare la proprietà Picture nel controllo. Questi componenti includono:
La classe CPictureHolder.
Questa classe consente di semplificare l'accesso all'oggetto dell'immagine e alla funzionalità dell'elemento visualizzato dalla proprietà personalizzata dell'immagine.
Il supporto per le proprietà di tipo LPPICTUREDISP, implementate con le funzioni Get/Set.
Mediante la Visualizzazione Classi è possibile aggiungere rapidamente una proprietà personalizzata, o proprietà, che supportano il tipo Picture. Per ulteriori informazioni sulle proprietà del controllo ActiveX aggiunte mediante la Visualizzazione Classi, vedere l'articolo Controlli ActiveX MFC: Proprietà.
Una pagina delle proprietà che modifica la proprietà o le proprietà del controllo Picture.
Questa pagina delle proprietà fa parte di un gruppo di pagine delle proprietà predefinite disponibili per i controlli ActiveX. Per ulteriori informazioni sulle pagine delle proprietà dei controlli ActiveX, vedere l'articolo Controlli ActiveX MFC: Utilizzo delle pagine delle proprietà predefinite
Implementare una proprietà personalizzata dell'immagine nel controllo ActiveX
Dopo aver completato i passaggi descritti in questa sezione, il controllo può visualizzare le immagini scelte dall'utente. L'utente può modificare l'immagine visualizzata utilizzando una pagina delle proprietà che mostra l'immagine corrente e contiene un pulsante Sfoglia che consente all'utente di selezionare diverse immagini.
Una proprietà personalizzata dell'immagine viene implementata mediante un processo simile a quello utilizzato per implementare altre proprietà, la differenza principale è che la proprietà personalizzata deve supportare un tipo Picture. Poiché l'elemento della proprietà Picture deve essere disegnato dal controllo ActiveX, devono essere apportate un numero di aggiunte e modifiche alla proprietà prima che possa essere completamente implementata.
Per implementare una proprietà personalizzata dell'immagine, è necessario effettuare quanto segue:
Aggiungere il codice al controllo del progetto.
Un ID della pagina delle proprietà standard dell'immagine, un membro dati di tipo CPictureHolder e una proprietà personalizzata LPPICTUREDISP con l'aggiunta dell'implementazione delle funzioni Get/Set.
Modificare diverse funzioni nella classe del controllo.
Queste modifiche verranno apportate a diverse funzioni responsabili di disegnare il controllo ActiveX.
Aggiunte al progetto di controllo
Per aggiungere l'ID della pagina delle proprietà alla pagina delle proprietà standard dell'immagine, inserire la seguente riga dopo la macro BEGIN_PROPPAGEIDS nel file di implementazione del controllo (.CPP):
PROPPAGEID(CLSID_CPicturePropPage)
È inoltre necessario incrementare il parametro count della macro BEGIN_PROPPAGEIDS di uno. Questa condizione è illustrata nella riga che segue:
BEGIN_PROPPAGEIDS(CMyAxPicCtrl, 2)
Per aggiungere il membro dati CPictureHolder alla classe del controllo, inserire la riga seguente nella sezione protected della dichiarazione della classe del controllo nel file di intestazione del controllo (.H):
CPictureHolder m_pic;
Non è necessario denominare il membro dati m_pic; qualsiasi nome sarà sufficiente.
Successivamente, aggiungere una proprietà personalizzata che supporta un tipo Picture:
Aggiungere una proprietà personalizzata dell'immagine tramite Aggiunta Guidata Proprietà
Caricare il progetto del controllo.
In Visualizzazione Classi, espandere il nodo della libreria del controllo.
Fare clic con il pulsante destro del mouse sul nodo dell'interfaccia del controllo (il secondo nodo della libreria) per aprire il menu di scelta rapida.
Scegliere Scegli dal menu di scelta rapida e quindi Aggiungi Proprietà.
Nella casella Nome Proprietà digitare il nome della proprietà. Ad esempio, ControlPicture viene utilizzato in questa procedura.
Nella casella Tipo Proprietà, selezionare IPictureDisp* per il tipo di proprietà.
Per Tipo di implementazione, fare clic su Metodi Get/Set.
Digitare nomi univoci per le funzioni Get e Set o accettare i nomi predefiniti. (In questo esempio, vengono utilizzati i nomi predefiniti GetControlPicture e SetControlPicture.)
Scegliere Fine.
Aggiunta Guidata Proprietà aggiunge il codice seguente nella mappa di invio nel file di intestazione del controllo (.H):
IPictureDisp* GetControlPicture(void);
void SetControlPicture(IPictureDisp* pVal);
Inoltre, il codice seguente è stato immesso nella mappa di invio del file di implementazione del controllo (.CPP):
DISP_PROPERTY_EX_ID(CMyAxPicCtrl, "ControlPicture", dispidControlPicture,
GetControlPicture, SetControlPicture, VT_PICTURE)
Aggiunta Guidata Proprietà aggiunge le due seguenti funzioni stub nel file di implementazione del controllo:
IPictureDisp* CWizardGenCtrl::GetControlPicture(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your dispatch handler code here
return NULL;
}
void CWizardGenCtrl::SetControlPicture(IPictureDisp* /*pVal*/)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
// TODO: Add your property handler code here
SetModifiedFlag();
}
Nota
I nomi di funzione e della classe del controllo potrebbero differire dall'esempio precedente.
Modifiche al progetto di controllo
Dopo aver apportato le modifiche necessarie al progetto di controllo, è necessario modificare diverse funzioni che influiscono sul rendering del controllo ActiveX. Queste funzioni, OnResetState, OnDraw e le funzioni Get/Set di una proprietà personalizzata dell'immagine, si trovano nel file di implementazione del controllo. (Si noti che in questo esempio la classe del controllo viene chiamata CSampleCtrl, il membro dati CPictureHolder viene chiamato m_pic e il nome della proprietà personalizzata dell'immagine è ControlPicture).
Nella funzione di controllo OnResetState, aggiungere la seguente riga facoltativa dopo la chiamata a COleControl::OnResetState:
m_pic.CreateEmpty();
Questo imposta l'immagine del controllo ad un'immagine vuota.
Per disegnare l'immagine correttamente, eseguire una chiamata a CPictureHolder::Render nella funzione OnDraw del controllo. Modificare la funzione per essere simile al seguente esempio:
void CMyAxPicCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& /*rcInvalid*/)
{
if (!pdc)
return;
m_pic.Render(pdc, rcBounds, rcBounds);
}
Nel metodo Get della proprietà personalizzata dell'immagine del controllo, aggiungere la riga seguente:
return m_pic.GetPictureDispatch();
Nel metodo Set della proprietà personalizzata dell'immagine del controllo, aggiungere le righe seguenti:
m_pic.SetPictureDispatch(pVal);
InvalidateControl();
La proprietà dell'immagine deve essere resa persistente in modo che le informazioni aggiunte in fase di progettazione vengano visualizzate in fase di esecuzione. Aggiungere la seguente riga alla classe derivata da COleControl nella funzione DoPropExchange:
PX_Picture(pPX, _T("ControlPicture"), m_pic);
Nota
I nomi della funzione e della classe potrebbero differire dall'esempio precedente.
Una volta completate le modifiche, ricompilare il progetto per includere la nuova funzionalità della proprietà personalizzata dell'immagine e utilizzare Test Container per testare la nuova proprietà. Per ulteriori informazioni sulla modalità di accesso a Test Container, vedere Verifica di proprietà ed eventi tramite Test Container.