インストールまたは選択したプリンターの最大 Dpi を取得したい。私は試した
PrinterSettings ps = new PrinterSettings();
MessageBox.Show(ps.PrinterResolutions.ToString());
System.Drawing.Printing.PrinterSettings+PreinterResolutionCollection (目的の出力は 600x600) です。
LINQ の使用:
PrinterSettings ps = new PrinterSettings();
var maxResolution = ps.PrinterResolutions.OfType<PrinterResolution>()
.OrderByDescending(r => r.X)
.ThenByDescending(r => r.Y)
.First();
MessageBox.Show(String.Format("{0}x{1}", maxResolution.X, maxResolution.Y));
プリンタの解像度はコレクションです。使用可能なすべての解像度を読み取るには、次のように繰り返し処理する必要があります。
foreach (string installedPrinter in PrinterSettings.InstalledPrinters)
{
var ps = new PrinterSettings { PrinterName = installedPrinter };
var maxResolution = ps.PrinterResolutions.Cast<PrinterResolution>().OrderByDescending(pr => pr.X).First();
Console.WriteLine("{0}: {1}x{2}", installedPrinter, maxResolution.X, maxResolution.Y);
}
または、すべてのプリンターとそのすべてのPrinterResolutionsを表示します
foreach (string installedPrinter in PrinterSettings.InstalledPrinters)
{
var ps = new PrinterSettings { PrinterName = installedPrinter };
foreach (PrinterResolution printerResolution in ps.PrinterResolutions)
{
var tpl = printerResolution.Kind == PrinterResolutionKind.Custom ? "{0}: {1} ({2}x{3})" : "{0}: {1}";
Console.WriteLine(tpl, installedPrinter, printerResolution.Kind, printerResolution.X, printerResolution.Y);
}
}
PrinterResolutions はコレクションであり、文字列値に変換しようとしているようです。
これは私が使用するものです(.NET 2.0、Linqなし)
public static int CompareResolutions(System.Drawing.Printing.PrinterResolution y, System.Drawing.Printing.PrinterResolution x)
{
if (x.X*x.Y > y.X*y.Y)
return 1;
else if (x.X * x.Y < y.X * y.Y)
return -1;
return 0;
}
public static System.Drawing.Printing.PrinterResolution GetMaxResolution(System.Drawing.Printing.PrintDocument pd)
{
return GetMaxResolution(pd.PrinterSettings);
}
public static System.Drawing.Printing.PrinterResolution GetMaxResolution(System.Drawing.Printing.PrinterSettings ps)
{
System.Drawing.Printing.PrinterResolution prMax = null;
System.Collections.Generic.List<System.Drawing.Printing.PrinterResolution> ls = new System.Collections.Generic.List<System.Drawing.Printing.PrinterResolution>();
for (int i = 0; i < ps.PrinterResolutions.Count; ++i)
{
System.Drawing.Printing.PrinterResolution pres = ps.PrinterResolutions[i];
ls.Add(pres);
} // Next i
ls.Sort(CompareResolutions);
if (ls.Count > 0)
prMax = ls[0];
ls.Clear();
ls = null;
return prMax;
}