Controlli ActiveX MFC: argomenti avanzati
Questo articolo vengono illustrati gli argomenti avanzati relativi ai controlli ActiveX di sviluppo. tra cui:
Utilizzo di classi di database in controlli ActiveX
Implementare una proprietà con parametri
Gestione degli errori nel controllo ActiveX
Lo speciale di gestione tipi il controllo
L'accesso ai comandi della finestra di dialogo non visibili in fase di esecuzione
Utilizzo di classi di database in controlli ActiveX
Poiché le classi di controlli ActiveX fa parte della libreria di classi, è possibile applicare le stesse procedure e regole per utilizzare le classi di database in un'applicazione MFC standard i controlli ActiveX di sviluppo che utilizzano le classi di database MFC.
Per cenni preliminari sulle classi di database MFC, vedere Classi di database MFC (DAO e ODBC). Articolo vengono illustrati sia le classi ODBC MFC che le classi DAO MFC e viene indirizzata a ulteriori dettagli su uno.
Nota
A partire da Visual C++ .NET, l'ambiente e le procedure guidate di Visual C++ non supportano più DAO, anche se le classi DAO sono incluse e possono essere comunque utilizzate.Si consiglia di utilizzare Modelli OLE DB o ODBC e MFC per i nuovi progetti.di utilizzare DAO solo per la gestione delle applicazioni già esistenti.
Implementare una proprietà con parametri
Una proprietà con parametri (talvolta detta matrice di proprietà) è un metodo per esporre una raccolta di valori omogenea come un'unica proprietà del controllo. Ad esempio, è possibile utilizzare una proprietà con parametri per esporre una matrice o un dizionario come proprietà. In Visual Basic, tale proprietà viene eseguito tramite la notazione di matrice:
x = o.Array(2, 3) ' gets element of 2D array
o.Array(2, 3) = 7 ' sets element of 2D array
Utilizzare l'aggiunta guidata proprietà per implementare una proprietà con parametri. L'aggiunta guidata proprietà implementare la proprietà aggiungendo una coppia di funzioni set/Get che consentono all'utente di accedere alla proprietà utilizzando la notazione sopra o un modo standard.
Simile ai metodi e le proprietà, le proprietà con parametri hanno un numero illimitato di parametri concesse. Nel caso delle proprietà con parametri, il limite di 15 parametri con un parametro riservato per archiviare il valore della proprietà).
La procedura descritta di seguito viene aggiunta una proprietà con parametri, detta matrice, che può essere eseguito come una matrice bidimensionale di integer.
Per aggiungere una proprietà con parametri 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 il nodo della libreria) per aprire il menu di scelta rapida.
Dal menu di scelta rapida, fare clic Aggiungi quindi fare clic Aggiungi proprietà.
Nella casella di Nome proprietà, digitare Array.
Nella casella di Tipo proprietà, shortselezionato.
Per il tipo di Implementazione, fare clic Metodi Get/Set.
Nelle caselle di Imposta funzione e di Funzione Get , i nomi al tipo univoci per il get e set le funzioni o accettare i nomi predefiniti.
Aggiungere un parametro, denominato row (tipo short), utilizzando i controlli di Tipo parametro e di Nome parametro.
Aggiungere column chiamato secondo parametro (tipo short).
Scegliere Fine.
Modifiche apportate dall'Aggiunta guidata proprietà
Quando si aggiunge una proprietà personalizzata, l'aggiunta guidata proprietà apportano modifiche all'intestazione della classe del controllo (. H) e i file di implementazione (.CPP).
Le seguenti righe aggiunte alla classe del controllo. File H:
SHORT GetArray(SHORT row, SHORT column);
void SetArray(SHORT row, SHORT column, SHORT newVal);
Questo codice dichiara due funzioni chiamate GetArray e SetArray che consentono all'utente richiedere una riga e la colonna specifiche quando si accede alla proprietà.
Inoltre, l'aggiunta guidata proprietà aggiungere le seguenti righe alla mappa di invio del controllo, che si trova nel file di implementazione della classe del controllo (.CPP):
DISP_PROPERTY_PARAM_ID(CMyAxUICtrl, "Array", dispidArray, GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
Infine, le implementazioni di GetArray e le funzioni di SetArray vengono aggiunti alla fine del file di .CPP. Nella maggior parte dei casi, verrà modificata la funzione Get per restituire il valore della proprietà. La funzione set generalmente conterrà codice da eseguire, before o after la proprietà cambia.
Perché la proprietà sia utile, è possibile dichiarare una variabile membro della matrice bidimensionale della classe del controllo, di tipo short, la memorizzazione dei valori della proprietà con parametri. È quindi possibile modificare il metodo Get per restituire il valore archiviato nella riga e la colonna appropriate, come indicato dai parametri e modificare la funzione set per aggiornare il valore fatto riferimento nei parametri di riga e colonna.
Gestione degli errori nel controllo ActiveX
Se le condizioni di errore sul controllo, è possibile richiedere di segnalare l'errore nel contenitore di controlli. Esistono due metodi per la segnalazione degli errori, a seconda della situazione in cui l'errore si verifica. Se l'errore si verifica all'interno di una proprietà ottenere o impostare la funzione, o nell'implementazione di un metodo di automazione OLE, il controllo deve chiamare COleControl::ThrowError, che segnala all'utente del controllo che si è verificato un errore. Se l'errore si verifica in qualsiasi altro momento, il controllo deve chiamare COleControl::FireError, che genera un evento di errore predefinito.
Per indicare il tipo di errore che si verifica, il controllo deve passare un codice di errore a ThrowError o a FireError. Un codice di errore è un codice di stato OLE, con un valore a 32 bit. Quando possibile, scegliere un codice di errore dallo standard di codici definiti nel file di intestazione OLECTL.H. Nella tabella seguente vengono riepilogati i codici.
Codici di errore del controllo ActiveX
Errore |
Descrizione |
---|---|
CTL_E_ILLEGALFUNCTIONCALL |
Chiamata di funzione non valida |
CTL_E_OVERFLOW |
Overflow |
CTL_E_OUTOFMEMORY |
Memoria insufficiente |
CTL_E_DIVISIONBYZERO |
Divisione per zero |
CTL_E_OUTOFSTRINGSPACE |
Spazio di stringa |
CTL_E_OUTOFSTACKSPACE |
Lo spazio dello stack |
CTL_E_BADFILENAMEORNUMBER |
Nome file errato o numero |
CTL_E_FILENOTFOUND |
File non trovato |
CTL_E_BADFILEMODE |
File modo non corretto |
CTL_E_FILEALREADYOPEN |
File già aperto |
CTL_E_DEVICEIOERROR |
Errore dei/O del dispositivo |
CTL_E_FILEALREADYEXISTS |
Il file è già esistente |
CTL_E_BADRECORDLENGTH |
La lunghezza del record |
CTL_E_DISKFULL |
Disco pieno. |
CTL_E_BADRECORDNUMBER |
Numero errato di record |
CTL_E_BADFILENAME |
Nome file errato |
CTL_E_TOOMANYFILES |
Troppi file |
CTL_E_DEVICEUNAVAILABLE |
Dispositivo non disponibile |
CTL_E_PERMISSIONDENIED |
Autorizzazione negata |
CTL_E_DISKNOTREADY |
Disco non pronto |
CTL_E_PATHFILEACCESSERROR |
Errore accesso ai file/percorso |
CTL_E_PATHNOTFOUND |
Percorso non trovato |
CTL_E_INVALIDPATTERNSTRING |
Stringa modello non valida |
CTL_E_INVALIDUSEOFNULL |
Utilizzo non valido NULL |
CTL_E_INVALIDFILEFORMAT |
Formato di file non valido |
CTL_E_INVALIDPROPERTYVALUE |
Valore della proprietà non valido |
CTL_E_INVALIDPROPERTYARRAYINDEX |
Indice non valido della matrice di proprietà |
CTL_E_SETNOTSUPPORTEDATRUNTIME |
Set di supporto in fase di esecuzione |
CTL_E_SETNOTSUPPORTED |
Set di supporto (proprietà di sola lettura) |
CTL_E_NEEDPROPERTYARRAYINDEX |
Indice della matrice di proprietà di necessario |
CTL_E_SETNOTPERMITTED |
Set non consentito |
CTL_E_GETNOTSUPPORTEDATRUNTIME |
Ottenere di supporto in fase di esecuzione |
CTL_E_GETNOTSUPPORTED |
Ottenere non supportato (proprietà di sola scrittura) |
CTL_E_PROPERTYNOTFOUND |
Proprietà non trovata |
CTL_E_INVALIDCLIPBOARDFORMAT |
Formato degli Appunti non valido |
CTL_E_INVALIDPICTURE |
Immagine non valida |
CTL_E_PRINTERERROR |
Errore della stampante |
CTL_E_CANTSAVEFILETOTEMP |
Impossibile salvare il file in TEMP |
CTL_E_SEARCHTEXTNOTFOUND |
Testo cerca non trovato |
CTL_E_REPLACEMENTSTOOLONG |
Sostituzioni troppo lungo |
Se necessario, utilizzare la macro di CUSTOM_CTL_SCODE per definire un codice di errore personalizzato a una condizione che non è descritta da uno dei codici standard. Il parametro per questa macro deve essere un numero intero compreso tra 1000 e 32767, inclusi. Di seguito è riportato un esempio.
#define MYCTL_E_SPECIALERROR CUSTOM_CTL_SCODE(1000)
Se si crea un controllo ActiveX per sostituire un controllo esistente di VBX, definire i codici di errore del controllo ActiveX con gli stessi valori numerici che il controllo di VBX utilizza per garantire che i codici di errore siano compatibili.
Lo speciale di gestione tipi il controllo
In alcuni casi potrebbe essere necessario gestire alcune combinazioni di tasti in modo speciale; ad esempio, inserire una nuova riga quando il tasto INVIO viene introdotto un controllo textbox o un movimento su più righe tra un gruppo di controlli di modifica quando una chiave direzionale ID sia stato premuto.
Se la classe base del controllo ActiveX è COleControl, è possibile eseguire l'override di CWnd::PreTranslateMessage per gestire i messaggi prima che il contenitore vengano elaborati. Quando si utilizza questa tecnica, TRUE sempre return se si gestisce il messaggio nell'override di PreTranslateMessage.
Nell'esempio di codice viene illustrata una modalità possibile di gestire tutti i messaggi relativi alle chiavi direzionali.
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;
}
Per ulteriori informazioni sulla tastiera gestione delle interfacce per un controllo ActiveX, vedere la documentazione di ActiveX SDK.
L'accesso ai comandi della finestra di dialogo non visibili in fase di esecuzione
È possibile creare comandi della finestra di dialogo privi di interfaccia utente e sono invisibili in fase di esecuzione. Se si aggiunge in fase di esecuzione un controllo ActiveX invisibile a una finestra di dialogo e utilizzare CWnd::GetDlgItem per accedere al controllo, il controllo non funzionerà correttamente. Al contrario, utilizzare una delle tecniche seguenti per ottenere un oggetto che rappresenta il controllo:
Mediante l'aggiunta guidata variabile membro, Variabile controllo quindi selezionare l'id del controllo Un nome di variabile membro e selezionare la classe wrapper del controllo come Tipo controllo.
- oppure -
Dichiarare una variabile locale e una sottoclasse come elemento della finestra di dialogo. Inserire codice simile a quello riportato di seguito (CMyCtrl è una classe wrapper, IDC_MYCTRL1 è l'id del controllo):
CCirc myCirc; myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this); // ... use myCirc ... myCirc.UnsubclassWindow();