/// <summary> /// Scales <b>System.Windows.Size</b> if <i>dpiOf.Dpi</i> isn't 96 (100%). /// </summary> public static SIZE Scale(System.Windows.Size z, DpiOf dpiOf) { double f = (int)dpiOf / 96d; z.Width *= f; z.Height *= f; return(new(z.Width.ToInt(), z.Height.ToInt())); }
//Unscaling sometimes useful with WPF. Unscale to double, not int, else result often incorrect. /// <summary> /// Scales <b>SIZE</b> if <i>dpiOf.Dpi</i> isn't 96 (100%). /// </summary> public static SIZE Scale(SIZE z, DpiOf dpiOf) { int dpi = dpiOf; z.width = Math2.MulDiv(z.width, dpi, 96); z.height = Math2.MulDiv(z.height, dpi, 96); return(z); }
/// <summary> /// Scales <b>RECT</b> if <i>dpiOf.Dpi</i> isn't 96 (100%). /// </summary> public static RECT Scale(RECT r, DpiOf dpiOf) { int dpi = dpiOf; r.left = Math2.MulDiv(r.left, dpi, 96); r.top = Math2.MulDiv(r.top, dpi, 96); r.right = Math2.MulDiv(r.right, dpi, 96); r.bottom = Math2.MulDiv(r.bottom, dpi, 96); return(r); }
/// <summary> /// Calls API <msdn>AdjustWindowRectExForDpi</msdn> if available, else <msdn>AdjustWindowRectEx</msdn>. /// </summary> /// <remarks> /// Also adds scrollbar width or/and height if need. /// </remarks> public static bool AdjustWindowRectEx(DpiOf dpiOf, ref RECT r, WS style, WSE exStyle, bool hasMenu = false) { int dpi = dpiOf; bool ok = osVersion.minWin10_1607 ? Api.AdjustWindowRectExForDpi(ref r, style, hasMenu, exStyle, dpi) : Api.AdjustWindowRectEx(ref r, style, hasMenu, exStyle); if (ok) { if (style.Has(WS.VSCROLL)) { r.Width += ScrollbarV_(dpi); } if (style.Has(WS.HSCROLL)) { r.Width += ScrollbarH_(dpi); } } return(ok); }
/// <summary> /// Takes screenshot of specified rectangle in screen, quantizes colors to make smaller, compresses, Base64 encodes and returns comment string like <c>" /*image:...*/"</c>. /// If fails, prints warning and returns null. /// </summary> public static string MakeScreenshotComment(RECT r, DpiOf dpi = default) { if (dpi != default) { int i = dpi.Dpi; if (i != 96) { r.Inflate((Dpi.Scale(r.Width, i) - r.Width) / 2, (Dpi.Scale(r.Height, i) - r.Height) / 2); } } try { var b = uiimage.capture(r); var a = Quantize(b, 16); var z = Convert2.BrotliCompress(a); return("/*image:" //+ "\r\n" //rejected + "WkJN" + Convert.ToBase64String(z) + "*/"); } catch (Exception e1) { print.warning("MakeScreenshotComment() failed. " + e1.ToStringWithoutStack()); return(null); } }
/// <summary> /// Calls API <msdn>SystemParametersInfoForDpi</msdn> if available, else <msdn>SystemParametersInfo</msdn>. /// Use only with <i>uiAction</i> = SPI_GETICONTITLELOGFONT, SPI_GETICONMETRICS, SPI_GETNONCLIENTMETRICS. /// </summary> public static unsafe bool SystemParametersInfo(uint uiAction, int uiParam, void *pvParam, DpiOf dpiOf) => osVersion.minWin10_1607 ? Api.SystemParametersInfoForDpi(uiAction, uiParam, pvParam, 0, dpiOf) : Api.SystemParametersInfo(uiAction, uiParam, pvParam);
/// <summary> /// Calls API <msdn>GetSystemMetricsForDpi</msdn> if available, else <msdn>GetSystemMetrics</msdn>. /// </summary> public static int GetSystemMetrics(int nIndex, DpiOf dpiOf) => osVersion.minWin10_1607 ? Api.GetSystemMetricsForDpi(nIndex, dpiOf) : Api.GetSystemMetrics(nIndex);
/// <summary> /// Unscales <b>RECT</b> if <i>dpiOf.Dpi</i> isn't 96 (100%). /// </summary> public static System.Windows.Rect Unscale(RECT r, DpiOf dpiOf) { double f = 96d / dpiOf; return(new(r.left * f, r.top *f, r.Width *f, r.Height *f)); }
/// <summary> /// Unscales <b>SIZE</b> if <i>dpiOf.Dpi</i> isn't 96 (100%). /// </summary> public static System.Windows.Size Unscale(SIZE z, DpiOf dpiOf) { double f = 96d / dpiOf; return(new(z.width * f, z.height *f)); }
//no. Eg also would be used for uint, long... Or name eg ScaleD. Or add double extension method. ///// <summary> ///// Scales <b>int</b> if <i>dpiOf.Dpi</i> isn't 96 (100%). ///// </summary> //public static int Scale(double i, DpiOf dpiOf) => (i*(int)dpiOf/96).ToInt(); /// <summary> /// Unscales <b>int</b> if <i>dpiOf.Dpi</i> isn't 96 (100%). /// </summary> public static double Unscale(int i, DpiOf dpiOf) => i * (96d / dpiOf);
///// //public static int OfScreen(screen s, bool supportWin81 = false) => OfScreen(s.Now, supportWin81); /// <summary> /// Scales <b>int</b> if <i>dpiOf.Dpi</i> isn't 96 (100%). /// </summary> public static int Scale(int i, DpiOf dpiOf) => Math2.MulDiv(i, dpiOf, 96);
/// <summary> /// Selects standard UI font for specified DPI. /// </summary> /// <param name="dpi"></param> public FontDC_(DpiOf dpi) : this(NativeFont_.RegularCached(dpi)) { }