C#:涉及DPI的高分辨率下的显示问题
一、背景
在PC机上显示正常,在高分辨率下的Pad上,显示出现问题:
1、显示在屏幕最右端的窗体(控件)显示不出来;
2、截图时,被截图的界面字体文字变大,界面因此显示不全。
二、解决方法:
方法一:WPF上使用WPF方式获取屏幕大小,而不是Winform的获取屏幕大小的方式。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//Size primarySize = Screen.PrimaryScreen.Bounds.Size; double dWidth = System.Windows.SystemParameters.PrimaryScreenWidth; double dHeight = System.Windows.SystemParameters.PrimaryScreenHeight;
方法二:Winform解决方法:
1、设置窗体的背景图片方式改为可缩放方式(Zoom): BackgroundImageLayout = ImageLayout.Zoom;
2、依据DPI扩展拷贝图片的大小,设置拷贝的图片的DPI(bmp的SetResolution方法)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
BackgroundImage = GetDestopImage(); BackgroundImageLayout = ImageLayout.Zoom; private Image GetDestopImage() { float rate = dpi / 96; Rectangle rect = Screen.GetBounds(this); Size sz = new System.Drawing.Size(); sz.Width = (int)(rect.Size.Width * rate); sz.Height = (int)(rect.Size.Height * rate); Bitmap bmp = new Bitmap( sz.Width, sz.Height, PixelFormat.Format32bppArgb); bmp.SetResolution(dpi, dpi); Graphics g = Graphics.FromImage(bmp); g.CopyFromScreen(0, 0, 0, 0, sz); //IntPtr gHdc = g.GetHdc(); //IntPtr deskHandle = NativeMethods.GetDesktopWindow(); //IntPtr dHdc = NativeMethods.GetDC(deskHandle); //NativeMethods.BitBlt( // gHdc, // 0, // 0, // Width , // Height, // dHdc, // 0, // 0, // NativeMethods.TernaryRasterOperations.SRCCOPY); //NativeMethods.ReleaseDC(deskHandle, dHdc); //g.ReleaseHdc(gHdc); //bmp.Save("test.png"); return bmp; }
3、修改拷贝内容位置信息
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
private void DrawLastImage() { float rate = dpi / 96; int reWidth = (int)(Width * rate); int reHeight = (int)(Height * rate); using (Bitmap allBmp = new Bitmap( reWidth, reHeight, PixelFormat.Format32bppArgb)) { allBmp.SetResolution(dpi,dpi); using (Graphics allGraphics = Graphics.FromImage(allBmp)) { allGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic; allGraphics.SmoothingMode = SmoothingMode.AntiAlias; allGraphics.DrawImage( BackgroundImage, Point.Empty); DrawOperate(allGraphics); allGraphics.Flush(); Rectangle reSelectImageRect = new Rectangle(); reSelectImageRect.X = (int)(SelectImageRect.X * rate); reSelectImageRect.Y = (int)(SelectImageRect.Y * rate); reSelectImageRect.Width = (int)(SelectImageRect.Width * rate); reSelectImageRect.Height = (int)(SelectImageRect.Height * rate); Bitmap bmp = new Bitmap( reSelectImageRect.Width, reSelectImageRect.Height, PixelFormat.Format32bppArgb); bmp.SetResolution(dpi, dpi); Graphics g = Graphics.FromImage(bmp); g.DrawImage( allBmp, 0, 0, reSelectImageRect, GraphicsUnit.Pixel); g.Flush(); g.Dispose(); _image = bmp; } } }
4、获取DPI代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public static float getLogPiex() { float returnValue = 96; try { RegistryKey key = Registry.CurrentUser; RegistryKey pixeKey = key.OpenSubKey("Control Panel\\Desktop"); if (pixeKey != null) { var pixels = pixeKey.GetValue("LogPixels"); if (pixels != null) { returnValue = float.Parse(pixels.ToString()); } pixeKey.Close(); } else { pixeKey = key.OpenSubKey("Control Panel\\Desktop\\WindowMetrics"); if (pixeKey != null) { var pixels = pixeKey.GetValue("AppliedDPI"); if (pixels != null) { returnValue = float.Parse(pixels.ToString()); } pixeKey.Close(); } } } catch(Exception ex) { returnValue = 96; } return returnValue; }