C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: プリンタ解像度の取得方法


(過去ログ 93 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■55332 / inTopicNo.1)  プリンタ解像度の取得方法
  
□投稿者/ 焦げ太 (1回)-(2010/11/26(Fri) 20:30:52)

分類:[C#] 

こんにちは。

PrintDialogでプリンタの解像度を変更した後、その解像度を
取得したいのですがうまくできません。

PrintDocument.Print()するとPrintPageEventArgsから
取れますが、PrintDialogでプリンタ選択した後に印刷処理
は行わず、解像度だけ画面に表示したいのです。

PrintDocument.Print()して解像度取得後にキャンセルする
方法もあるのですが、コンパネのプリンタにキューが表示
されてしまうので、できれば別の方法をと考えています。

GetDeviceCapsで取ろうとも思ったのですが、hDCで渡す
値をどう取得したらよいか わかりませんでした。

PrintDocument.Print()を行わずにプリンタ解像度を取得
する方法を教えてください。
よろしくお願いします。
引用返信 編集キー/
■55333 / inTopicNo.2)  Re[1]: プリンタ解像度の取得方法
□投稿者/ オショウ (563回)-(2010/11/26(Fri) 20:58:06)
> PrintDialogでプリンタの解像度を変更した後、その解像度を
> 取得したいのですがうまくできません。

  一度、以下の情報で試してみて下さい。
  http://hp.vector.co.jp/authors/VA016117/prnreso.html

以上。参考まで
引用返信 編集キー/
■55334 / inTopicNo.3)  Re[1]: プリンタ解像度の取得方法
□投稿者/ Hongliang (741回)-(2010/11/26(Fri) 20:58:31)
PrintDocument.DefaultPageSettings から取れませんか?
引用返信 編集キー/
■55336 / inTopicNo.4)  Re[2]: プリンタ解像度の取得方法
□投稿者/ 焦げ太 (1回)-(2010/11/27(Sat) 12:44:21)
オショウ さん、Hongliang さん ご回答ありがとうございます。

■オショウさん
土日は会社が休みのため月曜日に試してみます。

■Hongliangさん
PrintDocument.DefaultPageSettingsから取るPrinterResolution
の値はPrintDialogで変更した値が反映されておりませんでした。


引用返信 編集キー/
■55338 / inTopicNo.5)  Re[3]: プリンタ解像度の取得方法
□投稿者/ 魔界の仮面弁士 (1960回)-(2010/11/27(Sat) 14:33:24)
No55336 (焦げ太  さん) に返信
> PrintDocument.DefaultPageSettingsから取るPrinterResolution
> の値はPrintDialogで変更した値が反映されておりませんでした。

ドライバ側の問題とか…? 当方環境では、
  private void button3_Click(object sender, EventArgs e)
  {
    printDialog1.ShowDialog();
    MessageBox.Show(printDocument1.DefaultPageSettings.PrinterResolution.ToString());
  }
で、dpi 値の設定変更が反映されていました。

# printDialog1 / printDocument1 は、デザイナ上でフォームに貼っておいたものです。
# printDialog1.Document も、デザイン時に printDocument1 にしてあります。

