void TextService::setCompositionString(EditSession* session, const wchar_t* str, int len) { ITfContext* context = session->context(); if(context) { TfEditCookie editCookie = session->editCookie(); TF_SELECTION selection; ULONG selectionNum; // get current selection/insertion point if(context->GetSelection(editCookie, TF_DEFAULT_SELECTION, 1, &selection, &selectionNum) == S_OK) { ComPtr<ITfRange> compositionRange; if(composition_->GetRange(&compositionRange) == S_OK) { bool selPosInComposition = true; // if current insertion point is not covered by composition, we cannot insert text here. if(selPosInComposition) { // replace context of composion area with the new string. compositionRange->SetText(editCookie, TF_ST_CORRECTION, str, len); // move the insertion point to end of the composition string selection.range->Collapse(editCookie, TF_ANCHOR_END); context->SetSelection(editCookie, 1, &selection); } // set display attribute to the composition range ComPtr<ITfProperty> dispAttrProp; if(context->GetProperty(GUID_PROP_ATTRIBUTE, &dispAttrProp) == S_OK) { VARIANT val; val.vt = VT_I4; val.lVal = module_->inputAttrib()->atom(); dispAttrProp->SetValue(editCookie, compositionRange, &val); } } selection.range->Release(); } } }