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

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

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

Re[2]: 用紙サイズの取得


(過去ログ 84 を表示中)

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

■49969 / inTopicNo.1)  用紙サイズの取得
  
□投稿者/ ゆび牛乳 (8回)-(2010/05/25(Tue) 19:29:54)

分類:[C/C++] 

「プリンタの設定」ダイアログの「サイズ」で選んだ用紙サイズを
OnPreparePrinting() 内で取得したいのですが
いい方法がありましたら教えてください。

構造体 DEVMODE の dmPaperSize から取得するプログラムを
書いてみたのですが、プリンタドライバにより取得される値が
違う場合があり、これは使えないようです。

例)
・Canon LBP-1610 では、A0用紙=4401、A1用紙=4403
・Adobe PDFでは、A0用紙=119、A1用紙=120
となります。

OnPreparePrinting() 内で取得したいので CDC にはアクセスできません。

よろしくお願いします。

引用返信 編集キー/
■49974 / inTopicNo.2)  Re[1]: 用紙サイズの取得
□投稿者/ とっちゃん (509回)-(2010/05/25(Tue) 21:06:25)
とっちゃん さんの Web サイト
No49969 (ゆび牛乳 さん) に返信
> 「プリンタの設定」ダイアログの「サイズ」で選んだ用紙サイズを
> OnPreparePrinting() 内で取得したいのですが
> いい方法がありましたら教えてください。
>
> 構造体 DEVMODE の dmPaperSize から取得するプログラムを
> 書いてみたのですが、プリンタドライバにより取得される値が
> 違う場合があり、これは使えないようです。
>
やり方としては2パターン。
一つは
その場だけの HDCを作り、GetDeviceCapsなどを利用してサイズを取得する。
もう一つは
DeviceCapabilites API を使ってDC_PAPERS と DC_PAPERSIZE を列挙して、dmPaperSize にマッチしたものを探し出す。

このどちらかとなります。
一応。。。MFCのソースレベルできちんと何をやってるかを追いかけていれば、HDCがどこで使えるかもわかりますよ。

非常に残念ですが一部の心無いドライバのずさんな作りのせいで DEVMODE の詳細チェックは非常に厳しいものとなっています。
ドキュメントに書かれてることを鵜呑みにするとほぼ確実にどこかで失敗するので注意してください。

引用返信 編集キー/
■50001 / inTopicNo.3)  Re[2]: 用紙サイズの取得
□投稿者/ ゆび牛乳 (9回)-(2010/05/26(Wed) 11:43:43)
No49974 (とっちゃん さん) に返信

> その場だけの HDCを作り、GetDeviceCapsなどを利用してサイズを取得する。

↑たぶんこの方法だと思いますが、下記のかたちでできました。

BOOL CYUBIView::OnPreparePrinting(CPrintInfo* pInfo)
{
  BOOL b = DoPreparePrinting(pInfo);

  HDC hdc = pInfo->m_pPD->m_pd.hDC;
  double h = (::GetDeviceCaps(hdc, HORZRES) + ::GetDeviceCaps(hdc, PHYSICALOFFSETX) * 2) * 25.4
        / ::GetDeviceCaps(hdc, LOGPIXELSX);  // 横 1mm
  double v = (::GetDeviceCaps(hdc, VERTRES) + ::GetDeviceCaps(hdc, PHYSICALOFFSETY) * 2) * 25.4
        / ::GetDeviceCaps(hdc, LOGPIXELSY);  // 縦 1mm

  return b;
}

得られるのが「用紙の種類」ではなく「用紙の寸法」になりましたが
今回はこちらのほうで好都合でした。

とっちゃんさん
ご指導ありがとうございました。

環境:VS2008 MFC

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -