C# 如何保持宽屏显示器应用程序的适当纵横比?
我有一个宽屏显示器,我想保持我的应用程序的纵横比,甚至处理可能设置的“错误”分辨率 例如,显示器可以显示分辨率为1920x1080的完美圆圈。 但当分辨率设置为1400x1050时,圆看起来像椭圆 我们的客户对此非常挑剔,要求确定并调整应用程序的大小,以显示具有任何分辨率和监视器的完美圆圈C# 如何保持宽屏显示器应用程序的适当纵横比?,c#,.net,resolution,screen-resolution,high-resolution,C#,.net,Resolution,Screen Resolution,High Resolution,我有一个宽屏显示器,我想保持我的应用程序的纵横比,甚至处理可能设置的“错误”分辨率 例如,显示器可以显示分辨率为1920x1080的完美圆圈。 但当分辨率设置为1400x1050时,圆看起来像椭圆 我们的客户对此非常挑剔,要求确定并调整应用程序的大小,以显示具有任何分辨率和监视器的完美圆圈 所以,是否有可能以某种方式缩放应用程序并保持纵横比,以便在真实设备上以适当的比例显示它?获取窗口的高度,并将宽度缩放为高度的一部分,或者根据需要以其他方式缩放 void aspectRation(var w
所以,是否有可能以某种方式缩放应用程序并保持纵横比,以便在真实设备上以适当的比例显示它?获取窗口的高度,并将宽度缩放为高度的一部分,或者根据需要以其他方式缩放
void aspectRation(var width, var height){
//Divide by 100 to get 1% of height, then multiply by (a number) to maintain ratio
var newWidth = (height/100) * 80;
//set the window size here
}
设置窗口大小将取决于您的应用程序。您可以覆盖
窗体的OnResize
事件,以保留其纵横比:
private static readonly Size MaxResolution = GetMaxResolution();
private static double AspectRatio = (double)MaxResolution.Width / MaxResolution.Height;
private readonly PointF Dpi;
public YourForm() // constructor
{
Dpi = GetDpi();
AspectRatio *= Dpi.X / Dpi.Y;
}
private PointF GetDpi()
{
PointF dpi = PointF.Empty;
using (Graphics g = CreateGraphics())
{
dpi.X = g.DpiX;
dpi.Y = g.DpiY;
}
return dpi;
}
private static Size GetMaxResolution()
{
var scope = new ManagementScope();
var q = new ObjectQuery("SELECT * FROM CIM_VideoControllerResolution");
using (var searcher = new ManagementObjectSearcher(scope, q))
{
var results = searcher.Get();
int maxHResolution = 0;
int maxVResolution = 0;
foreach (var item in results)
{
if (item.GetPropertyValue("HorizontalResolution") == null)
continue;
int h = int.Parse(item["HorizontalResolution"].ToString());
int v = int.Parse(item["VerticalResolution"].ToString());
if (h > maxHResolution || v > maxVResolution)
{
maxHResolution = h;
maxVResolution = v;
}
}
return new Size(maxHResolution, maxVResolution);
}
}
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
int minWidth = Math.Min(Width, (int)(Height * AspectRatio));
if (WindowState == FormWindowState.Normal)
Size = new Size(minWidth, (int)(minWidth / AspectRatio));
}
编辑
假设最大屏幕分辨率反映了“正方形”要求,则可以获得所有屏幕分辨率,如所述和所示。你只需要找到它们的“最大值”
请注意,Windows通常没有实际的DPI值,我使用DPI只是比较水平DPI和垂直DPI。什么是应用程序?它是一个表单
?WinForms还是WPF?这是WinForms应用程序。但对于WPF,我也有同样的行为。windows不知道屏幕的物理尺寸,所以如果分辨率不匹配,你就无法检测到。@这听起来像是真的,但我希望有什么。我知道这个公式。我想确定如何缩放应用程序,以便在设置了“方形”分辨率的真实宽设备上正确显示它。显示器将自动以错误的比例显示“方形”分辨率。您肯定需要显示器和程序之间的交互才能实现这一点吗?是,听起来我必须知道真实的设备比例。使用屏幕密度(以每厘米/英寸像素为单位)和屏幕大小(以像素为单位)来计算屏幕大小(以米为单位),并相应地缩放应用程序这似乎解释了如何抓住两者,快速浏览:)您不想保留像素的纵横比,而是试图保留米的纵横比。我说的对吗?只要试着在宽屏显示器上设置分辨率1400x1050,并以表格的形式显示圆圈。它将显示为椭圆形,而设备将自动缩放比例。所以我们需要根据这个值来确定实际的设备大小和规模。Короче суть в том, что на широкоформатном мониторе квадратные разрешения экрана автоматически растягиваются. Заказчик хочет в противовес этому "стягивать" наше приложение, чтоб все смотрелось пропорционально в реальном физическом мире)