Partilhar via


Sobre os Controles de Edição Rica Sem Janela

Um controle de edição avançado sem janelas, também conhecido como um objeto de serviços de texto, é um objeto que fornece a funcionalidade de um controle de edição avançado 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 ricos sem janela usam um par de interfaces: ITextServices e ITextHost.

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

Msftedit.dll exporta um identificador de interface (IID) chamado IID_ITextServices que pode ser usado 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 para consultar o ITextHost interface.

O 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 de 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çado 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 rico sem janelas 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çado sem janelas, chame o TxSendMessage método. Você pode usar esse método para enviar qualquer uma das mensagens de edição avançadas ou para passar 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 janelas.