Discussion:
プリンタによっては位置づれを起こします。解決方法は
(too old to reply)
unknown
2009-01-11 10:10:00 UTC
Permalink
上田と言います。
VC6++で開発したプログラムについて質問です。
インクジェットプリンタをA4サイズで使用しています。
元はセントロニクス準拠のパラレル接続でしたが、プリンタの調子が悪くなり
USB接続のプリンタに交換しました。
すると、印刷位置が上に50%程度上がり、左に50%程度よって印刷される
ようになりました。プリンタの設定はどちらもA4サイズ選択で同じです。
文字サイズは同じ大きさのようです。
印刷サイズは
 xPage = GetDeviceCaps(hdcPrn,HORZRES);
 yPage = GetDeviceCaps(hdcPrn,VERTRES);
で確認したところ xPageは2878、yPageは4066となっています。
印刷データは最終的に下記の関数を使っています。
TextOut(hdcPrn,x,y,moji,len); len = mojiの長さ
xとyはそれぞれ左と上からの位置の大きさを表しています。
文字サイズは
 nHeight = -MulDiv(mojisize,GetDeviceCaps(hdcPrn,LOGPIXELSY),72);
 hFont =
CreateFont(nHeight,0,0,0,futosa,0,0,0,SHIFTJIS_CHARSET,OUT_TT_ONLY_PRECIS,
CLIP_TT_ALWAYS,PROOF_QUALITY,FIXED_PITCH | FF_DONTCARE,shotaimoji);
で計算したサイズとなります。shotaimojiは明朝体などの書体を表しています。
この内容で文字サイズだけが同じで、印刷位置がそれぞれ縮小するのはどうしてでしょうか。
防止する方法があれば知りたいのですが。
UETA, Shin-ichi
2009-01-11 14:59:35 UTC
Permalink
こんにちは、植田です。
Post by unknown
印刷データは最終的に下記の関数を使っています。
TextOut(hdcPrn,x,y,moji,len); len = mojiの長さ
xとyはそれぞれ左と上からの位置の大きさを表しています。
ひとつ確認です。

印刷データを書き出す座標(x, y)はプリンタの解像度を考慮して
求めていますか?

50%のずれが何を計算した結果なのかは分かりませんが、
仮にそれが余白の割合なのであれば、たとえば、プリンタの
解像度が2倍になったのに今までの座標で書き出すと余白が
半分になったように見えるかと思います。
たぶん、問題なのは x, y の初期値で、行送り自体は文字の
高さを加算しているので、一見するとずれたように見えている
のではないかと推測します。
--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:***@usdesign.jp
unknown
2009-01-12 02:53:01 UTC
Permalink
植田さん
ありがとうございます。
Post by UETA, Shin-ichi
印刷データを書き出す座標(x, y)はプリンタの解像度を考慮して
求めていますか?
行っていませんでした。多分ご指摘の通りではないかと思います。
Post by UETA, Shin-ichi
50%のずれが何を計算した結果なのかは分かりませんが、
おおよその見た目からの実測です。何せ手元に食い違ったプリンタは
ありませんでしたので、送られて来た印刷写真画像から判断しました。
Post by UETA, Shin-ichi
仮にそれが余白の割合なのであれば、たとえば、プリンタの
解像度が2倍になったのに今までの座標で書き出すと余白が
半分になったように見えるかと思います。
たぶん、問題なのは x, y の初期値で、行送り自体は文字の
高さを加算しているので、一見するとずれたように見えている
のではないかと推測します。
すみません。説明不足でした。上下の印刷は下の方が上の行に
重なるような印刷になっています。従って1行の上部分が下の印刷
に覆いかぶさった状態です。左右も大体本来の位置に近いです。

さてプリンタ解像度を自動的に読み取る部分を作りたいと思います。
解像度を読み取るAPIを探して見ます。

/***********************
堺市南区原山台
上田 恭平
E_Mail ***@sannet.ne.jp
************************/
unknown
2009-01-14 09:33:00 UTC
Permalink
植田さんありがとうございました。

ご示唆頂いたことで、印刷は
on_xPage = GetDeviceCaps(hdcPrn,HORZRES); // 現在設定されている印刷横サイズ 現在A4の設定の前提
on_yPage = GetDeviceCaps(hdcPrn,VERTRES); // 現在設定されている印刷縦サイズ
yDpi = GetDeviceCaps(hdcPrn,LOGPIXELSY); // 縦DPI 100倍比率 360 > 100
std_Dpi = (yDpi * 100) / 360; // 360DPIを標準にした%換算
から換算して対応しました。文字サイズは変更する必要はありませんでした。

ただ、印刷だけでなく、画面の解像度も同じ問題があり こちらは
on_xPage = GetDeviceCaps(hDC,HORZRES); // 現在設定されている表示横サイズ
on_yPage = GetDeviceCaps(hDC,VERTRES); // 現在設定されている縦サイズ
std_xPage = 1024; std_yPage = 763; // 私がプログラム開発に使っている画面サイズ
でのX位置、Y位置と文字サイズ(ポイント)は上の比率から換算しています。

これらを含めて、解像対応する別の方法があればお教え下されば助かります。
よろしくお願い致します。

/*************************
堺市南区原山台
上田 恭平
E_Mail ***@sannet.ne.jp
**************************/
UETA, Shin-ichi
2009-01-14 12:09:25 UTC
Permalink
どうも、植田です。
Post by unknown
これらを含めて、解像対応する別の方法があればお教え下されば助かります。
Win32 APIの範疇では、これらはすべてプログラマの責任の下で
管理すべき類のもので、自動的に解決されるようなものではない
と思います。

強いて挙げると、GDIの座標変換機能を利用してアプリケーション
で扱う座標系を抽象化しておく方法が考えられますが、それなりに
お膳立てが必要になると思いますし、かえってややこしくなるかも
しれません。

Windows GDI
Coordinate Spaces and Transformations
http://msdn.microsoft.com/en-us/library/ms533187(VS.85).aspx

画面の解像度に関していえば、たとえば、身近なところでは、
ダイアログボックステンプレートでシステムフォントを基準にした
相対的な座標系が使われています。

Dialog Box Measurements
http://msdn.microsoft.com/en-us/library/ms644994(VS.85).aspx#measurements

より高度な機能を求めるなら、.NET Framework など、それなりに
サポートしてくれるフレームワークか、あるいはGUIのツールキット
を導入するしかないでしょう。
--
植田システム設計事務所
Ueta System Design Studio
http://www.usdesign.jp/
植田真一
mailto:***@usdesign.jp
unknown
2009-01-15 06:07:01 UTC
Permalink
植田さん、ありがとうございました。
Post by UETA, Shin-ichi
強いて挙げると、GDIの座標変換機能を利用してアプリケーション
で扱う座標系を抽象化しておく方法が考えられますが、それなりに
お膳立てが必要になると思いますし、かえってややこしくなるかも
しれません。
示唆されたページを読ませて頂きました。
英文が難ですが、おおよその内容は判りました。
私が必要としている縮小拡大ではほぼ同じ処理を
行っているようですね。
Post by UETA, Shin-ichi
Win32 APIの範疇では、これらはすべてプログラマの責任の下で
管理すべき類のもので、自動的に解決されるようなものではない
と思います。
そこでWin32 APIを使う立場では
画面処理ではスピードの低下を最も恐れたので、位置換算の配列から
読み替える手法を取り、印刷処理では、どうせ印刷で待たされるのだから
それ程時間を問題にせずに関数化(換算処理)することにしました。

/***********************
堺市南区原山台
上田 恭平
E_Mail ***@sannet.ne.jp
************************/

Loading...