文字サイズと用紙サイズ – プログラミング – Home

文字サイズと用紙サイズ
 
通知
すべてクリア

[解決済] 文字サイズと用紙サイズ


はな
 はな
(@はな)
ゲスト
結合: 23年前
投稿: 123
Topic starter  

いつもお世話になります。
またまた質問させてください。

印刷時にpDC->GetOutputTextExtent()で文字の大きさを取得しています。
その文字が指定された用紙にどれだけ入るかを知りたいのですが
どうしたらよいでしょうか?
改ページをどこでしたらいいのか分からなくて困っています。
よろしくお願いします。

Windows2000
VC++ 6.0
MFC


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

>その文字が指定された用紙にどれだけ入るかを知りたいのですが
>どうしたらよいでしょうか?

何が分からないのかよく分からないですが…

印刷可能な範囲が分からないということならば、
GetDeviceCaps(HORZSIZE)とGetDeviceCaps(VERTSIZE)です。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 23年前
投稿: 123
Topic starter  

質問がわかりにくくてすいません。
1ページ中に何行のデータが印刷できるかを知りたいため、
印刷可能な範囲と印刷する文字の大きさを同じ単位で取得したいのです。

CDC::GetOutputTextExtent()で取得できる文字列の寸法というのが
論理単位で取得できます。
ところがGetDeviceCaps()とうのはmm単位で取得するようです。
この二つの単位をどう使っていいかが分かりません。。。


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

CDC::DPtoHimetirc() を用いるか、CDC::GetDeviceCaps() を使って印刷機の DPI 値を
縦、横それぞれ取得して ::MulDiv() 等を用いて単位変換をしてください

ところで、論理単位についてはご理解なさっていますか?
マッピングモードの規定値は MM_TEXT なのでピクセル(ドット)単位です
CDC::SetMapMode() で変えられるという事もお分かりですか?
現在のマッピングモードが何か判っていないとせっかく CDC::GetOutputTextExtent() で
取得した値に適切な変換が出来ません


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

論理単位については、CDC::SetMapMode()を調べてください。

MM_TEXTを使う場合は、論理単位=デバイス単位になりますので、
LPtoDP,DPtoLPを使って変換します。

MM_TEXT以外を使う場合は、算数の問題です。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 23年前
投稿: 123
Topic starter  

すいません。さっぱり分からなくなってきました。

> MM_TEXTを使う場合は、論理単位=デバイス単位になりますので、
> LPtoDP,DPtoLPを使って変換します。

論理単位 = デバイス単位ということはLPtoDPで変換しても
値は変化しないですよね?
何に対してこれを使えばいいのでしょうか。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

GetDeviceCaps(HORZRES) と GetDeviceCaps(VERTRES)
の戻り値を DPtoLP で論理単位に変換すればよいのでは?
(マッピングモードが MM_TEXT なら変換は不要)


返信引用
島
 島
(@島)
ゲスト
結合: 23年前
投稿: 238
 

あなたはドット単位ミリ単位インチ単位のどの単位系で取り扱いたいのでしょうか
正確には MM_TEXT, MM_LOMETRIC, MM_HIMETRIC, MM_LOENGLISH, MM_HIENGLISH

若しドット単位で扱うのでしたらミリ単位で返ってくる値はドット単位に直さなければ
ならない事まではお分かりですね
ですから CDC::GetDeviceCaps() で得たミリ単位での値をドット単位に変換してください
その為には CDC::GetDeviceCaps() で DPI 値を得るのが判り易いと思います


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

> GetDeviceCaps(HORZRES) と GetDeviceCaps(VERTRES)
> の戻り値を DPtoLP で論理単位に変換すればよいのでは?

> (マッピングモードが MM_TEXT なら変換は不要)

というか、MM_TEXT でないと使えないのか。この方法。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

>> MM_TEXTを使う場合は、論理単位=デバイス単位になりますので、
>> LPtoDP,DPtoLPを使って変換します。

>論理単位 = デバイス単位ということはLPtoDPで変換しても
>値は変化しないですよね?
>何に対してこれを使えばいいのでしょうか。

すみません、上記の私の発言は間違いでした。

HIMETRICtoLP()を使えば、
現在のマッピングモードを気にしないで変換できます。
(HIMETRICは0.01mm単位)


返信引用
はな
 はな
(@はな)
ゲスト
結合: 23年前
投稿: 123
Topic starter  

みなさん、ありがとうございます。
ミリ単位をドット単位に変換したかったのですが
単位に関する知識がなさすぎました。
すいません…。

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 ;


返信引用
はな
 はな
(@はな)
ゲスト
結合: 23年前
投稿: 123
Topic starter  

すいません、途中で送信してしまいました。。。

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ページの行数が取得できました。
この辺、もう少し調べて勉強してみます。
みなさん、どうもありがとうございました。


返信引用
はな
 はな
(@はな)
ゲスト
結合: 23年前
投稿: 123
Topic starter  

たびたびすいません。
解決済です。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

kazuma 2003/03/10(月) 12:36:29
についてです。

> というか、MM_TEXT でないと使えないのか。この方法。

そうでもないですね。MM_TEXT 以外でも使えます。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました