Controlli ActiveX MFC: argomenti avanzati

In questo articolo riguarda 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 digitare il controllo

  • L'accesso ai comandi della finestra di dialogo invisibili 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 o è indicato a più dettagli sull'assoluto o relativo.

[!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 (detto talvolta una matrice di proprietà) è un metodo per esporre una raccolta omogenea di valori come singola 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 aggiunta guidata proprietà per implementare una proprietà con parametri.Aggiunta guidata proprietà implementa la proprietà aggiunta di una coppia delle funzioni set/Get che consentono all'utente del controllo di accedere alla proprietà utilizzando la notazione sopra o in modalità standard.

Simile a metodi e proprietà, le proprietà con parametri presentano inoltre un numero illimitato di parametri consentiti.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 matrice bidimensionale di Integer.

Per aggiungere una proprietà con parametri utilizzando l'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 per il 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 su Aggiungi proprietà.

  5. Nella casella di Property Name , tipo Array.

  6. Nella casella di Property Type , shortselezionato.

  7. Per il tipo di Implementation , fare clic Get/Set Methods.

  8. Nelle caselle di Set Function e di Get Function , i nomi univoci del tipo per il ottenere e impostare le funzioni o accettano i nomi predefiniti.

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

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

  11. Fare clic su Fine.

2dffbw6e.collapse_all(it-it,VS.110).gifModifiche apportate aggiungendo guidata proprietà

Quando si aggiunge una proprietà personalizzata, aggiunta guidata proprietà apportare le modifiche all'inizio della classe del controllo (. H) e i file di implementazione (.CPP).

Le righe seguenti vengono aggiunti 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 richiede una riga e la colonna specifiche quando si accede alla proprietà.

Inoltre, aggiunta guidata proprietà aggiungere le righe seguenti 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à modificato il metodo Get per restituire il valore della proprietà.La funzione specificata in genere conterrà il codice da eseguire, prima o dopo la proprietà cambia.

Perché la proprietà sia utile, è possibile dichiarare una variabile membro della matrice bidimensionale nella classe del controllo, di tipo short, archiviare i valori per la proprietà con parametri.È quindi possibile modificare il metodo Get per restituire il valore archiviato nella riga e colonna appropriate, come indicato dai parametri e modificare la funzione impostata per aggiornare il valore fatto riferimento nei parametri di riga e colonna.

Gestione degli errori nel controllo ActiveX

Se le condizioni di errore si verificano nel controllo, è possibile avere l'esigenza di notificare l'errore al contenitore di controlli.Esistono due metodi per la segnalazione degli errori, a seconda della situazione in cui si è verificato l'errore.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 dei simboli definiti nel file di intestazione di OLECTL.H.Nella tabella seguente vengono riepilogati i codici.

Codici di errore del controllo ActiveX

delle modifiche a..."

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

Da lo spazio dello stack

CTL_E_BADFILENAMEORNUMBER

Nome file errato o numero

CTL_E_FILENOTFOUND

File non trovato

CTL_E_BADFILEMODE

Modo non corretto file

CTL_E_FILEALREADYOPEN

File già aperto

CTL_E_DEVICEIOERROR

Errore di I/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 del percorso

CTL_E_PATHNOTFOUND

Percorso non trovato

CTL_E_INVALIDPATTERNSTRING

Stringa non valida del modello

CTL_E_INVALIDUSEOFNULL

Utilizzo non valido di 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 non supportato in fase di esecuzione

CTL_E_SETNOTSUPPORTED

Set non supportato (proprietà di sola lettura)

CTL_E_NEEDPROPERTYARRAYINDEX

Indice della matrice di proprietà di disporre

CTL_E_SETNOTPERMITTED

Set non valido

CTL_E_GETNOTSUPPORTEDATRUNTIME

Ottenere non supportato 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 a IMPIEGATI

CTL_E_SEARCHTEXTNOTFOUND

Il carattere 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 Integer 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 digitare il controllo

In alcuni casi potrebbe essere necessario gestire alcune combinazioni di tasti in modo speciale, ad esempio, aggiungere una nuova riga quando il tasto INVIO viene introdotto un controllo casella di testo o di un movimento su più righe tra un gruppo di controlli di modifica quando una chiave direzionale ID pressed.

Se la classe base del controllo ActiveX è COleControl, è possibile eseguire l'override di CWnd::PreTranslateMessage per gestire i messaggi prima che il contenitore li elabora.Quando si utilizza questa tecnica, TRUE sempre restituita se si gestisce il messaggio nell'override di PreTranslateMessage.

Nell'esempio di codice seguente viene illustrato uno dei modi 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 per la gestione delle interfacce per un controllo ActiveX, vedere la documentazione di ActiveX SDK.

L'accesso ai comandi della finestra di dialogo invisibili in fase di esecuzione

È possibile creare controlli della finestra di dialogo che non dispongono dell'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.In alternativa, è possibile utilizzare una delle seguenti tecniche per ottenere un oggetto che rappresenta il controllo:

  • Mediante l'aggiunta guidata variabile membro di aggiunta, Control Variable quindi selezionare l'id del controlloUn nome di variabile membro e selezionare la classe wrapper del controllo come Control Type.

    In alternativa

  • Dichiarare una variabile locale e una sottoclasse come elemento della finestra di dialogo.Inserire codice simile a quello riportato di seguitoCMyCtrl è la classe wrapper, IDC_MYCTRL1ID del controllo):

    CCirc myCirc;
    myCirc.SubclassDlgItem(IDC_CIRCCTRL2, this);
    // ... use myCirc ...
    myCirc.UnsubclassWindow();
    

Vedere anche

Concetti

Controlli ActiveX MFC