using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace GeoSigma.SigmaDrawerUtil { public class AutoResizeForm { /// /// 获取windows缩放比 /// /// 缩放比例 public static float GetWindowsZoomRatio(Graphics graphics) { float dpiX = graphics.DpiX; float zoomRatio = 1.0f; switch (dpiX) { case 96f: zoomRatio = 1.0f; break; case 120f: zoomRatio = 1.25f; break; case 144f: zoomRatio = 1.5f; break; case 168f: zoomRatio = 1.75f; break; case 192f: zoomRatio = 2.0f; break; case 216f: zoomRatio = 2.25f; break; case 240f: zoomRatio = 2.5f; break; case 264f: zoomRatio = 2.75f; break; case 288f: zoomRatio = 3.0f; break; case 312f: zoomRatio = 3.25f; break; case 336f: zoomRatio = 3.5f; break; case 360f: zoomRatio = 3.75f; break; case 384f: zoomRatio = 4.0f; break; case 408f: zoomRatio = 4.25f; break; case 432f: zoomRatio = 4.5f; break; case 456f: zoomRatio = 4.75f; break; case 480f: zoomRatio = 5.0f; break; } return zoomRatio; } public static void ChangeUIByDpi(Control control, float dpixRatio) { control.SuspendLayout(); foreach (Control ctrl in control.Controls) { if (ctrl is Panel) { ChangeUIByDpi((Panel)control, dpixRatio); } else if (ctrl is TreeView treeView) { treeView.ItemHeight = (int)(treeView.ItemHeight * dpixRatio); //treeView.Indent = (int)(treeView.Indent * dpixRatio); //ImageList imgs = new ImageList(); //imgs.ImageSize = new Size( // (int)(treeView.ImageList.ImageSize.Width * dpixRatio) // , (int)(treeView.ImageList.ImageSize.Height * dpixRatio)); //foreach (Image img in treeView.ImageList.Images) //{ // Bitmap enlargedImage = new Bitmap(img.Width * 2, img.Height * 2); // using (Graphics g = Graphics.FromImage(enlargedImage)) // { // g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic; // g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); // } // imgs.Images.Add(enlargedImage); //} //treeView.ImageList = imgs; //treeView.ImageList.ImageSize = new Size( // (int)(treeView.ImageList.ImageSize.Width * dpixRatio) // , (int)(treeView.ImageList.ImageSize.Height * dpixRatio)); } else if (ctrl is ToolStrip toolStrip) { toolStrip.Size = new Size(toolStrip.Size.Width , (int)(toolStrip.Size.Height * dpixRatio)); } } control.ResumeLayout(); } public static void ChangeUIFontByDpi(Control control, float dpixRatio) { control.SuspendLayout(); foreach (Control ctrl in control.Controls) { //else { float fsize = (float)(ctrl.Font.Size * (float)dpixRatio); if (dpixRatio == 0) { fsize = ctrl.Font.Size; } ctrl.Font = new Font(ctrl.Font.Name, fsize, ctrl.Font.Style); //if (bNonZoomsys) // 非缩放状态,要自己定义窗口和控件大小 //{ if (ctrl.Anchor != AnchorStyles.None) { ctrl.Bounds = new Rectangle((int)(ctrl.Location.X), (int)(ctrl.Location.Y), (int)(ctrl.Width * dpixRatio), (int)(ctrl.Height * dpixRatio)); } else { ctrl.Bounds = new Rectangle((int)(ctrl.Location.X * dpixRatio), (int)(ctrl.Location.Y * dpixRatio), (int)(ctrl.Width * dpixRatio), (int)(ctrl.Height * dpixRatio)); } //} } if (ctrl.Controls.Count > 0) { ChangeUIFontByDpi((Panel)control, dpixRatio); } } control.ResumeLayout(); } public static Image ImageBicubicResize(Image sourceImage, float ratio) { int nNewWidth = (int)(sourceImage.Size.Width * ratio); int nNewHeight = (int)(sourceImage.Size.Height * ratio); Bitmap resizedImage = new Bitmap(nNewWidth, nNewHeight); using (Graphics graphics = Graphics.FromImage(resizedImage)) { graphics.InterpolationMode = InterpolationMode.Bicubic; graphics.DrawImage(sourceImage, 0, 0, nNewWidth, nNewHeight); } return resizedImage; } public static void AutoScaleControl(Control ctl, float ratio) { foreach (Control c in ctl.Controls) { c.Bounds = new Rectangle((int)(c.Location.X * ratio), (int)(c.Location.Y * ratio), (int)(c.Width * ratio), (int)(c.Height * ratio)); // 设置字体 //c.Font = new Font(c.Font.Name, (int)(c.Font.Size * ratio), c.Font.Style); //} //c.Location = new Point((int)((ctrLeft0) * ratio), (int)((ctrTop0) * ratio)); //c.Width = (int)(ctrWidth0 * ratio); // 只与最初的大小相关,所以不能与现在的宽度相乘 (int)(c.Width * w); //c.Height = (int)(ctrHeight0 * ratio); // //**放在这里,是先缩放控件本身,后缩放控件的子控件 if (c.Controls.Count > 0) { AutoScaleControl(c, ratio); // 窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用 } if (ctl is DataGridView) { DataGridView dgv = ctl as DataGridView; Cursor.Current = Cursors.WaitCursor; int widths = 0; for (int i = 0; i < dgv.Columns.Count; i++) { dgv.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells); // 自动调整列宽 widths += dgv.Columns[i].Width; // 计算调整列后单元列的宽度和 } if (widths >= ctl.Size.Width) // 如果调整列的宽度大于设定列宽 dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; // 调整列的模式 自动 else dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 如果小于 则填充 Cursor.Current = Cursors.Default; } } } } }