Così, nonostante la filosofia MS è to go toward out-of-the-box stretched images for Windows Form Controls when high DPI, a quanto pare le immagini sul pulsante devono essere allungato manualmente. Naturalmente una soluzione ancora migliore sarebbe quella, per ogni bitmap mostrata all'utente (sul pulsante e ovunque) per definire diverse bitmap adattate al 250% 200% 150% e 125% DPI.
Ecco il codice:
public static IEnumerable<IDisposable> AdjustControlsThroughDPI(this Control.ControlCollection controls) {
Debug.Assert(controls != null);
if (DPIRatioIsOne) {
return new IDisposable[0]; // No need to adjust on DPI One
}
var list = new List<IDisposable>();
foreach (Control control in controls) {
if (control == null) { continue; }
var button = control as ButtonBase;
if (button != null) {
button.AdjustControlsThroughDPI(list);
continue;
}
// Here more controls tahn button can be adjusted if needed...
// Recursive
var nestedControls = control.Controls;
Debug.Assert(nestedControls != null);
if (nestedControls.Count == 0) { continue; }
var disposables = nestedControls.AdjustControlsThroughDPI();
list.AddRange(disposables);
}
return list;
}
private static void AdjustControlsThroughDPI(this ButtonBase button, IList<IDisposable> list) {
Debug.Assert(button != null);
Debug.Assert(list != null);
var image = button.Image;
if (image == null) { return; }
var imageStretched = image.GetImageStretchedDPI();
button.Image = imageStretched;
list.Add(imageStretched);
}
private static Image GetImageStretchedDPI(this Image imageIn) {
Debug.Assert(imageIn != null);
var newWidth = imageIn.Width.MultipliedByDPIRatio();
var newHeight = imageIn.Height.MultipliedByDPIRatio();
var newBitmap = new Bitmap(newWidth, newHeight);
using (var g = Graphics.FromImage(newBitmap)) {
// According to this blog post http://blogs.msdn.com/b/visualstudio/archive/2014/03/19/improving-high-dpi-support-for-visual-studio-2013.aspx
// NearestNeighbor is more adapted for 200% and 200%+ DPI
var interpolationMode = InterpolationMode.HighQualityBicubic;
if (s_DPIRatio >= 2.0f) {
interpolationMode = InterpolationMode.NearestNeighbor;
}
g.InterpolationMode = interpolationMode;
g.DrawImage(imageIn, new Rectangle(0, 0, newWidth, newHeight));
}
imageIn.Dispose();
return newBitmap;
}
Si noti che un enumerabile di bitmap creati monouso viene restituito. Se non ti interessa disporre la bitmap sui pulsanti, non dovrai preoccuparti di eliminare la bitmap tesa.
Avviso disponiamo bitmap di pulsanti originali.
Avviso i nostri membri per trattare con DPI: MultipliedByDPIRatio(this int)
, DPIRatioIsOne:bool
, s_DPIRatio
. Puoi scrivere il tuo, il punto difficile è ottenere il rapporto DPI effettivo. Per raccogliere il rapporto DPI il modo migliore che ho trovato è this one.
Notare il riferimento al post del blog Improving High-DPI support for Visual Studio 2013 dove il team VS spiega che per il loro stile di icona, determinano che l'immagine viene allungata tra] 200%, 100% [si ottiene il migliore con l'algoritmo bicubico e superiore o uguale al 200% , si ottiene al meglio con l'algoritmo naive più vicino. Il codice presentato riflette queste scelte.
Edit: sotto schermata della modalità di interpolazione various a 200% DPI, IMHO InterpolationMode.HighQualityBicubic
è meglio di InterpolationMode.NearestNeighbor
.
fonte
2014-11-13 10:58:58
si sta chiedendo un pony . Puoi facilmente aggiungere il codice per ridimensionare le bitmap, l'unica garanzia che otterrai è che odierai assolutamente il suo aspetto. –
Creare una nuova bitmap e ridimensionarla è la soluzione di hacky/piano B, ovviamente. Questa è la responsabilità del controllo di allungare la sua immagine e qui, voglio davvero assicurarmi di non aver perso una soluzione pulita. –
Questa è la parte misteriosa di questa domanda. Se sai che il ridimensionamento della bitmap è un brutto attacco, perché sulla Terra ti aspetteresti che una classe .NET standard lo usi? Quella "responsabilità" che ci si aspetta semplicemente non è lì. La gestione delle risorse per un programma dpiAware è compito di un programmatore. L'implementazione è piuttosto banale, ma non avrai mai alcun aiuto finché fai la domanda in questo modo. –