フォームアプリで印刷用紙の向きをコードで指定するには?

解決


ほんちゃん  2005-12-01 00:36:13  No: 59841

Visual Studio C++ .NET 2003 でマネージアプリ(Windowsフォームアプリ)を作っています。
印刷をしますが、用紙をA4横向きに指定したいのです。
ページ設定ダイアログでユーザーが指定するのではなく、初めからコードで組み込んでおきたいのですが、コードの書き方が解りません。
System::Void printDocument1_PrintPage(・・・・・)
{
    System::Drawing::Printing::PaperKind ?????
}
????? のところに「何とかかんとか A4Transverse」と書けばいいように思いますが、解りません。
よろしくお願いいたします。


Blue  2005-12-01 00:42:35  No: 59842

VB.NETですが、ここが参考になるかも。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=18729&forum=7&3


Blue  2005-12-01 00:43:45  No: 59843

> ページ設定ダイアログでユーザーが指定するのではなく、初めからコードで組み込んでおきたいのですが
じゃ、違うかも。スマソ。


ヨロシコ  2005-12-01 03:47:29  No: 59844

プリンタの DEVMODE へのハンドルを取得して

/*例)pDlg:CPrintDialogのポインタ*/
LPDEVMODE lpdevmode = pDlg->GetDevMode();
lpdevmode->dmOrientation = DMORIENT_LANDSCAPE;  /*横*/
lpdevmode->dmPaperSize   = DMPAPER_A4;          /*A4*/

この DEVMODE を使用してプリンタ DC を作成すればできます。


Blue  2005-12-01 04:18:35  No: 59845

> ヨロシコさん
MFCではないです。

> マネージアプリ(Windowsフォームアプリ)
てことですから。


Blue  2005-12-01 04:26:34  No: 59846

あれ?よく見たら、
> ????? のところに「何とかかんとか A4Transverse」と書けばいいように思いますが、解りません
ということは、指定の仕方が分からないということでしょうか?

PaperKindは列挙型なので
?????は
System::Drawing::Printing::PaperKind::A4Transverse
でよいのでは。


Blue  2005-12-01 04:32:38  No: 59847

VB.NETですが同じような質問がありました。
http://dobon.net/vb/bbs/log3-4/1971.html

<引用>
Dim strPapaerSZ As String
Dim pPaperSz As System.Drawing.Printing.PaperKind

'用紙サイズ-'A3にする
pPaperSz = Printing.PaperKind.A3
Dim pkSize As System.Drawing.Printing.PaperSize

For Each pkSize In PrintDocument1.PrinterSettings.PaperSizes
If pkSize.Kind = pPaperSz Then
PrintDocument1.DefaultPageSettings.PaperSize = pkSize
End If
Next
</引用>
までをMC++に書き換えればいいでしょう。


ヨロシコ  2005-12-01 05:05:44  No: 59848

早とちりしました(^ ^;)


ほんちゃん  2005-12-01 06:18:36  No: 59849

Blueさん、ヨロシコさん、ありがとうございます。

System::Drawing::Printing::PaperKind::A4Transverse;
と書いただけでは、何事も起こりませんでした。

VB.NET の質問は、まさに同じですね。
しかし、不勉強で、VBはやったことがないので、これをVC++に置き換えるというのが直ぐにはできません。
フォームアプリ自体、まだ始めたばかりなのです。
参考書やWEB上の情報も少なく苦戦しています。
よろしくお願いいたします。


Blue  2005-12-01 09:54:43  No: 59850

http://www.bcap.co.jp/hanafusa/dotnet/Prt08.htm
を参考に勉強がてらやってみました。
Form上に、ツールボックスから、PrintDialogとPrintDocumentを追加してください。

    // 用紙サイズ A4
    System::Drawing::Printing::PaperKind pk = System::Drawing::Printing::PaperKind::A4;
    // 設定できたかのフラグ
    bool setps = false;

    // サポートされている用紙サイズの一覧を確認
    System::Drawing::Printing::PaperSize* ps;
    for ( int i = 0; i < printDocument1->PrinterSettings->PaperSizes->Count; i++ )
    {
        ps = printDocument1->PrinterSettings->PaperSizes[ i ];
        // 指定の用紙サイズがサポートされている場合
        if ( ps->Kind == pk )
        {
            // 用紙サイズと用紙方向を設定
            printDocument1->DefaultPageSettings->PaperSize = ps;
            printDocument1->DefaultPageSettings->Landscape = true;  // trueで縦
            // 設定した
            setps = true;
            break;
        }
    }

    // 正常に設定できた場合は、PrintDialogで確認
    if ( setps )
    {
        printDialog1->Document = printDocument1;
        printDialog1->ShowDialog();
    }
    else
    {
        System::Windows::Forms::MessageBox::Show( "指定の用紙サイズが設定できませんでした。" );
    }

> 参考書やWEB上の情報も少なく苦戦しています。
これは本当にそうですね。VB.NETやC#のサンプルはゴロゴロしているのにMC++はないですね。
(というかMC++のメリットがC#等に比べてないからかなぁ、、C++/CLIからはちがうと思うが)
日本語のサイトに縛られずに、海外のサイトも探してみると良いでしょう。


Blue  2005-12-01 09:56:00  No: 59851

> printDocument1->DefaultPageSettings->Landscape = true;  // trueで縦
コメントちがっていました。
trueは横です。


Blue  2005-12-01 10:25:21  No: 59852

>     ps = printDocument1->PrinterSettings->PaperSizes[ i ];
これだとエラーですね。
ps = printDocument1->PrinterSettings->PaperSizes->Item[ i ];
に直しておいてください。
# VC2005ベースにやっているのでちゃんと確認できていませんでした。


ほんちゃん  2005-12-01 18:28:46  No: 59853

Blueさん、有り難うございました。
バッチリ出来ました!
サポートされている用紙サイズ一覧の確認まで組み込まれていて、完璧です。
助かりました。礼


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加