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;

  方法二: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;
        }

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

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

时间: 2024-10-12 21:43:27

C#:设计DPI的高分辨率下的显示问题的相关文章

image-set实现Retina屏幕下图片显示[转载]

最近一直在学习Retina屏幕下图片的处理方法,从<走向视网膜(Retina)的Web时代>一文中知道了Retina这个新名词,同时知道了他是什么东东,同时也继续在探讨Retina方面的知识点,随后在<移动Web——CSS为Retian屏幕替换图片>和<使用css sprites来优化你的网站在Retina屏幕下显示>中学习了Retina屏幕下图片的设置方法,或者说技巧吧,接下来<Web设计师如何制作Retina图像>学习了Retina屏幕下的图片制作技巧.

文件中的类都不能进行设计,因此未能为该文件显示设计器 VS2008(Visual Studio 2008) x64

项目属性 运行平台x64 Form2 继承 Form1 , Form2 设计器 报错 64位dll  无法加载 DLL 找不到指定的模块 原因Vs2008(Visual Studio 2008)默认 没安装64编译器 安装参照:<http://blog.csdn.net/clever101/article/details/8844314> 安装sp1补丁会报这个, 安装目录:D:\Program Files (x86)\Microsoft Visual Studio 9.0\Microsoft

java简单的实现搜索框的下拉显示相关搜索功能

最近做了一个简单的搜索框下面下拉显示相关搜索的功能,有点模仿百度的下拉展示相关搜索 先上个展示图 : 点击进入演示地址,大家可以输入长点的搜索,点击搜索,再输入之前搜索词的前面部分,看是否能展示出来 搜索框相关搜索的展示很简单,就是根据你的搜索词,去数据库中匹配,是否有类似的搜索词存在,按照搜索词被搜索的次数进行排序显示出来 我设计的是每次搜索一个词,提交之后都会去数据库进行查询,看是否存在这个搜索词的搜索,若存在,则对数据库中的这个搜索词对象进行次数加1,不存在,则创建这个新搜索词对象,保存在

MySQL学习笔记_6_SQL语言的设计与编写(下)

 SQL语言的设计与编写(下) --SELECT查询精讲 概要: SELECT[ALL | DISTINCT] #distinct 明显的,清楚的,有区别的 {*|table.*|[table.]field1[asalias1][,[table.]field2[as alias2]][.....]} #alias 别名,化名 FROM 表名 [WHERE...] [GROUPBY...] [HAVING...] [ORDERBY ...] [LIMITcount] 使用SELECT查询语言,

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

一.使用JFreeChart建的报表,在window下能正常显示,但是放到linux下就报错,而且有时候会把tomcat挂掉, 原因是jfreechart的在linux系统中需要访问java awt库提供...... 一.使用JFreeChart建的报表,在window下能正常显示,但是放到linux下就报错,而且有时候会把tomcat挂掉,原因是jfreechart的在linux系统中需要访问java awt库提供的图形功能,而linux下的绝大多数版本的java awt类库都需要x serv

Windows下VC++显示UTF-8编码中文

笔者在Windows下使用C++编写程序接收UTF8字符串会发生中文无法正常在console上显示的问题,故特来解决UTF8字符串如何在VC++上正常显示. 1.问题重现,UTF-8编码下的字符串“中文”在Windows下的显示如下图,其中上行为UTF8字符串,下行为GBK字符串: 2.方法:将UTF-8格式的代码变为GBK编码(需要Windows.h头文件) 1 string UTF8ToGBK(string &strUtf8) 2 { 3 string strOutGBK = "&q

a标签的背景图在ie8下不显示的问题

突然发现临下班时候问题就多, 马上下班了被头头告知线上已经上线很久的活动现在有个兼容性问题, a标签的背景图在ie8下会有不显示的情况. 我自己找了台ie8的机器实验了一下, 发现一切正常, 但是在另外一个同事机器上就会有这个问题, 真心奇怪! 后来找到问题的原因, 是因为在ie8下要显示a标签的背景图有一个重要属性: display:block; 同时还要注意background属性中 no-repeat 前面的空格. 改正之后, 背景图正常显示了. 不过同是ie8, 一个可以, 一个却不行这

ubuntu 14.04下chrome显示标题乱码问题

最近ubuntu 14.04和chrome都升级成最新版后,chrome标题栏和书签栏都不能正常显示中文了. 然后搜了下发现这样可以解决: 修改文件 /etc/fonts/conf.d/49-sansserif.conf 将其中标红部分修改一个已经安装的中文字体,我现在用的时文泉驿微米黑所以就这样改: 修改前: <edit name="family" mode="append_last"> <string>sans-serif</str

winform下 PictureBox 显示网络图片

Image pic = new Image.FromStream(WebRequest.Create("http://x.com/x.jpg").GetResponse().GetResponseStream()); picturebox1.Image = pic 对读取错误的处理没有加 winform下 PictureBox 显示网络图片,布布扣,bubuko.com