両面印刷でうまく両面に印刷してくれない
- 題名: 両面印刷でうまく両面に印刷してくれない
- 著者: hiro
- 日時: 2013/11/20 11:30:08
- ID: 31925
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: 両面印刷でうまく両面に印刷してくれない
- 著者: shu
- 日時: 2013/11/20 15:13:41
- ID: 31927
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: 両面印刷でうまく両面に印刷してくれない
- 著者: hiro
- 日時: 2013/11/20 16:26:15
- ID: 31928
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: 両面印刷でうまく両面に印刷してくれない
- 著者: shu
- 日時: 2013/11/20 23:00:21
- ID: 31930
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: 両面印刷でうまく両面に印刷してくれない
- 著者: kiku
- 日時: 2013/11/21 9:56:51
- ID: 31931
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[5]: 両面印刷でうまく両面に印刷してくれない
- 著者: hiro
- 日時: 2013/11/21 11:15:39
- ID: 31932
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
お世話になります。
両面印刷使しようと思い下記のようにコードを書きましたが、「プレビューを生成しています」のダイアログが1ページ単位で出て裏表に印刷しません。
予定では、10枚印刷なら「プレビューを生成しています」で表示するページは、1でなく10になるはずですね。
結果でいうと印刷処理がまとめてでなく1ページ単位で呼ばれているのでしょうが、どこでそのようにコードを書けばいいでしょうか?
アドバイスください。よろしくお願いします。
コード
for (int i = 0; i < _prints.Count; ++i)
{
print = _prints[i];
printDoc.BeginPrint += new System.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
printDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
if (ppvw.ShowDialog() != DialogResult.OK)
{
printDoc.BeginPrint -= new System.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
printDoc.PrintPage -= new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
}
// Printing the Documnet
// printDoc.Print();
// printDoc.BeginPrint -= new System.Drawing.Printing.PrintEventHandler(PrintDoc_BeginPrint);
// printDoc.PrintPage -= new System.Drawing.Printing.PrintPageEventHandler(PrintDoc_PrintPage);
}
private static void PrintDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
:
: // 実際の印刷処理
:
// e.HasMorePages = true; 有効にすると無限ループになってしまう
}
上記のforループの_prints[i];は、1ページごとの印刷する文が入っています。
_prints.Countが実際印刷したいページ数、両面なのでこの半分の数ですが。
両面の設定は、
// DevMode にセットする
private static void PrinterSetDevmode(PrintDocument pd
{
IntPtr hMem = pd.PrinterSettings.GetHdevmode(pd.DefaultPageSettings); // ハンドル取得
IntPtr devmodePtr = GlobalLock(hMem); // ロック・ハンドルからポインタを取得
DEVMODE dm = (DEVMODE)Marshal.PtrToStructure(devmodePtr, typeof(DEVMODE)); // ポインタから構造体にコピー
//dm.dmCopies = 10; // 印刷部数を10部に設定
//dm.dmCollate = 1; // 部単位で印刷
dm.dmDuplex = 2; <- 多分これであっていると思います
Marshal.WriteByte(devmodePtr, dm.dmSize + 720, 0); // ドライバ固定の720Byte目を0
Marshal.StructureToPtr(dm, devmodePtr, true); // 構造体からポインタにコピー
GlobalUnlock(hMem); // ロックを解放
pd.PrinterSettings.SetHdevmode(hMem); // PriterSetteingsにコピー
GlobalFree(hMem); // ハンドルを解放
}