本文整理汇总了C++中ITfRange::Release方法的典型用法代码示例。如果您正苦于以下问题:C++ ITfRange::Release方法的具体用法?C++ ITfRange::Release怎么用?C++ ITfRange::Release使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类ITfRange
的用法示例。
在下文中一共展示了ITfRange::Release方法的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SUCCEEDED
STDAPI touchmind::control::DWriteEditControlTextEditSink::OnEndEdit(ITfContext *pic, TfEditCookie ecReadOnly, ITfEditRecord *pEditRecord)
{
std::shared_ptr<control::DWriteEditControl> pEditControl = m_pEditControl.lock();
DisplayAttributeProperties dispAttrProps;
HRESULT hr = m_displayAttribute.GetDisplayAttributeProperties(dispAttrProps);
if (SUCCEEDED(hr)) {
IEnumTfRanges *pEnum;
hr = pEditRecord->GetTextAndPropertyUpdates(TF_GTP_INCL_TEXT,
dispAttrProps.GetPropTablePointer(),
static_cast<ULONG>(dispAttrProps.Count()),
&pEnum);
if (SUCCEEDED(hr) && pEnum) {
ITfRange *pRange;
if (pEnum->Next(1, &pRange, nullptr) == S_OK) {
pRange->Release();
pEditControl->ClearCompositionRenderInfo();
ITfRange *pRangeEntire = nullptr;
ITfRange *pRangeEnd = nullptr;
if (SUCCEEDED(pic->GetStart(ecReadOnly, &pRangeEntire)) &&
SUCCEEDED(pic->GetEnd(ecReadOnly, &pRangeEnd)) &&
SUCCEEDED(pRangeEntire->ShiftEndToRange(ecReadOnly, pRangeEnd, TF_ANCHOR_END))) {
IEnumTfRanges *pEnumRanges;
ITfReadOnlyProperty *pProp = nullptr;
m_displayAttribute.GetDisplayAttributeTrackPropertyRange(pic, dispAttrProps, &pProp);
if (SUCCEEDED(pProp->EnumRanges(ecReadOnly, &pEnumRanges, pRangeEntire))) {
while (pEnumRanges->Next(1, &pRange, nullptr) == S_OK) {
TF_DISPLAYATTRIBUTE da;
ZeroMemory(&da, sizeof(da));
TfGuidAtom guid;
if (m_displayAttribute.GetDisplayAttributeData(ecReadOnly, pProp, pRange, &da, &guid) == S_OK) {
ITfRangeACP *pRangeACP;
if (pRange->QueryInterface(IID_ITfRangeACP, (void **)&pRangeACP) == S_OK) {
LONG nStart;
LONG nEnd;
pRangeACP->GetExtent(&nStart, &nEnd);
pEditControl->AddCompositionRenderInfo(nStart, nStart + nEnd, &da);
pRangeACP->Release();
}
}
}
}
}
if (pRangeEntire) {
pRangeEntire->Release();
}
if (pRangeEnd) {
pRangeEnd->Release();
}
}
pEnum->Release();
}
}
return S_OK;
}
示例2: OnEndEdit
STDAPI CTextService::OnEndEdit(ITfContext *pContext, TfEditCookie ecReadOnly, ITfEditRecord *pEditRecord)
{
BOOL fSelectionChanged;
IEnumTfRanges *pEnumTextChanges;
ITfRange *pRange;
//
// did the selection change?
// The selection change includes the movement of caret as well.
// The caret position is represent as the empty selection range when
// there is no selection.
//
if (pEditRecord->GetSelectionStatus(&fSelectionChanged) == S_OK &&
fSelectionChanged)
{
// If the selection is moved to out side of the current composition,
// we terminate the composition. This TextService supports only one
// composition in one context object.
if (_IsComposing())
{
TF_SELECTION tfSelection;
ULONG cFetched;
if (pContext->GetSelection(ecReadOnly, TF_DEFAULT_SELECTION, 1, &tfSelection, &cFetched) == S_OK && cFetched == 1)
{
ITfRange *pRangeComposition;
// is the insertion point covered by a composition?
if (_pComposition->GetRange(&pRangeComposition) == S_OK)
{
if (!IsRangeCovered(ecReadOnly, tfSelection.range, pRangeComposition))
{
_EndComposition(pContext);
}
pRangeComposition->Release();
}
}
}
}
// text modification?
if (pEditRecord->GetTextAndPropertyUpdates(TF_GTP_INCL_TEXT, NULL, 0, &pEnumTextChanges) == S_OK)
{
if (pEnumTextChanges->Next(1, &pRange, NULL) == S_OK)
{
//
// pRange is the updated range.
//
pRange->Release();
}
pEnumTextChanges->Release();
}
return S_OK;
}
示例3: _HandleCompositionArrowKey
HRESULT COVTSF::_HandleCompositionArrowKey(TfEditCookie ec, _In_ ITfContext *pContext, KEYSTROKE_FUNCTION keyFunction)
{
ITfRange* pRangeComposition = nullptr;
TF_SELECTION tfSelection;
ULONG fetched = 0;
// get the selection
if (FAILED(pContext->GetSelection(ec, TF_DEFAULT_SELECTION, 1, &tfSelection, &fetched))
|| fetched != 1)
{
// no selection, eat the keystroke
return S_OK;
}
// get the composition range
if (FAILED(_pComposition->GetRange(&pRangeComposition)))
{
goto Exit;
}
// For incremental candidate list
if (_pCandidateListUIPresenter)
{
_pCandidateListUIPresenter->AdviseUIChangedByArrowKey(keyFunction);
}
pContext->SetSelection(ec, 1, &tfSelection);
pRangeComposition->Release();
Exit:
tfSelection.range->Release();
return S_OK;
}
示例4: InsertTextAtSelection
void InsertTextAtSelection(TfEditCookie ec, ITfContext *pContext, const WCHAR *pchText, ULONG cchText)
{
ITfInsertAtSelection *pInsertAtSelection;
ITfRange *pRange;
TF_SELECTION tfSelection;
// we need a special interface to insert text at the selection
if (pContext->QueryInterface(IID_ITfInsertAtSelection, (void **)&pInsertAtSelection) != S_OK)
return;
// insert the text
if (pInsertAtSelection->InsertTextAtSelection(ec, 0, pchText, cchText, &pRange) != S_OK)
goto Exit;
// update the selection, we'll make it an insertion point just past
// the inserted text.
pRange->Collapse(ec, TF_ANCHOR_END);
tfSelection.range = pRange;
tfSelection.style.ase = TF_AE_NONE;
tfSelection.style.fInterimChar = FALSE;
pContext->SetSelection(ec, 1, &tfSelection);
pRange->Release();
Exit:
pInsertAtSelection->Release();
}
示例5: OnEndEdit
STDAPI CCaseTextService::OnEndEdit(ITfContext *pContext, TfEditCookie ecReadOnly, ITfEditRecord *pEditRecord)
{
BOOL fSelectionChanged;
IEnumTfRanges *pEnumTextChanges;
ITfRange *pRange;
// we'll use the endedit notification to update the snoop window
// did the selection change?
if (pEditRecord->GetSelectionStatus(&fSelectionChanged) == S_OK &&
fSelectionChanged)
{
_pSnoopWnd->_UpdateText(ecReadOnly, pContext, NULL);
return S_OK;
}
// text modification?
if (pEditRecord->GetTextAndPropertyUpdates(TF_GTP_INCL_TEXT, NULL, 0, &pEnumTextChanges) == S_OK)
{
if (pEnumTextChanges->Next(1, &pRange, NULL) == S_OK)
{
// arbitrary update the snoop window with the first change
// there may be more than one in the enumerator, but we don't care here
_pSnoopWnd->_UpdateText(ecReadOnly, pContext, pRange);
pRange->Release();
}
pEnumTextChanges->Release();
}
// if we get here, only property values changed
return S_OK;
}
示例6: doStartCompositionEditSession
// callback from edit session for starting composition
HRESULT TextService::doStartCompositionEditSession(TfEditCookie cookie, StartCompositionEditSession* session) {
ITfContext* context = session->context();
ITfContextComposition* contextComposition;
if(context->QueryInterface(IID_ITfContextComposition, (void**)&contextComposition) == S_OK) {
// get current insertion point in the current context
ITfRange* range = NULL;
ITfInsertAtSelection* insertAtSelection;
if(context->QueryInterface(IID_ITfInsertAtSelection, (void **)&insertAtSelection) == S_OK) {
// get current selection range & insertion position (query only, did not insert any text)
insertAtSelection->InsertTextAtSelection(cookie, TF_IAS_QUERYONLY, NULL, 0, &range);
insertAtSelection->Release();
}
if(range) {
if(contextComposition->StartComposition(cookie, range, (ITfCompositionSink*)this, &composition_) == S_OK) {
// according to the TSF sample provided by M$, we need to reset current
// selection here. (maybe the range is altered by StartComposition()?
// So mysterious. TSF is absolutely overly-engineered!
TF_SELECTION selection;
selection.range = range;
selection.style.ase = TF_AE_NONE;
selection.style.fInterimChar = FALSE;
context->SetSelection(cookie, 1, &selection);
// we did not release composition_ object. we store it for use later
}
range->Release();
}
contextComposition->Release();
}
return S_OK;
}
示例7: DoEditSession
STDAPI WeaselTSF::DoEditSession(TfEditCookie ec)
{
ITfInsertAtSelection *pInsertAtSelection;
ITfRange *pRange;
TF_SELECTION tfSelection;
if (_pEditSessionContext->QueryInterface(IID_ITfInsertAtSelection, (LPVOID *) &pInsertAtSelection) != S_OK)
return E_FAIL;
/* insert the text */
if (pInsertAtSelection->InsertTextAtSelection(ec, 0, _pEditSessionText, _cEditSessionText, &pRange) != S_OK)
{
pInsertAtSelection->Release();
return E_FAIL;
}
/* update the selection to an insertion point just past the inserted text. */
pRange->Collapse(ec, TF_ANCHOR_END);
tfSelection.range = pRange;
tfSelection.style.ase = TF_AE_NONE;
tfSelection.style.fInterimChar = FALSE;
_pEditSessionContext->SetSelection(ec, 1, &tfSelection);
pRange->Release();
pInsertAtSelection->Release();
return S_OK;
}
示例8: _CreateAndStartCandidate
HRESULT CDIME::_CreateAndStartCandidate(_In_ CCompositionProcessorEngine *pCompositionProcessorEngine, TfEditCookie ec, _In_ ITfContext *pContext)
{
debugPrint(L"CDIME::_CreateAndStartCandidate(), _candidateMode = %d", _candidateMode);
HRESULT hr = S_OK;
if ((_candidateMode == CANDIDATE_NONE) && (_pUIPresenter))
{
// we don't cache the document manager object. So get it from pContext.
ITfDocumentMgr* pDocumentMgr = nullptr;
if (SUCCEEDED(pContext->GetDocumentMgr(&pDocumentMgr)))
{
// get the composition range.
ITfRange* pRange = nullptr;
if (SUCCEEDED(_pComposition->GetRange(&pRange)))
{
hr = _pUIPresenter->_StartCandidateList(_tfClientId, pDocumentMgr, pContext, ec, pRange, pCompositionProcessorEngine->GetCandidateWindowWidth());
pRange->Release();
}
pDocumentMgr->Release();
}
}
return hr;
}
示例9: doEndCompositionEditSession
// callback from edit session for ending composition
HRESULT TextService::doEndCompositionEditSession(TfEditCookie cookie, EndCompositionEditSession* session) {
if(composition_) {
// move current insertion point to end of the composition string
ITfRange* compositionRange;
if(composition_->GetRange(&compositionRange) == S_OK) {
// clear display attribute for the composition range
ComPtr<ITfProperty> dispAttrProp;
if(session->context()->GetProperty(GUID_PROP_ATTRIBUTE, &dispAttrProp) == S_OK) {
dispAttrProp->Clear(cookie, compositionRange);
}
TF_SELECTION selection;
ULONG selectionNum;
if(session->context()->GetSelection(cookie, TF_DEFAULT_SELECTION, 1, &selection, &selectionNum) == S_OK) {
selection.range->ShiftEndToRange(cookie, compositionRange, TF_ANCHOR_END);
selection.range->Collapse(cookie, TF_ANCHOR_END);
session->context()->SetSelection(cookie, 1, &selection);
selection.range->Release();
}
compositionRange->Release();
}
// end composition and clean up
composition_->EndComposition(cookie);
// do some cleanup in the derived class here
onCompositionTerminated(false);
composition_->Release();
composition_ = NULL;
}
return S_OK;
}
示例10: isInsertionAllowed
// check if current insertion point is in the range of composition.
// if not in range, insertion is now allowed
bool TextService::isInsertionAllowed(EditSession* session) {
TfEditCookie cookie = session->editCookie();
TF_SELECTION selection;
ULONG selectionNum;
if(isComposing()) {
if(session->context()->GetSelection(cookie, TF_DEFAULT_SELECTION, 1, &selection, &selectionNum) == S_OK) {
ITfRange* compositionRange;
if(composition_->GetRange(&compositionRange) == S_OK) {
bool allowed = false;
// check if current selection is covered by composition range
LONG compareResult1;
LONG compareResult2;
if(selection.range->CompareStart(cookie, compositionRange, TF_ANCHOR_START, &compareResult1) == S_OK
&& selection.range->CompareStart(cookie, compositionRange, TF_ANCHOR_END, &compareResult2) == S_OK) {
if(compareResult1 == -1 && compareResult2 == +1)
allowed = true;
}
compositionRange->Release();
}
if(selection.range)
selection.range->Release();
}
}
return false;
}
示例11: _HandleCharacterKey
HRESULT CTextService::_HandleCharacterKey(TfEditCookie ec, ITfContext *pContext, WPARAM wParam)
{
if (!_IsComposing())
_StartComposition(pContext);
//
// create an instance of the candidate list class.
//
if (_pCandidateList == NULL)
_pCandidateList = new CCandidateList(this);
//
// The document manager object is not cached. Get it from pContext.
//
ITfDocumentMgr *pDocumentMgr;
if (pContext->GetDocumentMgr(&pDocumentMgr) == S_OK)
{
//
// get the composition range.
//
ITfRange *pRange;
if (_pComposition->GetRange(&pRange) == S_OK)
{
_pCandidateList->_StartCandidateList(_tfClientId, pDocumentMgr, pContext, ec, pRange);
pRange->Release();
}
pDocumentMgr->Release();
}
if (_IsComposing())
_TerminateComposition(ec, pContext);
return S_OK;
}
示例12: _SetCompositionDisplayAttributes
BOOL CTextService::_SetCompositionDisplayAttributes(TfEditCookie ec, ITfContext *pContext, TfGuidAtom gaDisplayAttribute)
{
ITfRange *pRangeComposition;
ITfProperty *pDisplayAttributeProperty;
HRESULT hr;
// we need a range and the context it lives in
if (_pComposition->GetRange(&pRangeComposition) != S_OK)
return FALSE;
hr = E_FAIL;
// get our the display attribute property
if (pContext->GetProperty(GUID_PROP_ATTRIBUTE, &pDisplayAttributeProperty) == S_OK)
{
VARIANT var;
// set the value over the range
// the application will use this guid atom to lookup the acutal rendering information
var.vt = VT_I4; // we're going to set a TfGuidAtom
var.lVal = gaDisplayAttribute;
hr = pDisplayAttributeProperty->SetValue(ec, pRangeComposition, &var);
pDisplayAttributeProperty->Release();
}
pRangeComposition->Release();
return (hr == S_OK);
}
示例13: _ClearCompositionDisplayAttributes
void CMarkTextService::_ClearCompositionDisplayAttributes(TfEditCookie ec)
{
ITfRange *pRangeComposition;
ITfContext *pContext;
ITfProperty *pDisplayAttributeProperty;
// we need a range and the context it lives in
if (_pComposition->GetRange(&pRangeComposition) != S_OK)
return;
if (pRangeComposition->GetContext(&pContext) != S_OK)
{
pContext = NULL;
goto Exit;
}
// get our the display attribute property
if (pContext->GetProperty(GUID_PROP_ATTRIBUTE, &pDisplayAttributeProperty) != S_OK)
goto Exit;
// clear the value over the range
pDisplayAttributeProperty->Clear(ec, pRangeComposition);
pDisplayAttributeProperty->Release();
Exit:
pRangeComposition->Release();
SafeRelease(pContext);
}
示例14: _AddComposingAndChar
HRESULT CDIME::_AddComposingAndChar(TfEditCookie ec, _In_ ITfContext *pContext, _In_ CStringRange *pstrAddString)
{
debugPrint(L"CDIME::_AddComposingAndChar() reading string = %s", pstrAddString->Get());
HRESULT hr = S_OK;
ULONG fetched = 0;
TF_SELECTION tfSelection;
if (pContext->GetSelection(ec, TF_DEFAULT_SELECTION, 1, &tfSelection, &fetched) != S_OK || fetched == 0)
return S_FALSE;
//
// make range start to selection
//
ITfRange* pAheadSelection = nullptr;
hr = pContext->GetStart(ec, &pAheadSelection);
if (SUCCEEDED(hr) && pAheadSelection)
{
debugPrint(L"CDIME::_AddComposingAndChar() SUCCEEDED( pContext->GetStart( &pAheadSelection))");
hr = pAheadSelection->ShiftEndToRange(ec, tfSelection.range, TF_ANCHOR_START);
if (SUCCEEDED(hr))
{
debugPrint(L"CDIME::_AddComposingAndChar() SUCCEEDED( pAheadSelection->ShiftEndToRange())");
ITfRange* pRange = nullptr;
BOOL exist_composing = _FindComposingRange(ec, pContext, pAheadSelection, &pRange);
if (FAILED(_SetInputString(ec, pContext, pRange, pstrAddString, exist_composing)))
debugPrint(L"CDIME::_AddComposingAndChar() _SetInputString() failed.");
if (pRange)
pRange->Release();
lastReadingString = *pstrAddString;
}
}
tfSelection.range->Release();
if (pAheadSelection)
{
pAheadSelection->Release();
}
return S_OK;
}
示例15: _SetInputString
HRESULT CSampleIME::_SetInputString(TfEditCookie ec, _In_ ITfContext *pContext, _Out_opt_ ITfRange *pRange, _In_ const std::wstring &pstrAddString, BOOL exist_composing)
{
ITfRange* pRangeInsert = nullptr;
if (!exist_composing)
{
_InsertAtSelection(ec, pContext, pstrAddString, &pRangeInsert);
if (pRangeInsert == nullptr)
{
return S_OK;
}
pRange = pRangeInsert;
}
if (pRange != nullptr)
{
pRange->SetText(ec, 0, pstrAddString.c_str(), pstrAddString.length());
}
/* sets GUID_PROP_LANGID */
_SetCompositionLanguage(ec, pContext);
/* sets GUID_PROP_ATTRIBUTE */
_SetCompositionDisplayAttributes(ec, pContext, _gaDisplayAttributeInput);
// update the selection, we'll make it an insertion point just past
// the inserted text.
ITfRange* pSelection = nullptr;
TF_SELECTION sel;
if ((pRange != nullptr) && (pRange->Clone(&pSelection) == S_OK))
{
pSelection->Collapse(ec, TF_ANCHOR_END);
sel.range = pSelection;
sel.style.ase = TF_AE_NONE;
sel.style.fInterimChar = FALSE;
pContext->SetSelection(ec, 1, &sel);
pSelection->Release();
}
if (pRangeInsert)
{
pRangeInsert->Release();
}
return S_OK;
}