いつもお世話になります。
またまた質問させてください。
印刷時にpDC->GetOutputTextExtent()で文字の大きさを取得しています。
その文字が指定された用紙にどれだけ入るかを知りたいのですが
どうしたらよいでしょうか?
改ページをどこでしたらいいのか分からなくて困っています。
よろしくお願いします。
Windows2000
VC++ 6.0
MFC
>その文字が指定された用紙にどれだけ入るかを知りたいのですが
>どうしたらよいでしょうか?
何が分からないのかよく分からないですが…
印刷可能な範囲が分からないということならば、
GetDeviceCaps(HORZSIZE)とGetDeviceCaps(VERTSIZE)です。
質問がわかりにくくてすいません。
1ページ中に何行のデータが印刷できるかを知りたいため、
印刷可能な範囲と印刷する文字の大きさを同じ単位で取得したいのです。
CDC::GetOutputTextExtent()で取得できる文字列の寸法というのが
論理単位で取得できます。
ところがGetDeviceCaps()とうのはmm単位で取得するようです。
この二つの単位をどう使っていいかが分かりません。。。
CDC::DPtoHimetirc() を用いるか、CDC::GetDeviceCaps() を使って印刷機の DPI 値を
縦、横それぞれ取得して ::MulDiv() 等を用いて単位変換をしてください
ところで、論理単位についてはご理解なさっていますか?
マッピングモードの規定値は MM_TEXT なのでピクセル(ドット)単位です
CDC::SetMapMode() で変えられるという事もお分かりですか?
現在のマッピングモードが何か判っていないとせっかく CDC::GetOutputTextExtent() で
取得した値に適切な変換が出来ません
論理単位については、CDC::SetMapMode()を調べてください。
MM_TEXTを使う場合は、論理単位=デバイス単位になりますので、
LPtoDP,DPtoLPを使って変換します。
MM_TEXT以外を使う場合は、算数の問題です。
すいません。さっぱり分からなくなってきました。
> MM_TEXTを使う場合は、論理単位=デバイス単位になりますので、
> LPtoDP,DPtoLPを使って変換します。
論理単位 = デバイス単位ということはLPtoDPで変換しても
値は変化しないですよね?
何に対してこれを使えばいいのでしょうか。
GetDeviceCaps(HORZRES) と GetDeviceCaps(VERTRES)
の戻り値を DPtoLP で論理単位に変換すればよいのでは?
(マッピングモードが MM_TEXT なら変換は不要)
あなたはドット単位ミリ単位インチ単位のどの単位系で取り扱いたいのでしょうか
正確には MM_TEXT, MM_LOMETRIC, MM_HIMETRIC, MM_LOENGLISH, MM_HIENGLISH
若しドット単位で扱うのでしたらミリ単位で返ってくる値はドット単位に直さなければ
ならない事まではお分かりですね
ですから CDC::GetDeviceCaps() で得たミリ単位での値をドット単位に変換してください
その為には CDC::GetDeviceCaps() で DPI 値を得るのが判り易いと思います
> GetDeviceCaps(HORZRES) と GetDeviceCaps(VERTRES)
> の戻り値を DPtoLP で論理単位に変換すればよいのでは?
> (マッピングモードが MM_TEXT なら変換は不要)
というか、MM_TEXT でないと使えないのか。この方法。
>> MM_TEXTを使う場合は、論理単位=デバイス単位になりますので、
>> LPtoDP,DPtoLPを使って変換します。
>論理単位 = デバイス単位ということはLPtoDPで変換しても
>値は変化しないですよね?
>何に対してこれを使えばいいのでしょうか。
すみません、上記の私の発言は間違いでした。
HIMETRICtoLP()を使えば、
現在のマッピングモードを気にしないで変換できます。
(HIMETRICは0.01mm単位)
みなさん、ありがとうございます。
ミリ単位をドット単位に変換したかったのですが
単位に関する知識がなさすぎました。
すいません…。
pDC->SetMapMode( MM_TEXT ) ;
CSize sz ;
sz.cx = pDC->GetDeviceCaps( HORZSIZE ) * 100 ;
sz.cy = pDC->GetDeviceCaps( VERTSIZE ) * 100 ;
pDC->HIMETRICtoLP( &sz ) ;
int char_h = pDC->GetOutputTextExtent( A ).cy ;
int = sz.cy / m_PrintCharH ;
すいません、途中で送信してしまいました。。。
pDC->SetMapMode( MM_TEXT ) ;
CSize sz ;
sz.cx = pDC->GetDeviceCaps( HORZSIZE ) * 100 ;
sz.cy = pDC->GetDeviceCaps( VERTSIZE ) * 100 ;
pDC->HIMETRICtoLP( &sz ) ;
int char_h = pDC->GetOutputTextExtent( A ).cy ;
int line = sz.cy / char_h ;
これで1ページの行数が取得できました。
この辺、もう少し調べて勉強してみます。
みなさん、どうもありがとうございました。
たびたびすいません。
解決済です。
kazuma 2003/03/10(月) 12:36:29
についてです。
> というか、MM_TEXT でないと使えないのか。この方法。
そうでもないですね。MM_TEXT 以外でも使えます。