Acerca de los controles de edición enriquecida sin ventanas

Un control de edición enriquecida sin ventanas, también conocido como objeto de servicios de texto, es un objeto que proporciona la funcionalidad de un control de edición enriquecido sin proporcionar la ventana. Para proporcionar la funcionalidad de una ventana, como la capacidad de recibir mensajes y un contexto de dispositivo en el que puede dibujar, los controles de edición enriquecidos sin ventana usan un par de interfaces: ITextServices e ITextHost.

Para crear un control de edición enriquecido sin ventanas, llame a la función CreateTextServices con un puntero a la implementación de la interfaz ITextHost . CreateTextServices devuelve un puntero IUnknown que puede consultar para recuperar un puntero a la implementación de ITextServices del control sin ventanas.

Msftedit.dll exporta un identificador de interfaz (IID) denominado IID_ITextServices que puede usar para consultar el puntero IUnknown para la interfaz ITextServices . En el ejemplo siguiente se muestra cómo recuperar IID_ITextServices y usarlo para obtener la interfaz 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 también exporta un identificador de interfaz (IID) denominado IID_ITextHost que se puede usar de forma similar para consultar la interfaz ITextHost .

La interfaz ITextHost tiene métodos que el control sin ventana llama para recuperar información sobre la ventana. Por ejemplo, el objeto de servicios de texto llama al método TxGetDC para recuperar un contexto de dispositivo en el que se puede dibujar. El control sin ventana llama al método TxNotify para enviar notificaciones, como los mensajes de notificación de edición enriquecidas, al host de texto. El objeto de servicios de texto llama a otros métodos ITextHost para solicitar al host de texto que realice otros servicios relacionados con la ventana. Por ejemplo, el método TxInvalidateRect solicita al host de texto que agregue un rectángulo a la región de actualización de la ventana.

Un control de edición enriquecido estándar tiene un procedimiento de ventana que procesa los mensajes del sistema y los mensajes de la aplicación. Puede usar el identificador de ventana del control para enviar mensajes para realizar la edición de texto y otras operaciones. Pero un control de edición enriquecida sin ventanas no tiene ningún procedimiento de ventana para recibir y procesar mensajes. En su lugar, proporciona una interfaz ITextServices . Para enviar mensajes a un control de edición enriquecida sin ventanas, llame al método TxSendMessage . Puede usar este método para enviar cualquiera de los mensajes de edición enriquecidos o para pasar otros mensajes que afectan al control, como los mensajes del sistema para la entrada del mouse o del teclado.

También puede crear el objeto de servicios de texto como parte de un objeto agregado COM. Esto facilita la agregación del objeto de servicios de texto con un objeto Component Object Model (COM) sin ventanas.