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

解決


ほんちゃん  2005-11-30 15:36:13  No: 59841  IP: 192.*.*.*

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

編集 削除
Blue  2005-11-30 15:42:35  No: 59842  IP: 192.*.*.*

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

編集 削除
Blue  2005-11-30 15:43:45  No: 59843  IP: 192.*.*.*

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

編集 削除
ヨロシコ  2005-11-30 18:47:29  No: 59844  IP: 192.*.*.*

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

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

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

編集 削除
Blue  2005-11-30 19:18:35  No: 59845  IP: 192.*.*.*

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

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

編集 削除
Blue  2005-11-30 19:26:34  No: 59846  IP: 192.*.*.*

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

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

編集 削除
Blue  2005-11-30 19:32:38  No: 59847  IP: 192.*.*.*

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-11-30 20:05:44  No: 59848  IP: 192.*.*.*

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

編集 削除
ほんちゃん  2005-11-30 21:18:36  No: 59849  IP: 192.*.*.*

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

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

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

編集 削除
Blue  2005-12-01 00:54:43  No: 59850  IP: 192.*.*.*

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 00:56:00  No: 59851  IP: 192.*.*.*

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

編集 削除
Blue  2005-12-01 01:25:21  No: 59852  IP: 192.*.*.*

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

編集 削除
ほんちゃん  2005-12-01 09:28:46  No: 59853  IP: 192.*.*.*

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

編集 削除