Condividi tramite


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à

  1. Caricare il progetto del controllo.

  2. In Visualizzazione classi, espandere il nodo della libreria del controllo.

  3. 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.

  4. Dal menu di scelta rapida, fare clic Aggiungi quindi fare clic Aggiungi proprietà.

  5. Nella casella di Nome proprietà, digitare Array.

  6. Nella casella di Tipo proprietà, shortselezionato.

  7. Per il tipo di Implementazione, fare clic Metodi Get/Set.

  8. 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.

  9. Aggiungere un parametro, denominato row (tipo short), utilizzando i controlli di Tipo parametro e di Nome parametro.

  10. Aggiungere column chiamato secondo parametro (tipo short).

  11. 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();
    

Vedere anche

Concetti

Controlli ActiveX MFC