Rozwiązania tego problemu są następujące:
- napisanie własnego menadżera rysowania (tego nie jestem pewny)
- przygotowanie obrazków we właściwych rozmiarach
- ich programowe przeskalowanie na starcie aplikacji
Ja osobiście zdecydowałem się na trzecie rozwiązanie. Przygotowujemy sobie obrazki jako przeźroczyste PNG o rozmiarach 256x256 i skalujemy je do odpowiednich rozmiarów w razie potrzeby.
Wadą tego rozwiązania jest to, że nasz przeskalowany obrazek - 32x32 mniej, ale 16x16 już bardzo - to prawie pixel art - gdzie zręczny grafik dłubiąc ręcznie w pikselach jest w stanie uzyskać obrazek lepszej jakości niż przez przeskalowanie.
Kod jego implementacji:
private void ResizeContextMenuStripImages()
{
foreach (var c in FindAll<Control>())
{
if (c.ContextMenuStrip == null)
continue;
foreach (var item in
c.ContextMenuStrip.Items.OfType<ToolStripMenuItem>())
{
if (item.Image == null)
continue;
var image = ResizeImage(
item.Image, c.ContextMenuStrip.ImageScalingSize);
item.Image.Dispose();
item.Image = image;
}
}
}
private void ResizeToolStripImages()
{
foreach (var toolstrip in FindAll<ToolStrip>())
{
foreach (var button in toolstrip.Items.OfType<ToolStripButton>())
{
if (button.Image == null)
continue;
var image = ResizeImage(button.Image, toolstrip.ImageScalingSize);
button.Image.Dispose();
button.Image = image;
}
}
}
private Bitmap ResizeImage(Image a_image, Size a_size)
{
Bitmap bmp = new Bitmap(a_size.Width, a_size.Height, a_image.PixelFormat);
using (Graphics g = Graphics.FromImage(bmp))
{
g.CompositingQuality = CompositingQuality.HighQuality;
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.SmoothingMode = SmoothingMode.HighQuality;
g.DrawImage(a_image, 0, 0, bmp.Width, bmp.Height);
}
return bmp;
}
private IEnumerable<T> FindAll<T>(Control a_control = null)
{
List<T> list = new List<T>();
if (a_control == null)
a_control = this;
foreach (var c in a_control.Controls.OfType<T>())
list.Add(c);
foreach (var c in a_control.Controls.Cast<Control>())
list.AddRange(FindAll<T>(c));
return list;
}
Brak komentarzy:
Prześlij komentarz