SDIで作成しているんですが
座標をCArray<CPoint,CPoint>a;とし文字をCArray<CString,CString>b;に
多数のデータをいれて
表示したときに文字が重なったら表示しないように
する方法はありませんでしょうか?
なにか良い提案はないでしょうかよろしくお願いします。
この座標って、文字列を表示する際の起点となる位置のことですよね?
重なりを判定するなら、起点座標に加え、
文字列表示に必要な幅と高さも保持しておく必要があると思います。
CPointのアレイではなく、CRectのアレイの方がよいのでは?
ところで、
a[0] ⇒ 文字列b[0]を表示する時の起点
a[1] ⇒ 文字列b[1]を表示する時の起点
: :
a[n] ⇒ 文字列b[n]を表示する時の起点
と解釈しましたが、よい?
回答ではありません
CArray<CString,CString>b はCStringArray bでいいのでは?
ご返事ありがとうございます。
>a[0] ⇒ 文字列b[0]を表示する時の起点
>a[1] ⇒ 文字列b[1]を表示する時の起点
> : :
>a[n] ⇒ 文字列b[n]を表示する時の起点
>と解釈しましたが、よい?
はい そのとおりです
CRectってもし座標が左上が (10,10) で右下が (20,20) この間で
文字が表示されることになるのでしょうか?
pDC->TextOut(pDoc->a[1].x,pDoc->b[1].y,pDoc->b[1];
のような書き方をしているのですがどのように書いたらいいのでしょうか?
>CArray<CString,CString>b はCStringArray bでいいのでは?
すいません 初心者なもんで知りませんでした。m(__)m
CRect Rect;
CDC::DrawText(pDoc->b[1], -1, &Rect, DT_LEFT | DT_VCENTER)
を使えばRectでクリッピングされます。
>CRect Rect;
>CDC::DrawText(pDoc->b[1], -1, &Rect, DT_LEFT | DT_VCENTER)
>を使えばRectでクリッピングされます。
クリッピングとは何でしょうか。
文字があるってゆうことを認識できるようになるとゆう意味でしょうか。
> クリッピングとは何でしょうか。
その矩形からはみだす部分が描かれなくなるという意味です。
ところで文字が重なるかどうかはどう判断するんですか?
起点と起点を比較するんですか?
文字があるってゆうことを認識はできないですが、
CRectの座標が左上が (10,10) で右下が (20,20) などの場合
それより外に描写されない(切れてしまう)ってことです。
CRectの配列をお互い重ならないように初期化すれば、
結果として、文字は重なりません。エクセルのセル(Cell)って感じかな
CDC::GetTextExtentも調べてください。
> ところで文字が重なるかどうかはどう判断するんですか?
すいませんそれを聞かれてるんですね。
文字が重なるかどうかは、CDC::GetTextExtent() 等で寸法を得て、自分で
重なるか重ならないか計算する以外ないです。
ご返事ありがとうございます
やっぱり文字の周りの座標を得なければ
いけないのでしょうか。
ヘルプにより
TextOut 関数を呼び出したときに、現在位置を更新したいときは、
SetTextAlign メンバ関数の nFlags に TA_UPDATECP を設定して呼び出します。
このフラグが設定されているときは、Windows は続く TextOut 関数の呼び出しで、x
と y を無視し、
代わりに現在位置を使います。
CDC::SetTextAlign
UINT SetTextAlign( UINT nFlags );
TA_UPDATECP テキスト出力関数呼び出し各回の後に、現在位置を更新します。
新しい位置は、テキストに外接する四角形の右辺の位置になります。
このフラグが設定されているときは、TextOut メンバ関数の呼び出しで指定された座標
は無視されます。
試してないですが、y方向はどうなんでしょうか?
これをつかえば座標点に密接した文字配置できますよね
これを使いたいのですがそこに文字があるのかを認識
させるためには文字周りの座標だけで良いのでしょうか?
文字を描写する座標(開始点)から
CSize GetTextExtent( const CString& str ) const;で得た
CSize領域をCDC::GetPixelでくまなく調べる。
それで文字と同じRGBカラーがあればそこに文字があるという事でしょうか?
でもあまりおすすめな方法では、なさそうですが? ??);
CRectで指定した値の四角の中に点があるかどうか
を判定する方法はないのでしょうか?
クラス CRect について調べれば直(す)ぐに分る事ですが
CRect::NormalizeRect(), と CRect::PtInRect() とを組み合せれば
指定した点が矩形内部にあるかどうかの判定が出来ます