David Wilhelm e2099a034d Scale TreeViewAdv elements based on DPI
TreeViewAdv assumed a standard 96 DPI display. This commit fixes some
problems on high DPI displays, including some problems mentioned in
OHM issue 830.

- column header height
- checkboxes
- icons
- indentation
2020-05-23 20:17:54 +02:00

99 lines
2.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using Aga.Controls.Properties;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
namespace Aga.Controls.Tree.NodeControls
{
internal class NodePlusMinus : NodeControl
{
public const int ImageSize = 9;
public const int Width = 16;
private Bitmap _plus;
private Bitmap _minus;
private VisualStyleRenderer _openedRenderer;
private VisualStyleRenderer OpenedRenderer
{
get
{
if (_openedRenderer == null)
_openedRenderer = new VisualStyleRenderer(VisualStyleElement.TreeView.Glyph.Opened);
return _openedRenderer;
}
}
private VisualStyleRenderer _closedRenderer;
private VisualStyleRenderer ClosedRenderer
{
get
{
if (_closedRenderer == null)
_closedRenderer = new VisualStyleRenderer(VisualStyleElement.TreeView.Glyph.Closed);
return _closedRenderer;
}
}
public NodePlusMinus()
{
_plus = Resources.plus;
_minus = Resources.minus;
}
public override Size MeasureSize(TreeNodeAdv node, DrawContext context)
{
int scaledX = node.Tree.GetScaledSize(Width, false);
int scaledY = node.Tree.GetScaledSize(Width);
return new Size(scaledX, scaledY);
}
public override void Draw(TreeNodeAdv node, DrawContext context)
{
if (node.CanExpand)
{
Rectangle r = context.Bounds;
int scaledX = node.Tree.GetScaledSize(ImageSize, false);
int scaledY = node.Tree.GetScaledSize(ImageSize);
int dy = (int)Math.Round((float)(r.Height - scaledY) / 2);
if (Application.RenderWithVisualStyles)
{
VisualStyleRenderer renderer;
if (node.IsExpanded)
renderer = OpenedRenderer;
else
renderer = ClosedRenderer;
renderer.DrawBackground(context.Graphics, new Rectangle(r.X, r.Y + dy, scaledX, scaledY));
}
else
{
Image img;
if (node.IsExpanded)
img = _minus;
else
img = _plus;
context.Graphics.DrawImageUnscaled(img, new Point(r.X, r.Y + dy));
}
}
}
public override void MouseDown(TreeNodeAdvMouseEventArgs args)
{
if (args.Button == MouseButtons.Left)
{
args.Handled = true;
if (args.Node.CanExpand)
args.Node.IsExpanded = !args.Node.IsExpanded;
}
}
public override void MouseDoubleClick(TreeNodeAdvMouseEventArgs args)
{
args.Handled = true; // Supress expand/collapse when double click on plus/minus
}
}
}