正確な印字サイズを得るには?


宜しくお願いします。  2003-08-05 11:30:03  No: 4304

現在プロポーショナルフォントを使用し、「何ポイントの
大きさならば、指定された幅に印字出来るのか?」を求める
処理を考えています。
  しかし、TextWidthやTextHeightでは、太字や斜体の
フォントスタイルが設定されていると、正確なサイズを
求められません。
  どなたか正確なサイズを求める方法や情報を、ご存じ
ありませんでしょうか?
  開発環境は、Delphi5Leamingです。
どうか宜しくお願いいたします。


にしの  2003-08-05 17:29:18  No: 4305

印字で使えるかわかりませんが、
http://www.asahi-net.or.jp/~HA3T-NKMR/DGS/index.htm
ここのDHGLが使えるかと思います。


宜しくお願いします。  2003-08-05 21:51:35  No: 4306

情報をありがとうございます。
  にしの様の情報をもとに、問題を解決するための
  試行錯誤をしてみたいと思います。


XOOX  2003-08-09 21:52:22  No: 4307

印刷サイズを求めるので
中村さんのコンポーネントならばDHGLではなくてNkprinterです。
但しこれはPrinter.pasをオーバーラップしているだけで
複数のコンポーネント依存度が高いので私は好きではありません。
しかしながらこのコンポーネントを使うことで実寸を求めるのに必要な値は全て得られるので
このコンポーネントとReadMeを読めばとりあえず実装は可能だと思います。

文字のサイズ計算関数ははWinAPIレベルでもかなりいいかげんのようです。

描画後のペン位置とかが一番正確かも


にしの  2003-08-09 22:37:29  No: 4308

> 何ポイントの大きさならば、指定された幅に印字出来るのか?
これを取得するメソッドなどは、NkPrinterになさそうなのですが、本当にできますか?
紙のサイズなどは取得できますが・・・。

NkPrinterのGetCanvasでは、Printer.Canvasを返しているので、やはりイタリック体などで文字がとぎれてしまうと思います。
サイトで、バージョンアップ情報などなかったのですが、どこかでバージョンアップされたのでしょうか。


OXXO  2003-08-10 02:05:23  No: 4309

こんにちは。

これまでXOOXさんの回答をいくつか読んだけど一般論ばかりで、解決にいたった
ことはないようです。
> Printer.pasをオーバーラップしているだけで
意味不明です。オーバーラップってなんですか。
> 私は好きではありません。
あなたの好みはこの際、関係ありません。
>文字のサイズ計算関数ははWinAPIレベルでもかなりいいかげんのようです。
そこを質問しているのでは? どのようにいい加減なのでしょう。
そしてどのように解決するのでしょう? Nkprinterなら、APIで解決できない
のを解決できるんですか?


XOOX  2003-08-10 22:40:34  No: 4310

にしの様へ
NkPrinterはバージョンアップされていません。
あくまで得られるのは実寸を求めるのに必要な値です。
そもそも質問は
何ポイントの大きさならば、指定された幅に印字出来るのか?」を求める
ことでにしのさんいう「書くとはみ出す」というのとは違うように思います。
私が言っているのは
「紙のサイズとドットすうがわかればポイントによるサイズは換算できる」
という点です。
無論最初の質問がにしのさんのような使用目的の場合もありますが
以前私自身の問題に直面したときは
「正確な印刷するためのサイズだし」
でありはみ出すとかということではなかったのでの意見です。

それをいいだすとDHGLにもそういうプロパティもなく
印刷での成功率が高いのは中村氏によると
「Canvas.Draw メソッドのパラメータに TBitmap のインスタンスを指定すると、正常に描画できないことがあります。これは、プリンタドライバに依っては StretchBlt API でビットマップを印刷すると正常に印刷できないケースが多々有るからです。」
ということです。

○××○様へ
ありがちなハンドル名の歪曲しての使用は
最終的には自己否定になるので止めたほうがよいと思います。
但しあなた自体が「解」をひっさげてのいいがかりならばよいと思います。

一般論がたいていの場合答えではないでしょうか?
詳細コードや説明は理解されない可能性が多いので調査のためのポイントを示しているのです。
例えばdirect Input関連にしろタスクトレー関連にしろあれ以上の詳細なレスを書いたら単なるアーティクルになってしまいます。
そのアーティクルは既に誰かが書いているのでURLまで含めて書いたわけですが
それでわからないとなるとおそらく
「何をいってもわからない」
としか考えようがありません。

1.オーバーラップについて
こういうときの私の答えは
Google等で
オーバーラップ  プログラミング
ラップ  プログラミング
で探索してください。  です。

私はアンチオジジェクト指向のプログラミングをするのでdelphi固有のしがらみからは開放されていますが
一般的なdelphiプログラマーの場合オーバーラップという言葉
特に「delphiのAユニットはBユニットをオーバーラップしている」
といのがわからないというのはかなり問題があると思います。

