就是在这个地方啦,
HRESULT CCandidateListUIPresenter::_StartCandidateList(TfClientId tfClientId, _In_ ITfDocumentMgr *pDocumentMgr,
_In_ ITfContext *pContextDocument, TfEditCookie ec,
_In_ ITfRange *pRangeComposition, UINT wndWidth)
{
pDocumentMgr;
tfClientId;
HRESULT hr = E_FAIL;
if (FAILED(_StartLayout(pContextDocument, ec, pRangeComposition)))
{
goto Exit;
}
BeginUIElement();
hr = MakeCandidateWindow(pContextDocument, wndWidth);
if (FAILED(hr))
{
goto Exit;
}
Show(_isShowMode);
RECT rcTextExt;
if (SUCCEEDED(_GetTextExt(&rcTextExt)))
{
_LayoutChangeNotification(&rcTextExt);
}
Exit:
if (FAILED(hr))
{
_EndCandidateList();
}
return hr;
}
就是这里的 _GetTextExt,然后,我们再看 _GetTextExt 的函数体,
HRESULT CTfTextLayoutSink::_GetTextExt(_Out_ RECT *lpRect)
{
HRESULT hr = S_OK;
BOOL isClipped = TRUE;
ITfContextView *pContextView = nullptr;
hr = _pContextDocument->GetActiveView(&pContextView);
if (FAILED(hr))
{
return hr;
}
if (FAILED(hr = pContextView->GetTextExt(_tfEditCookie, _pRangeComposition, lpRect, &isClipped)))
{
return hr;
}
pContextView->Release();
return S_OK;
}
可以看到,最终是 pContextView→GetTextExt 这里。