はじめまして。VC初心者の猫と申します。
Cviewクラスを使ってビューに描画し、それをA4用紙に印刷したいのですが、用紙の下1
4mmがどうしても印刷されません。
ビューポートの原点を変更したり、下記のように用紙サイズを変更してもダメした。
LPDEVMODE m_pDevMode=printDlg.GetDevMode();
m_pDevMode->dmPaperSize = DMPAPER_USER;
m_pDevMode->dmPaperLength = 3000;
m_pDevMode->dmPaperWidth = 2100;
用紙の下の余白を11mmに設定するにはどうすればよいのでしょうか?
こういう場合、プリンターの能力が判らない以上なんともいえません
そういうことの起こるプリンター名、デバイスドライバーのバージョン等も明記して下さい
MFC をお使いのようですので、CDC::GetDeviceCaps() についてお調べ下さい
HORIZSIZE, VERTSIZE, PHYSICALOFFSETX, PHYSICALOFFSETY, 等についても調べましょう
OSやコンパイラーなどのバージョン、アプリケーションの種類なども明記してください
過去ログも調べてみてください
早速のレス有難うございました。
プリンタ自体はLAN経由で使用してますので、プリンタドライバは、VCがインストールされ
ているPCと、プリンタが接続されているPCとで異るのですが、
VCがインストールされているPCでは、プリンタ名がFUJITSUのXJS-400、
以下、CDC::GetDeviceCaps()で調べたところ、
DRIVERVERSION → 1024
TECHNOLOGY →2(ラスタプリンタ)
HORIZSIZE → 197
VERTSIZE → 279
PHYSICALOFFSETX → 40
PHYSICALOFFSETY → 75
LAN経由で実際に使用しているプリンタは、EPSON PM-890Cです。
ご指摘のとおりプリンタ設定情報を色々と調べてみたところ、用紙設定で「ユーザー定義サイ
ズ」を選択し、任意の長さを指定するか、あるいはA4サイズのままで「印刷可能領域」という
項目の「最大」という項目(デフォルトでは「標準」になってます。)を選択したらうまくいき
ました。
ただし、「印刷可能領域」という項目は、EPSONのプリンタにはありますが、FUJITU
のプリンタにはありませんでした。
いずれのプリンタにしても、デフォルト設定では、下14mmが切れてしまうようです。
この設定をプログラム上から変更することはできないのでしょうか?
補足
OSはWIN98、VC++6.0を使用しています。
作成しようとしているアプリケーションは、CADです。
単位をミリにするかインチにするかで少し違いますが、ミリで扱うことにして話します
A4 の場合養子の大きさは 210mm, 297mm 程度になると思います
ドット数で表すものの場合は DPI とミリとインチとの関係(2.54mm が 1 インチ)とから
ミリに直せます(PHYSICALOFFSETX/Y 等)
するとオフセットと用紙幅高さと印字領域とから上下左右の最小の余白が求まります
(この辺りは小学生の算数の範囲で十分判ることだと思います)
これで求めた下端の余白が 14mm ならそれがプリンターの限界だと判ります
レス有難うございました。
最初に書き忘れていたことがありましたので付け加えます。
ビューポートの原点を(0,0)に設定し、A4用紙に目いっぱい描画させると、
上及び左右の余白が3m、下の余白が14mmになってしまいます。
またビューポートの原点を3mm下にずらしてやったとしても、上の余白は3mm分下がります
が、下の余白は14mmから変わりません。
これに対してマイクロソフトのWORDでは、上下左右の余白を11mmに設定するとこの通り
に印刷されてきます。
プリンタの限界というより、プログラム内部の問題のような気がしてならないのですが、いかが
なものでしょうか?
度々で恐縮ですが、よろしくお願いします。
>プリンタの限界というより、プログラム内部の問題のような気がしてならないのですが、
>いかがなものでしょうか?
>これで求めた下端の余白が 14mm ならそれがプリンターの限界だと判ります
はお読みになった上での(計算なさいましたか?)お返事ですか?
それに、そうお思いなら何故初めからそう書かないのでしょうか?
あなたの書いたこと以上のことは他人には判らないということがお分かりでないようですね
> LPDEVMODE m_pDevMode=printDlg.GetDevMode();
> m_pDevMode->dmPaperSize = DMPAPER_USER;
> m_pDevMode->dmPaperLength = 3000;
> m_pDevMode->dmPaperWidth = 2100;
この後に何かしてます?
DEVMODE構造体に値を設定してるだけです
で、サイズ変更できないのでは?
レス有難うございます。
>あなたの書いたこと以上のことは他人には判らないということがお分かりでないようですね
私の発言で不快にさせてしまったのであれば、お詫びします。申し訳ありませんでした。
> LPDEVMODE m_pDevMode=printDlg.GetDevMode();
> m_pDevMode->dmPaperSize = DMPAPER_USER;
> m_pDevMode->dmPaperLength = 3000;
> m_pDevMode->dmPaperWidth = 2100;
>この後に何かしてます?
>DEVMODE構造体に値を設定してるだけです
>で、サイズ変更できないのでは?
申し訳ありません、こちらも書き忘れていました。この後に、
pDC->ResetDC(m_pDevMode);
を使ってリセットさせてます。この下には何も記述していません。
他に何か設定が必要なのでしょうか?
>私の発言で不快にさせてしまったのであれば、お詫びします。申し訳ありませんでした。
不愉快ではなくて、がっかりしたのです。きちんと読めば、計算して下端の値を求めてみて
現実の結果と比べてみましょうと書いていることが判ると思っていたからです