2.そこを質問しているのでは? どのようにいい加減なのでしょう。
質問はdelphiの関数についてでWinAPIについてではありません。
この回答はコードを組める人がわざわざWinAPIからコードを組みなおすことを避ける為のヒントです。
無論より低位のフォントサイズを求める関数まで否定しているわけではありません。
レスが長くなるので例を避けたのですが
delphiで扱えない回転文字を扱えるようにTfontを改造しようとして
WinAPIでサイズ取得しようとすると理解できるでしょう。
ひとことでいうと「普通のパラメータで横書きする数値しか得られない」です。

グラフフィックスに関してWinAPIのいいかげんさとdelphiのいいかげんさと
両方があります。
紐解くと結局あちらこちらでformsとgraphicsが相互に絡み付いていて
位置から書き直したほうが速い場合もあるため
商用のコンポーネントが成立しているのだと思います。

3.Nkprinterなら、APIで解決できないのを解決できるんですか?
話が随分食い違っているように思います。
例えば単純に印刷するときにしのさんが紹介したDHGLの印刷機能は
失敗が少ないはずだと作者の中村氏はいっています。
しかしサイズ取得関数はないはずです。

この手のレスはこれっきりにしてもらいたいものですね。
無論何らかのFAQとして意味のあるドキュメントという前提で書いては見ました。
---
とりあえず一ついえることはフォントというのは幅がデータとしてあるので
それにもとずいて描画しているわけですから
なんでも自動のプロパティで取得するという形にしなければ解決法は複数あると思います。

奥の手として
「等幅フォント一文字ずつ場所を決めて書く」
という手もあります。エクセルやhtmlドキュメントの描画などで私は昔この手を使っていました。

あと有料のコンポーネントでこの手の機能があるものは
探せばあるかもしれません。

ま、「宜しくお願いします。」さんが(これもよくないハンドルの例だけど)
試行錯誤しながらでもどこかにたどり着けばよいかと思います。

フォントについて興味のあるひとはフォントの成り立ちについて解説したサイトがあり
いかにすればフォントのサイズを得られるかということがわかるための情報が
載っています。
印刷のみならずGridなどを自前で実装してみようという人は
フォント特に英語がどういう形であるか勉強してみるのもマイナスにはならないと思います。


OXXO  2003-08-11 00:33:02  No: 4311

こんにちは。

> 一般論がたいていの場合答えではないでしょうか?

はい、google で検索しろ、ヘルプ読め、コンポーネント探せ、というのが役に立たない
一般解の例です。あなたにとっては、90%以上の質問はこれで解決ですね。

> オーバーラップについて

overlapとwrapは何の関連もありません。

> 質問はdelphiの関数についてでWinAPIについてではありません。

ソースを見たことがないのでしょうか。TCanvasのTextHeightとTextWidthは
GetTextExtentPoint32()というAPIのラッパーですよ。

> delphiで扱えない回転文字

普通に扱えますが。ML の過去ログをどうぞ。
ついでに、Delphiでデバイスドライバを作れないことは知っていますが、
そのほかでできないことを教えてください。

> グラフフィックスに関してWinAPIのいいかげんさとdelphiのいいかげんさと
> 両方があります。

で、今回はAPIのいい加減さですよね。ラッパーですから。

>奥の手として
>「等幅フォント一文字ずつ場所を決めて書く」

質問はプロポーショナルフォントについてです。当幅フォントならそもそも
質問していないのでは。

自分は質問の答えを知りません。ですから、回答を書きませんでした。
書くのでしたら、最低でも質問の意味を理解する必要がありますね。


にしの  2003-08-11 03:00:40  No: 4312

> 私が言っているのは
> 「紙のサイズとドットすうがわかればポイントによるサイズは換算できる」
> という点です。

イタリック体の場合の換算方法はありますか?
それがなければ、これは答えになりません。
計算上、例えば通常の文字の"ABCDE"が、紙に入る大きさだった場合、イタリック体にすれば斜めになった分はみ出します。
これを計算する方法が、DHGLのサンプルに含まれています。
# NkPrinterではありません
サンプル部分なので、ライブラリにもほとんど依存しません。

「紙のサイズとドットすうがわかればポイントによるサイズは換算できる」が答えのポイントであれば、イタリック体であろうと、太字であろうと、プロポーショナルであろうと等幅であろうと、換算できるのでしょうから、それを説明して頂かないと、結局は答えになっていないと思います。


にしの  2003-08-11 03:09:14  No: 4313

もう1つ。

> 何ポイントの大きさならば、指定された幅に印字出来るのか?」を求める
> ことでにしのさんいう「書くとはみ出す」というのとは違うように思います。

紙幅については何もかかれていないので、おそらく、DrawTextなど幅・高さを指定して「ラベル」のように印字したいのだと思いました。
そうであれば、指定された幅に収まるポイントを取得するため、指定したポイントでの幅を取得し、ポイントを減らしながら正しく収まる大きさを取得するのが簡単だと思います。
# もちろん、直接取得できるのであれば、そのほうが早いのですが

逆に、実寸や、印刷サイズ(印字サイズでなく)として答えたのは何故でしょう。
タイトルに、「印字サイズ」とあるので、紙のサイズより文字のポイント数を割り出したいようにしか見えませんよ。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加