喫茶XRAYトップページ

[スレッド全体
]

[2179] Re4:やってみて、質問です?返信 削除
2009/3/1 (日) 18:24:42 KSC 〔HomePage
▼ Mr.XRAYさん
> 少し考えながら,Q and A にカキコしながら,また考えたんですが,
> もしかしたら,こういうことではないのかと.
>
> 1. TextOutで描画した場合
>    描画開始始点は(X1,Y1)であるが,終点は文字列の長さとサイズに
>    によって違ってくる
> 2. StretchDrawMetaFileの場合
>    (X1,Y1)と(X2,Y2)で設定した範囲内にStretchDrawされている
>
> の違いかも知れません.


Mr.XRAYさんのソースより
>          X1 := 200;
>          X2 := 2200;(A)
>          Y1 := 300;
>          Y2 := Y1+500;
>
> ・
> ・
> ・
>          //文字列の長さを求める
>          L := plPrev1.Canvas.TextWidth(TestText);
>          //文字列を囲む枠を描画
>          plPrev1.Rectangle(X1,X1+L,Y1,Y2);(B)
>
> ・
> ・
> ・
> ・

この時、
 InverseString(X1,Y1,X2,Y2,TestText,AFont);
「X2」と「X1+L」が同一値なら表示は同一幅にならなければ理屈が合わないのですが?

前回、イメージ画像を送った際も上記で言う「X2」と「X1+L」は同一値になるように
計算して描画してもイメージ画像ような結果でした。

なぜなのでしょうか?


[2182] Re5:やってみて、質問です?返信 削除
2009/3/1 (日) 23:16:37 Mr.XRAY
▼ KSCさん

> 前回、イメージ画像を送った際も上記で言う「X2」と「X1+L」は同一値になるように
> 計算して描画してもイメージ画像ような結果でした。


う〜む.
ミラー文字を描画するときの,右端のX座標値を,
以下のように,TextOutで描画した時の右端の座標値とするというのは?

         //通常の文字の描画
         plPrev1.Canvas.Font.Height := Y2-Y1;
         plPrev1.TextOut(X1,Y1,TestText);
         //文字列の長さを求める
         L  := plPrev1.Canvas.TextWidth(TestText);
         X2 := X1+L;   //ここを追加
         //文字列を囲む枠を描画
         plPrev1.Rectangle(X1,X2,Y1,Y2);  //X1+LをX2にする

         InverseString(X1,Y1,X2,Y2,TestText,AFont); //前のまま


[2183] Re5:やってみて、質問です?(追記)返信 削除
2009/3/1 (日) 23:21:03 KSCHomePage
▼ Mr.XRAYさん
> ・
> ・
> ・
> ・
> この時、
>  InverseString(X1,Y1,X2,Y2,TestText,AFont);
> 「X2」と「X1+L」が同一値なら表示は同一幅にならなければ理屈が合わないのですが?
>
> 前回、イメージ画像を送った際も上記で言う「X2」と「X1+L」は同一値になるように
> 計算して描画してもイメージ画像ような結果でした。
>
> なぜなのでしょうか?


アプリ用のコンポにデバックモードを追加し、デバックモード時に矩形テキストを表示した際の
・「ARect」を二点鎖線の直線表示。
・左上と右下の座標値表示。
させるようにしました。

そのついでに上記の「X2」と「X1+L」が同一値なら...イメージできる画像を添付します。

何かの参考になりますか?

[2184] Re6:やってみて、質問です?(追記)返信 削除
2009/3/1 (日) 23:28:06 Mr.XRAY
▼ KSCさん

またまたう〜ん.
図をよくみて調べてみます.... ?

[2186] Re7:やってみて、質問です?(追記)返信 削除
2009/3/1 (日) 23:55:25 KSCHomePage
▼ Mr.XRAYさん
> ▼ KSCさん
>
> またまたう〜ん.
> 図をよくみて調べてみます.... ?


#2183の書き込みがMr.XRAYさんの#2182の書き込みとタイミングが前後したようです。

#2182の書き込みでやって頂いた結果でビンゴなのですが、
どうやら私のソースで指定している
 FPrev.TextOut(X1, Y1, str);の時のFont情報と
 FPrev.InverseString(X1, Y1, X2, Y2, str, FPrev.Canvas.Font);で指定した
 FPrev.Canvas.Fontが異なっているような気がしてきました。

Mr.XRAYさんのソースのように反転文字の描画用にAFontをCreateして、
a)AFont.Assign(plPrev1.Canvas.Font);を実施した時。
b)AFont.Height := Y2-Y1;を実施した時。

a)は従来どおりでした。
b)は幅方向の空間は空かずに逆に多少オーバー気味でした。(理想に近づいている)

質問
 私のソースが悪いのでしょうが、
 FPrev.InverseString(X1, Y1, X2, Y2, str, FPrev.Canvas.Font);と言う風に
 Font情報を渡すのは無理があるのでしょうか?


[2187] Re8:やってみて、質問です?(追記)返信 削除
2009/3/2 (月) 00:41:22 Mr.XRAY
▼ KSCさん

>  私のソースが悪いのでしょうが、
>  FPrev.InverseString(X1, Y1, X2, Y2, str, FPrev.Canvas.Font);と言う風に
>  Font情報を渡すのは無理があるのでしょうか?


いや,これはないと思います.
どこかでX1の値が変わっているうな気がします.

b)AFont.Height := Y2-Y1;を実施した時。

これをどこで設定しているかは分かりませんが,
StretchDrawMetaFile(ARect,AMetaFile)
は,StrechDraw(ARectに収まるように)に,メタファイルを描画しますから,
実際には,このメソッドを呼出し直前のフォントサイズは関係ありません.

例えば,以下のようにしても結果は全く同じです.
      plPrev1.Canvas.Font.Size :=10;
      plPrev1.StretchDrawMetaFile(ARect,AMetaFile);

上の図がStretchで,下がStretchでない場合(TextOutに相当)です.


[2185] ミラー文字テスト返信 削除
2009/3/1 (日) 23:34:29 Mr.XRAY
▼ KSCさん
[2183]の添付図は,左右と上下のミラーなんですね.
で,InverseStringの引数のY1とY2を入れ換えてやってみました.

  InverseString(X1,Y1,X2,Y2,TestText,AFont);
        ↓
  InverseString(X1,Y2,X2,Y1,TestText,AFont);

図のようになりました.
私,何か勘違いしているのな?


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82