Contenitori di controlli ActiveX: programmazione di controlli ActiveX in un contenitore di controlli ActiveX
Questo articolo descrive il processo di accesso ai metodi esposti e alle proprietà dei controlli ActiveX incorporati.
Importante
ActiveX è una tecnologia legacy che non deve essere usata per il nuovo sviluppo. Per altre informazioni sulle tecnologie moderne che sostituisce ActiveX, vedere Controlli ActiveX.
In pratica, si seguiranno questi passaggi:
Inserire un controllo ActiveX nel progetto contenitore ActiveX usando Gallery.
Definire una variabile membro (o un altro tipo di accesso) dello stesso tipo della classe wrapper del controllo ActiveX.
Programmare il controllo ActiveX usando funzioni membro predefinite della classe wrapper.
Per questa discussione, si supponga di aver creato un progetto basato su dialoghi (denominato Contenitore) con il supporto del controllo ActiveX. Il controllo di esempio Circ, Circ, verrà aggiunto al progetto risultante.
Dopo aver inserito il controllo Circ nel progetto (passaggio 1), inserire un'istanza del controllo Circ nella finestra di dialogo principale dell'applicazione.
Procedure
Per aggiungere il controllo Circ al modello di finestra di dialogo
Caricare il progetto contenitore di controlli ActiveX. Per questo esempio, usare il
Container
progetto.Fare clic sulla scheda Visualizzazione risorse.
Aprire la cartella Dialog .
Fare doppio clic sul modello della finestra di dialogo principale. Per questo esempio, usare IDD_CONTAINER_DIALOG.
Fare clic sull'icona del controllo Circ nella casella degli strumenti.
Fare clic su un punto all'interno della finestra di dialogo per inserire il controllo Circ.
Scegliere Salva tutto dal menu File per salvare tutte le modifiche apportate al modello della finestra di dialogo.
Modifiche al progetto
Per consentire all'applicazione Contenitore di accedere al controllo Circ, Visual C++ aggiunge automaticamente il file di implementazione della classe wrapper (CCirc
). CPP) al progetto Container e all'intestazione della classe wrapper (. H) file nel file di intestazione della finestra di dialogo:
#include "circ.h"
Intestazione della classe Wrapper (. H) File
Per ottenere e impostare proprietà (e richiamare metodi) per il controllo Circ, la CCirc
classe wrapper fornisce una dichiarazione di tutti i metodi e le proprietà esposti. Nell'esempio queste dichiarazioni si trovano in CIRC.H. L'esempio seguente è la parte della classe CCirc
che definisce le interfacce esposte del controllo ActiveX:
class CCirc : public CWnd
{
// Functions
//
void AboutBox()
{
InvokeHelper(DISPID_ABOUTBOX, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);
}
// Properties
//
unsigned long GetBackColor()
{
unsigned long result;
GetProperty(DISPID_BACKCOLOR, VT_UI4, (void*)& result);
return result;
}
void SetBackColor(unsigned long propVal)
{
SetProperty(DISPID_BACKCOLOR, VT_UI4, propVal);
}
signed char GetCircleShape()
{
signed char result;
GetProperty(0x1, VT_I1, (void*)& result);
return result;
}
void SetCircleShape(signed char propVal)
{
SetProperty(0x1, VT_I1, propVal);
}
short GetCircleOffset()
{
short result;
GetProperty(0x3, VT_I2, (void*)& result);
return result;
}
void SetCircleOffset(short propVal)
{
SetProperty(0x3, VT_I2, propVal);
}
CString GetCaption()
{
CString result;
GetProperty(DISPID_CAPTION, VT_BSTR, (void*)& result);
return result;
}
void SetCaption(CString propVal)
{
SetProperty(DISPID_CAPTION, VT_BSTR, propVal);
}
COleFont GetFont()
{
LPDISPATCH result;
GetProperty(DISPID_FONT, VT_DISPATCH, (void*)& result);
return COleFont(result);
}
void SetFont(LPDISPATCH propVal)
{
SetProperty(DISPID_FONT, VT_DISPATCH, propVal);
}
unsigned long GetForeColor()
{
unsigned long result;
GetProperty(DISPID_FORECOLOR, VT_UI4, (void*)& result);
return result;
}
void SetForeColor(unsigned long propVal)
{
SetProperty(DISPID_FORECOLOR, VT_UI4, propVal);
}
CString GetNote()
{
CString result;
GetProperty(0x4, VT_BSTR, (void*)& result);
return result;
}
void SetNote(CString propVal)
{
SetProperty(0x4, VT_BSTR, propVal);
}
unsigned long GetFlashColor()
{
unsigned long result;
GetProperty(0x2, VT_UI4, (void*)& result);
return result;
}
void SetFlashColor(unsigned long propVal)
{
SetProperty(0x2, VT_UI4, propVal);
}
};
Queste funzioni possono quindi essere chiamate da altre procedure dell'applicazione usando la normale sintassi C++. Per altre informazioni sull'uso di questa funzione membro impostata per accedere ai metodi e alle proprietà del controllo, vedere la sezione Programmazione del controllo ActiveX.
Modifiche delle variabili membro al progetto
Dopo aver aggiunto il controllo ActiveX al progetto e incorporato in un contenitore di finestre di dialogo, è possibile accedervi da altre parti del progetto. Il modo più semplice per accedere al controllo consiste nel creare una variabile membro della classe dialog( CContainerDlg
passaggio 2), ovvero dello stesso tipo della classe wrapper aggiunta al progetto da Visual C++. È quindi possibile usare la variabile membro per accedere al controllo incorporato in qualsiasi momento.
Quando la finestra di dialogo Aggiungi variabile membro aggiunge la variabile membro m_circctl al progetto, aggiunge anche le righe seguenti al file di intestazione (. H) della CContainerDlg
classe :
class CContainerDlg : public CDialog
{
DECLARE_DYNAMIC(CContainerDlg)
public:
CContainerDlg(CWnd* pParent = NULL); // standard constructor
virtual ~CContainerDlg();
virtual void OnFinalRelease();
// Dialog Data
enum { IDD = IDD_CONTAINER_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
DECLARE_MESSAGE_MAP()
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
public:
CCirc m_circctl;
};
Inoltre, una chiamata a DDX_Control viene aggiunta automaticamente all'implementazione CContainerDlg
di DoDataExchange
:
DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);
Programmazione del controllo ActiveX
A questo punto, il controllo ActiveX è stato inserito nel modello di finestra di dialogo e ne è stata creata una variabile membro. È ora possibile usare la sintassi C++ comune per accedere alle proprietà e ai metodi del controllo incorporato.
Come indicato (nell'intestazione della classe Wrapper (. H) File), il file di intestazione (. H) per la CCirc
classe wrapper, in questo caso CIRC. H, contiene un elenco di funzioni membro che è possibile usare per ottenere e impostare qualsiasi valore della proprietà esposta. Sono disponibili anche le funzioni membro per i metodi esposti.
Una posizione comune per modificare le proprietà del controllo è nella OnInitDialog
funzione membro della classe di dialogo principale. Questa funzione viene chiamata subito prima della visualizzazione della finestra di dialogo e viene usata per inizializzarne il contenuto, inclusi i relativi controlli.
Nell'esempio di codice seguente viene utilizzata la variabile membro m_circctl per modificare le proprietà Caption e CircleShape del controllo Circ incorporato:
BOOL CContainerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_circctl.SetCaption(_T("Circ 2 Control"));
if (!m_circctl.GetCircleShape())
m_circctl.SetCircleShape(TRUE);
return TRUE; // return TRUE unless you set the focus to a control
}