Contenitori di controlli ActiveX: programmazione di controlli ActiveX in un contenitore di controlli ActiveX
In questo articolo viene descritto il processo per accedere a metodi ed esporre proprietà dei controlli ActiveX incorporati. Fondamentalmente, verranno effettuate le seguenti operazioni:
Inserire un controllo ActiveX nel progetto contenitore ActiveX utilizzando la raccolta.
Definire una variabile membro (o un altro form di accesso) dello stesso tipo della classe wrapper ActiveX control.
Pianificare il controllo ActiveX mediante le funzioni membro predefinite della classe wrapper.
Per questa discussione, si hanno creato un progetto a windows (Container denominato) con supporto del controllo ActiveX. Il controllo dell'esempio di Circ, Circ, verrà aggiunto al progetto risultante.
Una volta che il controllo di Circ viene inserito nel progetto (passaggio 1), inserire un'istanza del controllo di Circ nella finestra di dialogo principale dell'applicazione.
Procedure
Per aggiungere il controllo di Circ al modello di finestra di dialogo
Caricare il progetto del contenitore di controlli ActiveX. Per questo esempio, utilizzare il progetto Container.
Scegliere la scheda Visualizzazione risorse.
Aprire la cartella di Finestra di dialogo.
Fare doppio clic sul modello di finestra di dialogo principale. Per questo esempio, utilizzare IDD_CONTAINER_DIALOG.
Fare clic sull'icona del controllo di Circ nella casella degli strumenti.
Fare clic su un punto all'interno della finestra di dialogo per inserire il controllo di Circ.
Dal menu di File, scegliere Salva tutto per salvare le modifiche al modello di finestra di dialogo.
Modifiche al progetto
Per attivare l'applicazione contenitore accedere al controllo di Circ, Visual C++ aggiunge automaticamente il file di implementazione della classe wrapper (CCirc) (.CPP) al progetto del contenitore e all'intestazione della classe wrapper (. H) il file di intestazione della finestra di dialogo:
#include "circ.h"
L'intestazione della classe wrapper (. File h)
Per ottenere e impostare le proprietà (e richiamare i metodi) per il controllo di Circ, la classe wrapper di CCirc fornisce una dichiarazione di tutti i metodi e le proprietà esposti. Nell'esempio, queste dichiarazioni sono presenti in CIRC.H. L'esempio seguente è la parte di CCirc classe 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);
}
};
Tali funzioni possono essere chiamate da altre routine dell'applicazione utilizzando la sintassi C++ normale. Per ulteriori informazioni sull'utilizzo della funzione membro impostata per accedere ai metodi e le proprietà del controllo, vedere la sezione Programmazione del controllo ActiveX.
Modifiche variabile membro al progetto
Una volta che il controllo ActiveX è stato aggiunto al progetto ed era incorporato in un contenitore della finestra di dialogo, è possibile accedervi da altre parti del progetto. Il modo più semplice per accedere al controllo è a creare una variabile membro la classe della finestra di dialogo, CContainerDlg (passaggio 2), che è dello stesso tipo della classe wrapper aggiunta al progetto da Visual C++. È quindi possibile utilizzare la variabile membro per accedere al controllo incorporato in qualsiasi momento.
Verrà visualizzata la finestra di dialogo Aggiungi variabile membro aggiungi variabile membro di m_circctl al progetto, anche aggiungere le righe seguenti al file di intestazione precompilata. H) della classe di CContainerDlg :
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 aggiunto automaticamente all'implementazione di CContainerDlg di DoDataExchange:
DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);
Programmazione del controllo ActiveX
In questa fase, incollato il controllo ActiveX nel modello di finestra di dialogo e creato una variabile membro per. È ora possibile utilizzare la sintassi comune di C++ per accedere a proprietà e metodi di controllo incorporato.
Come celebre (in L'intestazione della classe wrapper (. File h)), il file di intestazione precompilata. H) per la classe wrapper di CCirc, in questo caso CIRC.H, contiene un elenco di funzioni membro che è possibile utilizzare per ottenere e impostare il valore della proprietà esposta. Le funzioni membro per i metodi esposti sono inoltre disponibili.
Una posizione comune per modificare le proprietà del controllo è la funzione membro di OnInitDialog della classe principale della finestra di dialogo. Questa funzione viene chiamata prima di visualizzata la finestra di dialogo viene utilizzata per inizializzare il relativo contenuto, inclusi i suoi controlli.
Nell'esempio di codice seguente viene utilizzata la variabile membro di m_circctl per modificare le proprietà di CircleShape e la didascalia del controllo incorporato di Circ:
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
}