Browse Source

Fix the position of code completion window for non-default DPI

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4341 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
David Srbecký 17 years ago
parent
commit
e936a38958
  1. 6
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindowBase.cs
  2. 26
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs

6
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/CompletionWindowBase.cs

@ -244,10 +244,12 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion @@ -244,10 +244,12 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
void UpdatePosition()
{
TextView textView = this.TextArea.TextView;
// PointToScreen returns device dependent units (physical pixels)
Point location = textView.PointToScreen(visualLocation - textView.ScrollOffset);
Point locationTop = textView.PointToScreen(visualLocationTop - textView.ScrollOffset);
Size completionWindowSize = new Size(this.ActualWidth, this.ActualHeight);
// Let's use device dependent units for everything
Size completionWindowSize = new Size(this.ActualWidth, this.ActualHeight).TransformToDevice(this);
Rect bounds = new Rect(location, completionWindowSize);
Rect workingScreen = System.Windows.Forms.Screen.GetWorkingArea(location.ToSystemDrawing()).ToWpf();
if (!workingScreen.Contains(bounds)) {
@ -263,6 +265,8 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion @@ -263,6 +265,8 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
bounds.Y = workingScreen.Top;
}
}
// Convert the window bounds to device independent units
bounds = bounds.TransformFromDevice(this);
this.Left = bounds.X;
this.Top = bounds.Y;
}

26
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/ExtensionMethods.cs

@ -161,6 +161,32 @@ namespace ICSharpCode.AvalonEdit.Utils @@ -161,6 +161,32 @@ namespace ICSharpCode.AvalonEdit.Utils
}
#endregion
#region DPI independence
public static Rect TransformToDevice(this Rect rect, Visual visual)
{
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
return Rect.Transform(rect, matrix);
}
public static Rect TransformFromDevice(this Rect rect, Visual visual)
{
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice;
return Rect.Transform(rect, matrix);
}
public static Size TransformToDevice(this Size size, Visual visual)
{
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
return new Size(size.Width * matrix.M11, size.Height * matrix.M22);
}
public static Size TransformFromDevice(this Size size, Visual visual)
{
Matrix matrix = PresentationSource.FromVisual(visual).CompositionTarget.TransformFromDevice;
return new Size(size.Width * matrix.M11, size.Height * matrix.M22);
}
#endregion
#region System.Drawing <-> WPF conversions
public static System.Drawing.Point ToSystemDrawing(this Point p)
{

Loading…
Cancel
Save