Dela via


ActiveX-kontrollcontainrar: Programmering av ActiveX-kontroller i en ActiveX-kontrollcontainer

I den här artikeln beskrivs processen för att komma åt de exponerade metoderna och egenskaperna för inbäddade ActiveX-kontroller.

Viktigt!

ActiveX är en äldre teknik som inte bör användas för ny utveckling. Mer information om moderna tekniker som ersätter ActiveX finns i ActiveX-kontroller.

I grund och botten följer du dessa steg:

  1. Infoga en ActiveX-kontroll i ActiveX-containerprojektet med hjälp av Galleriet.

  2. Definiera en medlemsvariabel (eller annan form av åtkomst) av samma typ som ActiveX-kontrollomslutningsklassen.

  3. Programmera ActiveX-kontrollen med fördefinierade medlemsfunktioner i omslutningsklassen.

Anta att du har skapat ett dialogbaserat projekt (med namnet Container) med Stöd för ActiveX-kontroll för den här diskussionen. Exempelkontrollen Circ läggs till i det resulterande projektet.

När Circ-kontrollen har infogats i projektet (steg 1) infogar du en instans av Circ-kontrollen i programmets huvuddialogruta.

Förfaranden

Så här lägger du till Circ-kontrollen i dialogmallen

  1. Läs in ActiveX-kontrollcontainerprojektet. I det här exemplet använder du Container projektet.

  2. Klicka på fliken Resursvy.

  3. Öppna mappen Dialog .

  4. Dubbelklicka på mallen för huvuddialogrutan. I det här exemplet ska du använda IDD_CONTAINER_DIALOG.

  5. Klicka på Circ-kontrollikonen i verktygslådan.

  6. Klicka på en punkt i dialogrutan för att infoga Circ-kontrollen.

  7. menyn Arkiv väljer du Spara alla för att spara alla ändringar i dialogrutemallen.

Ändringar i projektet

För att göra det möjligt för containerprogrammet att komma åt Circ-kontrollen lägger Visual C++ automatiskt till omslutningsklassens (CCirc) implementeringsfil (. CPP) till containerprojektet och omslutningsklassrubriken (. H)-fil till dialogrutans rubrikfil:

#include "circ.h"

Rubrik för omslutningsklass (. H)-fil

Om du vill hämta och ange egenskaper (och anropa metoder) för Circ-kontrollen tillhandahåller omslutningsklassen CCirc en deklaration av alla exponerade metoder och egenskaper. I exemplet finns dessa deklarationer i CIRC.H. Följande exempel är den del av klassen CCirc som definierar de gränssnitt som exponeras för ActiveX-kontrollen:

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);
}
};

Dessa funktioner kan sedan anropas från andra av programmets procedurer med normal C++-syntax. Mer information om hur du använder den här medlemsfunktionen för att komma åt kontrollens metoder och egenskaper finns i avsnittet Programmering av ActiveX-kontrollen.

Ändringar av medlemsvariabeln i projektet

När ActiveX-kontrollen har lagts till i projektet och bäddats in i en dialogrutecontainer kan den nås av andra delar av projektet. Det enklaste sättet att komma åt kontrollen är att skapa en medlemsvariabel i dialogklassen CContainerDlg (steg 2), som är av samma typ som den omslutningsklass som lagts till i projektet av Visual C++. Du kan sedan använda medlemsvariabeln för att komma åt den inbäddade kontrollen när som helst.

När dialogrutan Lägg till medlemsvariabel lägger till variabeln m_circctl medlem i projektet läggs även följande rader till i rubrikfilen (. H) för CContainerDlg klassen:

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;
};

Dessutom läggs ett anrop till DDX_Control automatiskt till i CContainerDlgimplementeringen av DoDataExchange:

DDX_Control(pDX, IDC_CIRCCTRL1, m_circctl);

Programmera ActiveX-kontrollen

Nu har du infogat ActiveX-kontrollen i dialogmallen och skapat en medlemsvariabel för den. Nu kan du använda vanlig C++-syntax för att komma åt egenskaperna och metoderna för den inbäddade kontrollen.

Som nämnts (i huvudfilen för omslutningsklassen (.H) Fil), huvudfilen (.H) för omslutningsklassen CCirc, i det här fallet CIRC.H, innehåller en lista över medlemsfunktioner som du kan använda för att få och ställa in vilket exponerat egenskapsvärde som helst. Medlemsfunktioner för exponerade metoder är också tillgängliga.

En vanlig plats för att ändra kontrollens egenskaper är medlemsfunktionen i OnInitDialog huvuddialogklassen. Den här funktionen anropas precis innan dialogrutan visas och används för att initiera dess innehåll, inklusive någon av dess kontroller.

I följande kodexempel används m_circctl medlemsvariabel för att ändra egenskaperna Caption och CircleShape för den inbäddade Circ-kontrollen:

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
}

Se även

ActiveX-kontrollcontainrar