Sobre controles de edição avançada sem janela

Um controle de edição avançada sem janela, também conhecido como um objeto de serviços de texto, é um objeto que fornece a funcionalidade de um controle de edição avançada sem fornecer a janela. Para fornecer a funcionalidade de uma janela, como a capacidade de receber mensagens e um contexto de dispositivo no qual ela pode desenhar, os controles de edição avançada sem janela usam um par de interfaces: ITextServices e ITextHost.

Para criar um controle de edição avançada sem janela, chame a função CreateTextServices com um ponteiro para sua implementação da interface ITextHost. CreateTextServices retorna um ponteiro IUnknown que você pode consultar para recuperar um ponteiro para a implementação ITextServices do controle sem janela.

Msftedit.dll exporta um identificador de interface (IID) chamado IID_ITextServices que você pode usar para consultar o ponteiro IUnknown para a interface ITextServices. O exemplo a seguir mostra como recuperar IID_ITextServices e usá-lo para obter a 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 também exporta um identificador de interface (IID) chamado IID_ITextHost que pode ser usado de maneira semelhante à consulta para a interface ITextHost.

A interface ITextHost tem métodos que o controle sem janela chama para recuperar informações sobre sua janela. Por exemplo, o objeto de serviços de texto chama o método TxGetDC para recuperar um contexto de dispositivo no qual ele pode desenhar. O controle sem janela chama o método TxNotify para enviar notificações, como as mensagens de notificação de edição avançada, para o host de texto. O objeto de serviços de texto chama outros métodos ITextHost para solicitar que o host de texto execute outros serviços relacionados à janela. Por exemplo, o método TxInvalidateRect solicita que o host de texto adicione um retângulo à região de atualização da janela.

Um controle de edição avançada padrão tem um procedimento de janela que processa mensagens do sistema e mensagens do seu aplicativo. Você pode usar o identificador de janela do controle para enviar mensagens para executar edição de texto e outras operações. Mas um controle de edição avançado sem janela não tem nenhum procedimento de janela para receber e processar mensagens. Em vez disso, ele fornece uma interface ITextServices. Para enviar mensagens para um controle de edição avançada sem janela, chame o método TxSendMessage. Você pode usar esse método para enviar qualquer uma das mensagens de edição avançada ou para transmitir outras mensagens que afetam o controle, como mensagens do sistema para entrada de mouse ou teclado.

Você também pode criar o objeto de serviços de texto como parte de um objeto agregado COM. Isso facilita a agregação do objeto de serviços de texto com um objeto COM (Component Object Model) sem janela.