Сведения о элементах управления расширенными возможностями редактирования без окон
Элемент управления расширенными возможностями редактирования, также известный как объект текстовых служб, — это объект, предоставляющий функциональные возможности элемента управления расширенными изменениями без предоставления окна. Для предоставления функциональных возможностей окна, таких как возможность получать сообщения и контекст устройства, в который он может рисовать, элементы управления с расширенными возможностями редактирования окна используют пару интерфейсов: 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-модели без окон.