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

 

posted @ 2016-06-17 18:13  慧由心生  阅读(16505)  评论(3编辑  收藏  举报