Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln beskriver avancerade ämnen som rör utveckling av ActiveX-kontroller. Dessa inkluderar:
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.
Använda databasklasser i ActiveX-kontroller
Eftersom ActiveX-kontrollklasserna ingår i klassbiblioteket kan du använda samma procedurer och regler för att använda databasklasser i ett MFC-standardprogram för att utveckla ActiveX-kontroller som använder MFC-databasklasserna.
En allmän översikt över MFC-databasklasserna finns i MFC Database Classes (DAO och ODBC). I artikeln beskrivs både MFC ODBC-klasserna och MFC DAO-klasserna och du får mer information om någon av dem.
Anmärkning
DAO stöds via Office 2013. DAO 3.6 är den slutliga versionen och anses vara föråldrad. Visual C++-miljön och guiderna stöder inte DAO (även om DAO-klasserna ingår och du fortfarande kan använda dem). Microsoft rekommenderar att du använder OLE DB-mallar eller ODBC och MFC för nya projekt. Du bör bara använda DAO för att underhålla befintliga program.
Implementera en parameteriserad egenskap
En parameteriserad egenskap (kallas ibland en egenskapsmatris) är en metod för att exponera en homogen samling värden som en enda egenskap för kontrollen. Du kan till exempel använda en parameteriserad egenskap för att exponera en matris eller en ordlista som en egenskap. I Visual Basic används en sådan egenskap med matrisnotation:
x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array
Använd guiden Lägg till egenskap för att implementera en parameteriserad egenskap. Guiden Lägg till egenskap implementerar egenskapen genom att lägga till ett par Get/Set-funktioner som gör att kontrollanvändaren kan komma åt egenskapen med hjälp av ovanstående notation eller på standard sätt.
På samma sätt som metoder och egenskaper har parametriserade egenskaper också en gräns för antalet tillåtna parametrar. När det gäller parameteriserade egenskaper är gränsen 15 parametrar (med en parameter reserverad för lagring av egenskapsvärdet).
Följande procedur lägger till en parameteriserad egenskap med namnet Matris, som kan nås som en tvådimensionell matris med heltal.
Så här lägger du till en parameteriserad egenskap med hjälp av guiden Lägg till egenskap
Läs in kontrollens projekt.
I Klassvy expanderar du biblioteksnoden för din kontroll.
Högerklicka på gränssnittsnoden för kontrollen (biblioteksnodens andra nod) för att öppna snabbmenyn.
På snabbmenyn klickar du på Lägg till och sedan på Lägg till egenskap.
I rutan Egenskapsnamn skriver du
Array.I rutan Egenskapstyp väljer du
short.För Implementeringstyp klickar du på Hämta/ange metoder.
I rutorna Hämta funktion och Ange funktion skriver du unika namn för Get and Set Functions eller accepterar standardnamnen.
Lägg till en parameter med namnet row (type short) med hjälp av kontrollerna Parameternamn och Parametertyp .
Lägg till en andra parameter med namnet column (type short).
Klicka på Finish.
Ändringar som gjorts av guiden Lägg till egenskap
När du lägger till en anpassad egenskap gör guiden Lägg till egenskap ändringar i kontrollklassrubriken (. H) och implementeringen (. CPP)-filer.
Följande rader läggs till i kontrollklassen . H-fil:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
Den här koden deklarerar två funktioner som anropas GetArray och SetArray som gör det möjligt för användaren att begära en specifik rad och kolumn vid åtkomst till egenskapen.
Dessutom lägger guiden Lägg till egenskap till följande rader i kontrolldispatchkartan, som finns i kontrollklassimplementeringen (.CPP)-filen:
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
Slutligen läggs implementeringarna av GetArray funktionerna och SetArray till i slutet av . CPP-fil. I de flesta fall ändrar du funktionen "Get" för att returnera värdet för egenskapen. Funktionen Set innehåller vanligtvis kod som ska köras, antingen före eller efter att egenskapen har ändrats.
För att den här egenskapen ska vara användbar kan du deklarera en tvådimensionell matrismedlemsvariabel i kontrollklassen, av typen short, för att lagra värden för den parameteriserade egenskapen. Du kan sedan ändra funktionen Get för att returnera värdet som lagras på rätt rad och kolumn, enligt parametrarna, och ändra funktionen Set för att uppdatera värdet som refereras av rad- och kolumnparametrarna.
Hantera fel i Din ActiveX-kontroll
Om feltillstånd uppstår i kontrollen kan du behöva rapportera felet till kontrollcontainern. Det finns två metoder för att rapportera fel, beroende på i vilken situation felet inträffar. Om felet uppstår i en egenskaps get- eller set-funktion, eller inom implementeringen av en OLE Automation-metod, bör kontrollen anropa COleControl::ThrowError, som signalerar till kontrollanvändaren att ett fel har inträffat. Om felet inträffar vid någon annan tidpunkt bör kontrollen anropa COleControl::FireError, som utlöser en lagerfelhändelse.
För att ange vilken typ av fel som har inträffat måste kontrollen skicka en felkod till ThrowError eller FireError. En felkod är en OLE-statuskod som har ett 32-bitars värde. När det är möjligt väljer du en felkod från standarduppsättningen med koder som definierats i OLECTL. H-huvudfil. I följande tabell sammanfattas dessa koder.
Felkoder för ActiveX-kontroll
| Fel | Beskrivning |
|---|---|
| CTL_E_OGILTIGT_FUNKTIONSSAMTAL | Ogiltigt funktionsanrop |
| CTL_E_OVERFLOW | Överflöde |
| CTL_E_OUTOFMEMORY | Slut på minne |
| CTL_E_DIVISIONBYZERO | Division med noll |
| CTL_E_OUTOFSTRINGSPACE | Slut på strängutrymme |
| CTL_E_SLUT_PÅ_STACKUTRYMME | Slut på stackutrymme |
| CTL_E_BADFILENAMEORNUMBER | Ogiltigt filnamn eller -nummer |
| CTL_E_FILENOTFOUND | Filen hittades inte |
| CTL_E_BADFILEMODE | Ogiltigt filläge |
| CTL_E_FILREDAÖPPEN | Filen är redan öppen |
| CTL_E_DEVICEIOERROR | Enhets-I/O-fel |
| CTL_E_FILENFINNSREDA | Filen finns redan |
| CTL_E_BADRECORDLENGTH | Felaktig postlängd |
| CTL_E_DISKFULL | Disken är full |
| CTL_E_BADRECORDNUMBER | Felaktigt registreringsnummer |
| CTL_E_BADFILENAME (Felaktigt filnamn) | Ogiltigt filnamn |
| CTL_E_TOOMANYFILES | För många filer |
| CTL_E_ENHETTILLGÄNGLIGHET_BRIST | Enheten är inte tillgänglig |
| CTL_E_PERMISSIONDENIED (Åtkomst nekad) | Behörighet nekad |
| CTL_E_DISKNOTREADY | Disken är inte klar |
| CTL_E_PATHFILEACCESSERROR | Sökväg/filåtkomstfel |
| CTL_E_PATHNOTFOUND | Sökvägen hittades inte |
| CTL_E_INVALIDPATTERNSTRING | Ogiltig mönstersträng |
| CTL_E_INVALIDUSEOFNULL | Ogiltig användning av NULL |
| CTL_E_INVALIDFILEFORMAT | Ogiltigt filformat |
| CTL_E_INVALIDPROPERTYVALUE | Ogiltigt egenskapsvärde |
| CTL_E_OGILTIGT_EGENSKAP_ARRAYINDEX | Ogiltigt egenskapsmatrisindex |
| CTL_E_SETNOTSUPPORTEDATRUNTIME | Inställning stöds inte vid körtid |
| CTL_E_SETNOTSUPPORTED | Inställningen stöds inte (skrivskyddad egenskap) |
| CTL_E_NEEDPROPERTYARRAYINDEX | Behöver egenskapsmatrisindex |
| CTL_E_SETNOTPERMITTED | Ställ in tillåts inte |
| CTL_E_GETNOTSUPPORTEDATRUNTIME | Få inte stöd vid körning |
| CTL_E_GETNOTSUPPORTED | Get not supported (endast skrivbar egenskap) |
| CTL_E_EGENSKAP_EJ_FUNNEN | Egenskapen hittades inte |
| Ogiltigt urklippsformat (CTL_E_INVALIDCLIPBOARDFORMAT) | Ogiltigt urklippsformat |
| CTL_E_OGILTIGBILD | Ogiltig bild |
| CTL_E_PRINTERERROR | Skrivarfel |
| Kan inte spara filen till temporär mapp | Det går inte att spara filen i TEMP |
| CTL_E_SEARCHTEXTNOTFOUND | Söktexten hittades inte |
| CTL_E_ERSTÄTTNINGARNALÅNG | Ersättningar som är för långa |
Om det behövs använder du makrot CUSTOM_CTL_SCODE för att definiera en anpassad felkod för ett villkor som inte omfattas av någon av standardkoderna. Parametern för det här makrot ska vara ett heltal mellan 1000 och 32767, inklusive. Till exempel:
#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)
Om du skapar en ActiveX-kontroll för att ersätta en befintlig VBX-kontroll definierar du felkoderna för ActiveX-kontrollen med samma numeriska värden som VBX-kontrollen använder för att säkerställa att felkoderna är kompatibla.
Hantera speciella tangenter i kontrollen
I vissa fall kanske du vill hantera vissa tangenttryckningskombinationer på ett speciellt sätt. Infoga till exempel en ny rad när RETUR-tangenten trycks in i en textrutekontroll med flera rader eller flyttas mellan en grupp med redigeringskontroller när ett riktningsnyckel-ID trycktes in.
Om basklassen för ActiveX-kontrollen är COleControlkan du åsidosätta CWnd::P reTranslateMessage för att hantera meddelanden innan containern bearbetar dem. När du använder den här tekniken returnerar du alltid TRUE om du hanterar meddelandet i åsidosättningen av PreTranslateMessage.
I följande kodexempel visas ett möjligt sätt att hantera meddelanden som är relaterade till riktningsnycklarna.
BOOL CMyAxUICtrl::PreTranslateMessage(MSG* pMsg)
{
BOOL bHandleNow = FALSE;
switch (pMsg->message)
{
case WM_KEYDOWN:
switch (pMsg->wParam)
{
case VK_UP:
case VK_DOWN:
case VK_LEFT:
case VK_RIGHT:
bHandleNow = TRUE;
break;
}
if (bHandleNow)
{
OnKeyDown((UINT)pMsg->wParam, LOWORD(pMsg->lParam), HIWORD(pMsg->lParam));
}
break;
}
return bHandleNow;
}
Mer information om hur du hanterar tangentbordsgränssnitt för en ActiveX-kontroll finns i ActiveX SDK-dokumentationen.
Åtkomst till dialogkontroller som är osynliga vid körning
Du kan skapa dialogkontroller som inte har något användargränssnitt och som är osynliga vid körning. Om du lägger till en osynlig ActiveX-kontroll vid körning i en dialogruta och använder CWnd::GetDlgItem för att komma åt kontrollen fungerar inte kontrollen korrekt. I stället bör du använda någon av följande tekniker för att hämta ett objekt som representerar kontrollen:
Med hjälp av guiden Lägg till medlemsvariabel väljer du Kontrollvariabel och sedan kontrollens ID. Ange ett medlemsvariabelnamn och välj kontrollens omslutningsklass som kontrolltyp.
-eller-
Deklarera en lokal variabel och underklass som dialogobjekt. Infoga kod som liknar följande (
CMyCtrlär omslutningsklassen IDC_MYCTRL1 är kontrollens ID):CCirc myCirc; myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this); // ... use myCirc ... myCirc.UnsubclassWindow();