引用返信 編集キー/
■55384 / inTopicNo.6)  Re[2]: プリンタ解像度の取得方法
□投稿者/ 焦げ太 (2回)-(2010/11/29(Mon) 10:47:01)
No55333 (オショウ さん) に返信
>   一度、以下の情報で試してみて下さい。
>   http://hp.vector.co.jp/authors/VA016117/prnreso.html
お教えいただいたサイトを参考にして取得することができました。
ありがとうございます。
コードを以下に掲載します。

        const Int32 PD_RETURNDC = 0x100;

        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 1)]
        [System.Runtime.InteropServices.ComVisible(false)]
        internal class PRINTDLG
        {
            public Int32 lStructSize;
            public IntPtr hwndOwner;
            public IntPtr hDevMode;
            public IntPtr hDevNames;
            public IntPtr hDC = IntPtr.Zero;
            public Int32 Flags = PD_RETURNDC;
            public Int16 FromPage = 0;
            public Int16 ToPage = 0;
            public Int16 MinPage = 0;
            public Int16 MaxPage = 0;
            public Int16 Copies = 0;
            public IntPtr hInstance = IntPtr.Zero;
            public IntPtr lCustData = IntPtr.Zero;
            public IntPtr lpfnPrintHook;
            public IntPtr lpfnSetupHook = IntPtr.Zero;
            public IntPtr lpPrintTemplateName = IntPtr.Zero;
            public IntPtr lpSetupTemplateName = IntPtr.Zero;
            public IntPtr hPrintTemplate = IntPtr.Zero;
            public IntPtr hSetupTemplate = IntPtr.Zero;
        }
    
        [DllImport("comdlg32.dll", CharSet = CharSet.Auto)]
        private static extern bool PrintDlg([In, Out] PRINTDLG lppd);
        [DllImport("gdi32.dll", CharSet = CharSet.Auto)]
        private static extern int GetDeviceCaps(IntPtr hDC, int nIndex);

        public static void test()
        {
            PRINTDLG pd = new PRINTDLG();
            pd.lStructSize = Marshal.SizeOf(pd);
            if (PrintDlg(pd) == false) return;

            int mm_h = GetDeviceCaps(pd.hDC, HORZRES);
            int dot_h = GetDeviceCaps(pd.hDC, HORZSIZE);
            int mm_v = GetDeviceCaps(pd.hDC, VERTRES);
            int dot_v = GetDeviceCaps(pd.hDC, VERTSIZE);
        }

■No55338 (魔界の仮面弁士 さん) に返信
>>PrintDocument.DefaultPageSettingsから取るPrinterResolution
>>の値はPrintDialogで変更した値が反映されておりませんでした。
> 
> ドライバ側の問題とか…? 当方環境では、
>   private void button3_Click(object sender, EventArgs e)
>   {
>     printDialog1.ShowDialog();
>     MessageBox.Show(printDocument1.DefaultPageSettings.PrinterResolution.ToString());
>   }
> で、dpi 値の設定変更が反映されていました。
> 
> # printDialog1 / printDocument1 は、デザイナ上でフォームに貼っておいたものです。
> # printDialog1.Document も、デザイン時に printDocument1 にしてあります。

ご回答いただきありがとうございます。
PrintDialog も PrintDocument も実行時でNewしたものでしたので
デザインに貼って確認したのですが解像度は変わりませんでした。

また、確認したところ以下のような動作になりました。

◆プリンタ自体の選択を変更した場合
例えば、300dpiプリンタ「A」と600dpiプリンタ「B」を切り替えると正しく
解像度は取得されます。

◆プリンタは同じでドライバオプション(?)から解像度を変更した場合
例えば、プリンタ「A」を設定で300dpi→600dpiに切り替えると300dpiのまま
返ってきます。

ですが、、、
解像度変更後のPrintDocument を PrintDialog.Documentに設定して表示させると
解像度は変更されているのでどこかに情報は保持されているとは思うのですが。。。
どうしたら取得できるのかわからない状態です(?_?)

引用返信 編集キー/
■55391 / inTopicNo.7)  Re[3]: プリンタ解像度の取得方法
□投稿者/ 焦げ太 (3回)-(2010/11/29(Mon) 12:09:19)
その後、ググっていたらDEVMODEなるものを見つけました。
PrintDocumentからDEVMODE構造体を取得してdmPrintQualityとdmYResolutionの
値を確認したのですが、変わらずでした。
(300dpi→600dpiとしたが300dpiでした)

DEVMODE構造体の部数、用紙などの値をみると、ちゃんと変更後になっているのですが
解像度は変わっていません。。。

オショウさんの教えてくださいました情報で一応解決はしているのですが、、、
PrintDocumentのどこかに値が保存されているはずなのに取れないのはしっくりきません。
情報お持ちの方、わかりましたら教えてください。
引用返信 編集キー/
■55416 / inTopicNo.8)  Re[4]: プリンタ解像度の取得方法
□投稿者/ 焦げ太 (4回)-(2010/11/30(Tue) 09:05:06)
とりあえず解決しまいたので
閉じることにします。

ご回答くださいました皆様ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -