一、背景

  在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;

  方法二:Winform解决方法:

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

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

BackgroundImage = GetDestopImage();
BackgroundImageLayout = ImageLayout.Zoom;

        private Image GetDestopImage()
        {
            ;
            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(, , , , 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、修改拷贝内容位置信息

        private void DrawLastImage()
        {
            ;
            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,
                        ,
                        ,
                        reSelectImageRect,
                        GraphicsUnit.Pixel);

                    g.Flush();
                    g.Dispose();
                    _image = bmp;
                }
            }
        }

  4、获取DPI代码:

        public static float getLogPiex()
        {
            ;
            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 = ;
            }
            return returnValue;
        }

C#:涉及DPI的高分辨率下的显示问题的更多相关文章

  1. 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新

    在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...

  2. JFreechart在linux下不显示及中文乱码问题

    一.使用JFreeChart建的报表,在window下能正常显示,但是放到linux下就报错,而且有时候会把tomcat挂掉, 原因是jfreechart的在linux系统中需要访问java awt库 ...

  3. css 图片内容在不同分辨率下居中显示(演示的图片宽度是1920px,当图片宽度大于显示屏的宽度时)

    1.img 图片内容在不同分辨率下居中显示(如果隐藏多余,在img外面套一个div  设定overflow: hidden.div的大小就是img显示区域的大小) <!DOCTYPE html& ...

  4. Linux下grep显示前后几行信息

    Linux下grep显示前后几行信息 标准unix/linux下的grep通过下面參数控制上下文 grep -C 5 foo file 显示file文件里匹配foo字串那行以及上下5行grep -B ...

  5. Linux下中文显示乱码问题

    Linux下中文显示乱码问题 输出编码选utf-8 然后文件本身编码也要是utf-8

  6. DataGridView单元格内容自动匹配下拉显示

    页面显示数据使用的控件是ComponentFactory.Krypton.Toolkit中的KryptonDataGridView控件.在指定“商品”单元格中需要根据用户输入内容自动匹配数据库中商品信 ...

  7. win7系统扩展双屏幕时,如何在两个屏幕下都显示任务栏

    扩展屏幕下都显示任务栏!!! win7系统本身无法设置该功能(目前我是不知道) 但可以下载第三方软件来解决该问题. 第一步:Dual Monitor Taskbar 下载软件 下载链接:http:// ...

  8. qt如何实现一个渐隐窗口呢(开启的时候他是从上往下渐渐显示)

    qt如何实现一个渐隐窗口呢?就是比如说开启的时候他是从上往下渐渐显示的,关闭的时候从下往上渐渐小时的http://stackoverflow.com/questions/19087822/how-to ...

  9. IE6 IE7下文字显示竖排的解决办法

    IE下文字显示竖排的解决办法: white-space:nowrap;

随机推荐

  1. VC++ 限制窗口的大小范围的方法

    响应WM_GETMAXMININFO  的消息 处理之 void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) { // TODO: Add y ...

  2. jQuery演示10种不同的切换图片列表动画效果以及tab动画演示 2

    很常用的一款特效纯CSS完成tab实现5种不同切换对应内容效果 实例预览 下载地址 实例代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...

  3. web前端socket封装库--giraffe

    摘要: 最近在做前端的socket消息推送,使用了socket.io.js的最新版本.使用过的都知道socket.io.js是基于消息类型来通信的,如果消息类型多了就很难维护.所以本人就对socket ...

  4. Cheatsheet: 2013 07.09 ~ 07.20

    Mobile How to implement Android Splash Screen Migrating iOS MVC Applications to Windows Phone 8 (M-V ...

  5. Hibernate的集合映射与sort、order-by属性

    [Hibernate]Hibernate的集合映射与sort.order-by属性 常用集合Set.List.Map,相信大家都很熟悉,面试中也会经常问.Set和List都继承了Collection接 ...

  6. 1.4.9 DocValues

    DocValues 在solr4.2以后,引入了一个令人兴奋的功能,这个功能在lucene存在已经一段时间了,但是还没有在solr中使用. 在某些方面,DocValue 是一种非常有效的索引方式. 为 ...

  7. [BZOJ 1070] [SCOI2007] 修车 【费用流】

    题目链接:BZOJ - 1070 题目分析 首先想到拆点,把每个技术人员拆成 n 个点,从某个技术人员拆出的第 i 个点,向某辆车连边,表示这是这个技术人员修的倒数第 i 辆车.那么这一次修车对整个答 ...

  8. ps 网页配图设计

    网站配图设计 蒙太奇 品科软件---网页页面 1橡皮擦来画两图 容合 大橡皮擦擦出来自然 2图放到一个色块中 用剪贴蒙版 3调色阶 装饰下图片  矩形工具  形状  填充 画彩条 超出本框的怎么去掉多 ...

  9. hbase自带mapreduce计数表行数功能

    $HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter ‘tablename’ mapreduce来计数,很快的!!!

  10. SharePoint 2016 每天预热脚本介绍

    使用SharePoint的朋友们应该知道,SharePoint每天夜里有自动回收的机制,使环境每天把占用的内存都释放出来,以确保不会累计占用过多内存导致服务器崩溃. 我们可以打开IIS,选中我们的应用 ...