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
void UpdatePosition() void UpdatePosition()
{ {
TextView textView = this.TextArea.TextView; TextView textView = this.TextArea.TextView;
// PointToScreen returns device dependent units (physical pixels)
Point location = textView.PointToScreen(visualLocation - textView.ScrollOffset); Point location = textView.PointToScreen(visualLocation - textView.ScrollOffset);
Point locationTop = textView.PointToScreen(visualLocationTop - 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 bounds = new Rect(location, completionWindowSize);
Rect workingScreen = System.Windows.Forms.Screen.GetWorkingArea(location.ToSystemDrawing()).ToWpf(); Rect workingScreen = System.Windows.Forms.Screen.GetWorkingArea(location.ToSystemDrawing()).ToWpf();
if (!workingScreen.Contains(bounds)) { if (!workingScreen.Contains(bounds)) {
@ -263,6 +265,8 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion
bounds.Y = workingScreen.Top; bounds.Y = workingScreen.Top;
} }
} }
// Convert the window bounds to device independent units
bounds = bounds.TransformFromDevice(this);
this.Left = bounds.X; this.Left = bounds.X;
this.Top = bounds.Y; this.Top = bounds.Y;
} }

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

@ -161,6 +161,32 @@ namespace ICSharpCode.AvalonEdit.Utils
} }
#endregion #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 #region System.Drawing <-> WPF conversions
public static System.Drawing.Point ToSystemDrawing(this Point p) public static System.Drawing.Point ToSystemDrawing(this Point p)
{ {

Loading…
Cancel
Save