初めて質問をします。宜しくお願いします。
環境 XP
Visual C++ 6.0
SDI
内容は印刷のプログラムで、A4横を
アプリケーションクラスで記述し、
ビュークラスで印字したところ、
キャノン・リコー・NECのプリンタでは
同じ、サイズで出力されるが、ゼロックス
のDocuCentre-II C2200シリーズで印字すると
拡大されて印字されます。
プリンタにより、指定変更等が必要なのですか?
/* APPで記述 */
if(m_hDevMode == NULL) {
// m_hDevMode を設定
PRINTDLG printDlg;
GetPrinterDeviceDefaults(&printDlg);
m_hDevMode = printDlg.hDevMode;
}
if(m_hDevMode != NULL) {
LPDEVMODE lpDevMode = (LPDEVMODE)GlobalLock(m_hDevMode);
lpDevMode->dmOrientation = DMORIENT_LANDSCAPE;
lpDevMode->dmPaperSize = DMPAPER_A4;
GlobalUnlock(m_hDevMode);
GlobalFree(m_hDevMode);
}
たぶんプリンターの解像度[pixl/inch]が違うのではないでしょうか。
色々なやりかたがあると思いますが、自分の場合はプリンタHDCに対して
int Resolution_W = ::GetDeviceCaps( hdc, LOGPIXELSX);// 解像度 X [pix/inch]
int Resolution_H = ::GetDeviceCaps( hdc, LOGPIXELSY);// 解像度 Y [pix/inch]
double pix_p_mm_x = ( double)Resolution_W / ( double)25.4;
double pix_p_mm_y = ( double)Resolution_H / ( double)25.4;// 1inch = 25.4[mm]
のように[pixl/mm]を算定しておいて、描画時に換算しています。
んで、[mm]で描画するときはマップモードをMAP_MODE_ISOTROPICに
してます。
こうすることで、プリンタの解像度[pixl/inch]による差異を吸収しています。
レス ありがとうございますm(__)m
昨日から、マップモードをISOTROPICに変更して
実行しいるのですが、サイズの変更ができません。
根本的間違っているのかもしれません。
のように[pixl/mm]を算定しておいて、描画時に換算しています。
というのは、換算してDraw時に再計算しているという事ですか?
int Resolution_W = ::GetDeviceCaps( hdc, LOGPIXELSX);// 解像度 X [pix/inch]
int Resolution_H = ::GetDeviceCaps( hdc, LOGPIXELSY);// 解像度 Y [pix/inch]
の値はプリンタが違っても96と同じなのです。
void CCKohjiInView::OnBeginPrinting(CDC* pDC, CPrintInfo* /*pInfo*/)
{
int Resolution_W = ::GetDeviceCaps( *pDC, LOGPIXELSX);
int Resolution_H = ::GetDeviceCaps( *pDC, LOGPIXELSY);
if(
SetMapMode( *pDC,MM_ISOTROPIC );
のように記述しております。
>の値はプリンタが違っても96と同じなのです。
96ってのはモニターディスプレーの標準値なので、
そのHDCは画面用のHDCですね、先の発言の通り
「プリンターのHDC」に対してやってみてください。
早急なレス誠にありがとうございます。
一生懸命ディスプレイの値を取っていたのですね(>_<)
あとは、描画時にpix_p_mm_xとpix_p_mm_yの比率を計算して
出力するという事ですね
誠にありがとうございます。m(__)m