一、背景

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

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

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

二、解决方法:

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

  1. //Size primarySize = Screen.PrimaryScreen.Bounds.Size;
  2. double dWidth = System.Windows.SystemParameters.PrimaryScreenWidth;
  3. double dHeight = System.Windows.SystemParameters.PrimaryScreenHeight;

  方法二:Winform解决方法:

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

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

  1. BackgroundImage = GetDestopImage();
  2. BackgroundImageLayout = ImageLayout.Zoom;
  3.  
  4. private Image GetDestopImage()
  5. {
  6. float rate = dpi / ;
  7. Rectangle rect = Screen.GetBounds(this);
  8. Size sz = new System.Drawing.Size();
  9. sz.Width = (int)(rect.Size.Width * rate);
  10. sz.Height = (int)(rect.Size.Height * rate);
  11. Bitmap bmp = new Bitmap(
  12. sz.Width, sz.Height, PixelFormat.Format32bppArgb);
  13. bmp.SetResolution(dpi, dpi);
  14. Graphics g = Graphics.FromImage(bmp);
  15. g.CopyFromScreen(, , , , sz);
  16. //IntPtr gHdc = g.GetHdc();
  17. //IntPtr deskHandle = NativeMethods.GetDesktopWindow();
  18.  
  19. //IntPtr dHdc = NativeMethods.GetDC(deskHandle);
  20. //NativeMethods.BitBlt(
  21. // gHdc,
  22. // 0,
  23. // 0,
  24. // Width ,
  25. // Height,
  26. // dHdc,
  27. // 0,
  28. // 0,
  29. // NativeMethods.TernaryRasterOperations.SRCCOPY);
  30. //NativeMethods.ReleaseDC(deskHandle, dHdc);
  31. //g.ReleaseHdc(gHdc);
  32. //bmp.Save("test.png");
  33. return bmp;
  34. }

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

  1. private void DrawLastImage()
  2. {
  3. float rate = dpi / ;
  4. int reWidth = (int)(Width * rate);
  5. int reHeight = (int)(Height * rate);
  6. using (Bitmap allBmp = new Bitmap(
  7. reWidth, reHeight, PixelFormat.Format32bppArgb))
  8. {
  9. allBmp.SetResolution(dpi,dpi);
  10. using (Graphics allGraphics = Graphics.FromImage(allBmp))
  11. {
  12. allGraphics.InterpolationMode =
  13. InterpolationMode.HighQualityBicubic;
  14. allGraphics.SmoothingMode = SmoothingMode.AntiAlias;
  15. allGraphics.DrawImage(
  16. BackgroundImage,
  17. Point.Empty);
  18. DrawOperate(allGraphics);
  19. allGraphics.Flush();
  20.  
  21. Rectangle reSelectImageRect = new Rectangle();
  22. reSelectImageRect.X = (int)(SelectImageRect.X * rate);
  23. reSelectImageRect.Y = (int)(SelectImageRect.Y * rate);
  24. reSelectImageRect.Width = (int)(SelectImageRect.Width * rate);
  25. reSelectImageRect.Height = (int)(SelectImageRect.Height * rate);
  26. Bitmap bmp = new Bitmap(
  27. reSelectImageRect.Width,
  28. reSelectImageRect.Height,
  29. PixelFormat.Format32bppArgb);
  30. bmp.SetResolution(dpi, dpi);
  31. Graphics g = Graphics.FromImage(bmp);
  32. g.DrawImage(
  33. allBmp,
  34. ,
  35. ,
  36. reSelectImageRect,
  37. GraphicsUnit.Pixel);
  38.  
  39. g.Flush();
  40. g.Dispose();
  41. _image = bmp;
  42. }
  43. }
  44. }

  4、获取DPI代码:

  1. public static float getLogPiex()
  2. {
  3. float returnValue = ;
  4. try
  5. {
  6. RegistryKey key = Registry.CurrentUser;
  7. RegistryKey pixeKey = key.OpenSubKey("Control Panel\\Desktop");
  8. if (pixeKey != null)
  9. {
  10. var pixels = pixeKey.GetValue("LogPixels");
  11. if (pixels != null)
  12. {
  13. returnValue = float.Parse(pixels.ToString());
  14. }
  15. pixeKey.Close();
  16. }
  17. else
  18. {
  19. pixeKey = key.OpenSubKey("Control Panel\\Desktop\\WindowMetrics");
  20. if (pixeKey != null)
  21. {
  22. var pixels = pixeKey.GetValue("AppliedDPI");
  23. if (pixels != null)
  24. {
  25. returnValue = float.Parse(pixels.ToString());
  26. }
  27. pixeKey.Close();
  28. }
  29. }
  30. }
  31. catch(Exception ex)
  32. {
  33. returnValue = ;
  34. }
  35. return returnValue;
  36. }

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

  1. 在不同DPI屏幕环境下,让图标显示的尺寸保持不变,使用 LoadImage() 加载图标

    之前写过的一个客户端程序中,需要在状态栏上显示图标: 我当时使用的是:HICON LoadIcon(HINSTANCE hInstance, LPCTSTR lpIconName); 在DPI:125 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Displaying a full list of groups in Odoo's Kanban view

    Kanban view is probably the most flexible view in Odoo. It can be used for many different purposes. ...

  2. oracle中复制表和数据 && 多表插入语句

    创建测试表和测试数据 create table test  (id number,name varchar(10));  insert into  test values(1,'liufang');  ...

  3. jquery中each遍历各种标签方法

    这写天用到的遍历jquery each方法比较频繁 刚好有时间,就在这里记录一下 jquery用的是bootstrap的线上文件 不需要导入 <!DOCTYPE html><html ...

  4. SQL 参数化查询 应用于 Like

    在sql 进行参数化查询的时候,使用like 语句和参数的时候,错误的写法:  Participant like '%@Participant%' ,这样在数据库为解析为 '%'participant ...

  5. 配置samba服务一例

    问题: 在/data/share目录下建立三个子目录public.training.devel用途如下 public目录用于存放公共数据,如公司的规章制度 training目录用于存放公司的技术培训资 ...

  6. jquery暂停和中断循环

    jquery对数组进行循环,如果要求每次循环的时候暂停2秒钟,在.earch循环的时候,无论怎么设置,都不会暂停. setTimeout也只是在第一次执行的时候暂停. 原因猜测: js开始执行多线程? ...

  7. Linux常用命令(持续更新)

    lsb_release -a 查看linux操作系统信息 getconf LONG_BIT 查看linux操作系统位数 useradd [-g groupname] username 创建用户,并指定 ...

  8. html - 自动播放音乐

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  9. Openfire 的安装和配置

    1. 下载最新的openfire安装文件 官方下载站点:http://www.igniterealtime.org/downloads/index.jsp#openfire 下载地址: Exe:htt ...

  10. Android课程---Oracle VM VirtualBox出现不能为虚拟机打开一个新任务

    因工作需要在Win7下增添了Win7虚拟系统,随着VirtualBox 4.326的版本更新,用户们也开始升级.一用户在升级后发现原来创建的虚拟机无法打开,提示信息为:不能为虚拟电脑win7打开一个新 ...