À propos des contrôles d’édition enrichie sans fenêtre

Un contrôle d’édition enrichi sans fenêtre, également appelé objet de services de texte, est un objet qui fournit les fonctionnalités d’un contrôle d’édition enrichi sans fournir la fenêtre. Pour fournir les fonctionnalités d’une fenêtre, telles que la possibilité de recevoir des messages et un contexte d’appareil dans lequel elle peut dessiner, les contrôles d’édition riches sans fenêtre utilisent une paire d’interfaces : ITextServices et ITextHost.

Pour créer un contrôle d’édition enrichi sans fenêtre, appelez la fonction CreateTextServices avec un pointeur vers votre implémentation de l’interface ITextHost . CreateTextServices retourne un pointeur IUnknown que vous pouvez interroger pour récupérer un pointeur vers l’implémentation ITextServices du contrôle sans fenêtre.

Msftedit.dll exporte un identificateur d’interface (IID) appelé IID_ITextServices que vous pouvez utiliser pour interroger le pointeur IUnknown pour l’interface ITextServices . L’exemple suivant montre comment récupérer IID_ITextServices et l’utiliser pour obtenir l’interface ITextServices .

    .
    .
    .
    HRESULT hr;
    IUnknown* pUnk = NULL;
    ITextServices* pTextServices =  NULL;
    
    // Create an instance of the application-defined object that implements the 
    // ITextHost interface.
    TextHost* pTextHost = new TextHost();
    if (pTextHost == NULL) 
        goto errorHandler;

    // Create an instance of the text services object.
    hr = CreateTextServices(NULL, pTextHost, &pUnk);
    if (FAILED(hr))
        goto errorHandler;
        
    // Retrieve the IID_ITextServices interface identifier from 
    // Msftedit.dll. The hmodRichEdit parameter is a handle to the 
    // Msftedit.dll module retrieved by a previous call to the 
    // GetModuleHandle function.
    IID* pIID_ITS = (IID*) (VOID*) GetProcAddress(hmodRichEdit, 
        "IID_ITextServices");
               
    // Retrieve the ITextServices interface.    
    hr = pUnk->QueryInterface(*pIID_ITS, (void **)&pTextServices);
    if (FAILED(hr))
        goto errorHandler;
     .
     . 
     .   
     

Msftedit.dll exporte également un identificateur d’interface (IID) appelé IID_ITextHost qui peut être utilisé de la même manière pour interroger l’interface ITextHost .

L’interface ITextHost a des méthodes que le contrôle sans fenêtre appelle pour récupérer des informations sur votre fenêtre. Par exemple, l’objet de services de texte appelle la méthode TxGetDC pour récupérer un contexte d’appareil dans lequel il peut dessiner. Le contrôle sans fenêtre appelle la méthode TxNotify pour envoyer des notifications, telles que les messages de notification de modification enrichie, à l’hôte de texte. L’objet services de texte appelle d’autres méthodes ITextHost pour demander à l’hôte de texte d’effectuer d’autres services liés à la fenêtre. Par exemple, la méthode TxInvalidateRect demande à l’hôte de texte d’ajouter un rectangle à la région de mise à jour de la fenêtre.

Un contrôle d’édition enrichi standard a une procédure de fenêtre qui traite les messages système et les messages de votre application. Vous pouvez utiliser le handle de fenêtre du contrôle pour lui envoyer des messages afin d’effectuer des opérations d’édition de texte et d’autres opérations. Toutefois, un contrôle d’édition enrichi sans fenêtre n’a pas de procédure de fenêtre pour recevoir et traiter des messages. Au lieu de cela, il fournit une interface ITextServices . Pour envoyer des messages à un contrôle d’édition enrichi sans fenêtre, appelez la méthode TxSendMessage . Vous pouvez utiliser cette méthode pour envoyer l’un des messages de modification enrichis ou pour transmettre d’autres messages qui affectent le contrôle, tels que les messages système pour l’entrée de la souris ou du clavier.

Vous pouvez également créer l’objet services de texte dans le cadre d’un objet agrégé COM. Cela facilite l’agrégation de l’objet de services de texte avec un objet COM (Component Object Model) sans fenêtre.