Поделиться через


Сведения о элементах управления расширенными возможностями редактирования без окон

Элемент управления расширенными возможностями редактирования, также известный как объект текстовых служб, — это объект, предоставляющий функциональные возможности элемента управления расширенными изменениями без предоставления окна. Для предоставления функциональных возможностей окна, таких как возможность получать сообщения и контекст устройства, в который он может рисовать, элементы управления с расширенными возможностями редактирования окна используют пару интерфейсов: ITextServices и ITextHost.

Чтобы создать элемент управления полнофункциональные изменения, вызовите функцию CreateTextServices с указателем на реализацию интерфейса ITextHost. CreateTextServices возвращает указатель IUnknown, который можно запросить для получения указателя на реализацию ITextServices элемента управления без окна.

Msftedit.dll экспортирует идентификатор интерфейса (IID), называемый IID_ITextServices, который можно использовать для запроса указателя IUnknown для интерфейса ITextServices. В следующем примере показано, как получить IID_ITextServices и использовать его для получения интерфейса 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 также экспортирует идентификатор интерфейса (IID), называемый IID_ITextHost, который можно использовать аналогичным образом для запроса интерфейса ITextHost.

Интерфейс ITextHost содержит методы, вызывающие вызовы элемента управления без окна для получения сведений о окне. Например, объект текстовых служб вызывает метод TxGetDC для получения контекста устройства, в который он может нарисовать. Элемент управления без окна вызывает метод TxNotify для отправки уведомлений, таких как сообщения с расширенными изменениями, в текстовый узел. Объект служб текста вызывает другие методы ITextHost , чтобы запросить текстовый узел для выполнения других служб, связанных с окном. Например, метод TxInvalidateRect запрашивает текстовый узел для добавления прямоугольника в область обновления окна.

Стандартный элемент управления расширенными возможностями редактирования содержит процедуру окна, которая обрабатывает системные сообщения и сообщения из приложения. Вы можете использовать дескриптор окна элемента управления для отправки сообщений для выполнения редактирования текста и других операций. Но элемент управления полноэкционным редактированием не имеет процедуры окна для получения и обработки сообщений. Вместо этого он предоставляет интерфейс ITextServices. Чтобы отправить сообщения в элемент управления полнофункциональные изменения, вызовите метод TxSendMessage . Этот метод можно использовать для отправки любого из сообщений с широкими возможностями редактирования или передачи других сообщений, влияющих на элемент управления, таких как системные сообщения для ввода мыши или клавиатуры.

Можно также создать объект текстовых служб в составе объекта COM-агрегированного объекта. Это позволяет легко агрегировать объект текстовых служб с помощью объекта com-модели без окон.