RtInRectをつかいたいのですが
CArray(CPoint,CPoint) m_p;
pDoc->m_p.Add(100,100);
CRect r1(0,0,150,150);
if(r1.PtInRect(m_p)){
MessageBox(当たり);
}
などやりたいのですが上手くいきません。
どんなエラーが出ているか書いてくれませんか?
MSDNを調べてみると
BOOL PtInRect( POINT point ) const;
と書いてありますが、POINTでなくCArrayを渡していませんか?
エラーではPOINTを渡してないといっているのですが
私が書いたようにするにはどうすればいいですか。
...おっしゃることがわかんない。
あなたが書いたようにするとエラーになります。
コンパイラの言うとおり、POINTを渡していないのですから。
あなたは何がしたいのですか? どんな結果を期待しているのですか?
私がやりたいことは横150縦150の長方形のなかに
m_pで指定した点があるかないかを探す。ことをしたかった
のです。
こんばんは、RAPTです。
CArray(POINT, POINT) m_p;
がよく分からないのですが。
POINT m_p;
m_p.x = 100;
m_p.y = 100;
CRect r1(0, 0, 150, 150);
if (r1.PtInRect(m_p)) {
// ...
}
では動作すると思います。
# ってゆーか、150x150 だったら、
# CRect r1(0, 0, 149, 149); じゃないとまずいよーな。
# これはちょっと自信がないので、識者、よろしくです。
## 何日か前にも似たよーな質問がどこかであったよーな…
Windows98/VC++6.0pro/SDK-may2002/ATL3.0/WTL7.0
pDoc->m_ten.Add(CPoint(385,78));//0//
pDoc->m_ten.Add(CPoint(388,113));//1//
pDoc->m_ten.Add(CPoint(388,154));//2//
pDoc->m_ten2.Add(CPoint(385,175));//3//
pDoc->m_ten2.Add(CPoint(383,188));//4//
pDoc->m_ten2.Add(CPoint(381,203));//5//
とあったときに、
for(int j=0;j<pDoc->m_ten.GetSize();++j);{
POINT m_tenp;
m_tenp.x=pDoc->m_ten[j].x;
m_tenp.y=pDoc->m_ten[j].y;
POINT m_ten2p;
m_ten2p.x=pDoc->m_ten2[j].x;
m_ten2p.y=pDoc->m_ten2[j].y;
CRect r1(x,y,xhaba-1,yhaba-1);
if(r1.PtInRect(m_tenp)||r1.PtInRect(m_ten2p)){
return(1);
}
return(0);
}
としたところデバッグエラーで
Debug Assertion Failed
program:
File afxtempl.h
Line:262
と出たんですがこのfor文を消すとデバッグエラーがなくなるのですが
原因がわかりません。
>CRect r1(x,y,xhaba-1,yhaba-1);
x=0; y=0; xhaba=150; yhaba=150;
for (...) の末尾にある ; のせいでこれを抜けたとき
j が範囲外となる。とかいうオチでしょうか?
すいません;は書きミスです。
デバッグを実行すると
AFX_INLINE TYPE& CArray<TYPE, ARG_TYPE>::ElementAt(int nIndex)
{ ASSERT(nIndex >= 0 && nIndex < m_nSize);
return m_pData[nIndex]; }
のところで矢印がいきました。
>すいません;は書きミスです。
本当に投稿する際のミスですか?
本当に for の後に ; があるのではないでしょうか。
その ASSERT の意味は理解していますか?
あと return 0 のある場所がおかしいですよね。
あ。それから PtInRect は右辺上の点と底辺上の点は範囲外と見なすので幅と高さから -1 は
しませんよ。
こんいちは、RAPTです。
> CArray(POINT, POINT) m_p;
は、CArray<POINT, POINT> m_p; だったのかな?
ハンガリアン記法なのに、メンバ変数でないのがプリフィクス m_ をつけているのが結構謎。
それから、for文は1回しか実行されない。
m_ten , m_ten2 の宣言を書いてもらえますか?
CArray<CPoint, CPoint> m_ten, m_ten2;
でいいのかな?
> デバッグを実行すると
> AFX_INLINE TYPE& CArray<TYPE, ARG_TYPE>::ElementAt(int nIndex)
> { ASSERT(nIndex >= 0 && nIndex < m_nSize);
> return m_pData[nIndex]; }
> のところで矢印がいきました。
これは、
m_tenp.x=pDoc->m_ten[j].x;
とあったら、m_ten[j] の、j が、m_ten の範囲外を指している、ということです。
# この場合、CArrayの、operator[] は、内部で ElementAt() を呼び出しているから。
再度、デバッガで、j の取りうる範囲と、m_ten の配列が保持するデータとを
見比べてみてはいかがでしょうか。
たさん>
> PtInRect は右辺上の点と底辺上の点は範囲外と見なすので幅と高さから -1 は
> しません
フォローありがとうございます。
Windows98/VC++6.0pro/SDK-may2002/ATL3.0/WTL7.0
pDoc->
ってなんでしょうね
>本当に for の後に ; があるのではないでしょうか。
確認しましたが;はありませんでした。
>return 0の位置
確かにおかしいです。
>CArray<POINT, POINT> m_p; だったのかな?
はい。そのとおりです。
for(int j=0;j<pDoc->m_ten.GetSize();++j){
とあったときには今はm_ten.GetSize();に入ってるのは3ですよね?
jは0~2まで繰り返されるということで間違っていないと思うのですが
m_tenp.x=pDoc->m_ten[j].x;
はm_ten[j]の範囲内にあるのではないでしょうか。