我需要找出用户的屏幕是否设置为正常的96 dpi(小尺寸),大的120 dpi字体或其他东西。我如何做到这一点在VB.NET(首选)或C#?如何检测用户的字体(DPI)是否设置为小,大或其他?
回答
的最好办法就是让形式自动调整自身的大小,根据用户当前的DPI设置。要做到这一点,只需将AutoScaleMode
property设置为AutoScaleMode.Dpi
并启用AutoSize
属性即可。你可以做到这一点无论是从属性窗口在设计或虽然代码:
Public Sub New()
InitializeComponent()
Me.AutoScaleMode = AutoScaleMode.Dpi
Me.AutoSize = True
End Sub
或者,如果你需要知道这个信息,同时绘制(如在Paint
事件处理方法),可以提取来自Graphics
class实例的DpiX
和DpiY
属性的信息。
Private Sub myControl_Paint(ByVal sender As Object, ByVal e As PaintEventArgs)
Dim dpiX As Single = e.Graphics.DpiX
Dim dpiY As Single = e.Graphics.DpiY
' Do your drawing here
' ...
End Sub
最后,如果你需要确定即时的DPI级别,你必须创建Graphics
类的临时实例为您的表单,并检查DpiX
和DpiY
特性,如上图所示。表格类的CreateGraphics
method使得这很容易做到;只需确保将此对象的创建包装在Using
statement中以避免内存泄漏。示例代码:
Dim dpiX As Single
Dim dpiY As Single
Using g As Graphics = myForm.CreateGraphics()
dpiX = g.DpiX
dpiY = g.DpiY
End Using
嗨,谢谢!但是,dpi与屏幕大小(X/Y)或字体大小(X仅限于可用)有关吗?换句话说,我可以确定在所有情况下dpiX = dpiY?否则,新的字体看起来会拉长,不是吗? – 2011-05-22 12:15:41
@Didier:是的,通常情况下,dpiX将相当于dpiY。如果不是,它会看起来很紧张。这取决于分辨率和用户选择的DPI设置。默认的小设置有dpiX = 96和dpiY = 96.默认大设置有dpiX = 120和dpiY = 120.您可以查看[此MSDN页面](http://msdn.microsoft.com/en-us/ library/dd464646.aspx)的高DPI应用程序。链接的[how-to页面](http://msdn.microsoft.com/en-us/library/dd464660.aspx)非常好。 – 2011-05-22 13:16:50
- 1. 如何检测用户的字体(DPI)?
- 2. CSS'font-size:medium'是否将字体设置为.Body字体大小或* browser *的基本字体大小?
- 3. QWebView与所有其他QWidgets相比DPI [字体大小]不同?
- 4. 将小部件大小设置为其他大小的一半
- 5. 如何设置UITextView的字体大小?
- 6. 是否可以为NSString设置自定义字体和大小?
- 7. 如何设置字体大小FONT-FAMILY
- 8. 如何检查字符串大小是否大于其容器的大小?
- 9. 更改DPI时字体大小不变
- 10. GTK +设置字体大小
- 11. Lighttable,设置字体大小
- 12. 根据其帧大小设置UILabel字体大小?
- 13. 如何检测浏览器中的字体大小是否增加
- 14. 如何检测$ _POST是否已设置?
- 15. 是他们的任何规则设置为图标/字体/等的大小。根据屏幕的大小
- 16. 用UITableView和paging.enabled = YES(或其他方式?)设置页面大小
- 17. 如何检测我的其他应用是否由用户购买?
- 18. iText:如何检测PDF页面是否为信件或合法的大小
- 19. 字体大小覆盖其他样式
- 20. 是否有一个autocmd或其他钩子来检测'wrap'或`textwidth`是否被切换/设置?
- 21. 如何检测用户是否用他的手拿着iPhone
- 22. RichTextBox中的字体大小或其他格式
- 23. 如何为当前用户设置其他用户角色?
- 24. 如何检测用户是否正在用他的设备行走/跑步?
- 25. 如何为Activator.CreateInstance设置字典大小?
- 26. 如何从其他活动更改按钮的字体大小?
- 27. 如何检查用户是否跟随用户列表中的其他用户?
- 28. 如何使用jquery为整个页面设置更大的字体大小?
- 29. 如何用\ setbeamerfont设置任何字体大小(例如32pt)?
- 30. 如何在Eclipse中将字体大小设置为10.5?
一个土生土长的方式(用Delphi编写的,但只使用本地的Windows API):'VAR DC:HDC; res:整数; 开始 dc:= GetDC(0);如果dc> 0,则 尝试 res:= GetDeviceCaps(dc,LOGPIXELSX); 终于 ReleaseDC(0,dc) end;' – 2011-05-21 15:46:09
正如Andreas所说,你也可以调用Windows API函数'GetDC'和'GetDeviceCaps'来获得这些信息,但是你必须使用P/Invoke从.NET应用程序中获取它们,这样做几乎没有什么好处,因为'Graphics'类已经在托管代码中很好地包装了它。 – 2011-05-21 15:53:41
但无论如何,**谢谢你[付税](http://blogs.msdn.com/b/oldnewthing/archive/2004/07/14/182971.aspx)** !! – 2011-05-21 15:54:31