void MoveImeCompositionWindow() { if (!IsValuesCaretPresent && !IsAsciiCaretPresent) { return; } if (imeState.Context == IntPtr.Zero) { return; } var line = ContainingHexViewLine; if (line.VisibilityState == VSTF.VisibilityState.Unattached) { return; } var linePos = GetLinePosition(line.BufferLine, currentPosition); if (linePos == null) { return; } var charBounds = line.GetExtendedCharacterBounds(linePos.Value); const int CFS_DEFAULT = 0x0000; const int CFS_FORCE_POSITION = 0x0020; var compForm = new ImeState.COMPOSITIONFORM(); compForm.dwStyle = CFS_DEFAULT; var rootVisual = imeState.HwndSource.RootVisual; GeneralTransform generalTransform = null; if (rootVisual != null && rootVisual.IsAncestorOf(hexView.VisualElement)) { generalTransform = hexView.VisualElement.TransformToAncestor(rootVisual); } var compTarget = imeState.HwndSource.CompositionTarget; if (generalTransform != null && compTarget != null) { var transform = compTarget.TransformToDevice; compForm.dwStyle = CFS_FORCE_POSITION; var caretPoint = transform.Transform(generalTransform.Transform(new Point(charBounds.Left - hexView.ViewportLeft, charBounds.TextTop - hexView.ViewportTop))); var viewPointTop = transform.Transform(generalTransform.Transform(new Point(0, 0))); var viewPointBottom = transform.Transform(generalTransform.Transform(new Point(hexView.ViewportWidth, hexView.ViewportHeight))); compForm.ptCurrentPos = new ImeState.POINT(Math.Max(0, (int)caretPoint.X), Math.Max(0, (int)caretPoint.Y)); compForm.rcArea = new ImeState.RECT( Math.Max(0, (int)viewPointTop.X), Math.Max(0, (int)viewPointTop.Y), Math.Max(0, (int)viewPointBottom.X), Math.Max(0, (int)viewPointBottom.Y)); } ImeState.ImmSetCompositionWindow(imeState.Context, ref compForm); }
void MoveImeCompositionWindow() { if (imeState.Context == IntPtr.Zero) return; var line = ContainingTextViewLine; if (line.VisibilityState == VisibilityState.Unattached) return; var charBounds = line.GetExtendedCharacterBounds(currentPosition); const int CFS_DEFAULT = 0x0000; const int CFS_FORCE_POSITION = 0x0020; var compForm = new ImeState.COMPOSITIONFORM(); compForm.dwStyle = CFS_DEFAULT; var rootVisual = imeState.HwndSource.RootVisual; GeneralTransform generalTransform = null; if (rootVisual != null && rootVisual.IsAncestorOf(textView.VisualElement)) generalTransform = textView.VisualElement.TransformToAncestor(rootVisual); var compTarget = imeState.HwndSource.CompositionTarget; if (generalTransform != null && compTarget != null) { var transform = compTarget.TransformToDevice; compForm.dwStyle = CFS_FORCE_POSITION; var caretPoint = transform.Transform(generalTransform.Transform(new Point(charBounds.Left - textView.ViewportLeft, charBounds.TextTop - textView.ViewportTop))); var viewPointTop = transform.Transform(generalTransform.Transform(new Point(0, 0))); var viewPointBottom = transform.Transform(generalTransform.Transform(new Point(textView.ViewportWidth, textView.ViewportHeight))); compForm.ptCurrentPos = new ImeState.POINT(Math.Max(0, (int)caretPoint.X), Math.Max(0, (int)caretPoint.Y)); compForm.rcArea = new ImeState.RECT( Math.Max(0, (int)viewPointTop.X), Math.Max(0, (int)viewPointTop.Y), Math.Max(0, (int)viewPointBottom.X), Math.Max(0, (int)viewPointBottom.Y)); } ImeState.ImmSetCompositionWindow(imeState.Context, ref compForm); }