• C#:涉及DPI的高分辨率下的显示问题


    一、背景

      在PC机上显示正常,在高分辨率下的Pad上,显示出现问题:

        1、显示在屏幕最右端的窗体(控件)显示不出来;

        2、截图时,被截图的界面字体文字变大,界面因此显示不全。

    二、解决方法:

      方法一:WPF上使用WPF方式获取屏幕大小,而不是Winform的获取屏幕大小的方式。

                    //Size primarySize = Screen.PrimaryScreen.Bounds.Size;
                    double dWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
                    double dHeight = System.Windows.SystemParameters.PrimaryScreenHeight;
    View Code

      方法二:Winform解决方法:

      1、设置窗体的背景图片方式改为可缩放方式(Zoom): BackgroundImageLayout = ImageLayout.Zoom;

      2、依据DPI扩展拷贝图片的大小,设置拷贝的图片的DPI(bmp的SetResolution方法)

    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;
            }
    View Code

      3、修改拷贝内容位置信息

            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;
                    }
                }
            }
    View Code

      4、获取DPI代码:

            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;
            }
    View Code
  • 相关阅读:
    database backup scripts
    RMAN笔记之备份集和备份片
    数据缓冲区详解
    Oracle数据库中快照的使用
    linux 安装RabbitMQ 注意版本
    转 Oracle12c/11个 Client安装出现"[INS-30131]"错误“请确保当前用户具有访问临时位置所需的权限”解决办法之完整版
    Oracle alert日志中出现:‘Fatal NI connect error 12170’
    Oracle表分区分为四种:范围分区,散列分区,列表分区和复合分区
    python基础: String类型
    Python3 urllib模块的使用(转载)
  • 原文地址:https://www.cnblogs.com/shenchao/p/5594831.html
Copyright © 2020-2023  润新知