コード例 #1
0
ファイル: HexCaretImpl.cs プロジェクト: pashav15/pashav
        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);
        }
コード例 #2
0
ファイル: TextCaret.cs プロジェクト: manojdjoshi/dnSpy
		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);
		}