2010-12-02 16 views
3

12.5ピクセルXと20ピクセルY(PICAスケール)の間隔でグリッドを描画する必要があります。フォントは特定のサイズでなければならず、線は依然として1ピクセルの太さでなければなりません。現在、これらの値を浮動小数点数で保存しています(たとえば、3行目から6行目までのテキストは、2f * cx、5f * cyとして表示されます)。私は、スケール変換を使ってこの不要な乗算を避けたいのですが、残念ながらそれらはフォントのサイズと線の太さにも影響します。これを避ける方法はありますか?あるいは、cx/cy値が定数であるため、コンパイラは私のためにこれを静かに実行しますか?C#GDIの位置を調整しますが、フォントのサイズや線の太さは変更しません。

答えて

1

コンパイラは式の定数部分を1つの定数に減らす必要がありますが、浮動小数点の値はコンパイル時には分かっていないので、実行時にはさらに倍数が必要になります。したがって、(1 + 2 + c)* 6 * fは、cが定数の場合、コンパイラによってn * fに減らすことができます。

テキストの拡大/縮小を防ぐには、スケーリング変換を設定し、最小線幅を維持することを気にしない非テキストグラフィックスをすべて描画してから、変換を使用せずにテキストを描画します。トランスフォームを使用して、テキストをどこから独立して計算する必要がなくなるかを特定することができます.LPtoDP(論理ポイントからデバイスポイント)のような機能は、そのトリックを行う必要があります。

これにアプローチする別の方法は、テキストをトランスフォームにレンダリングすることですが、テキストサイズ自体に逆のスケーリングを適用することです。したがって、変換が5%に縮小すると、フォントサイズを5%拡大することができます。これでは正確な結果は得られませんが、ビジュアルには十分近いかもしれません。

+0

グラフィッククラスにはLPtoDP関数がありますか、それとも自分で作成する必要がありますか?多くのテキスト出力がありますが、これはできるだけ速く(実際にはOnPaintBackgroundに属しています)、アスペクトは1:1ではないので、逆のスケーリングが良い選択とは思われません。 – Patrick

+0

LPtoDPは、Win32 GDI API関数です。 .NETのグラフィックスクラスでは、似ているかもしれませんが、わかりません。 – dthorpe

6

...また、マイクロソフトでは、線を拡大縮小したくない場合は、少し「ハック」を残しています。行の幅を0pxに設定すると、常に1ピクセルの太さで描画されます。

+0

うわー。それは知らなかった。それはきちんとしている。 – Patrick

+0

それは素晴らしいです、あなたは脚の終わりです。 –

関連する問題