「起点となる座標が、任意のCRectに含まれるか?」を調べればよいのですか?
起点座標は任意のCRectに含まれていなくても、終点座標が含まれていたら??
CRect::IntersectRect()は、2つの四角形を調べ、重なりがあるかどうかを返します。
これから表示しようとするテキストが占める四角形と、
既に表示済みのテキストの四角形に重なりがあるか調べれば・・・
CRect::IntersectRect()をつかいたいのですが
書き方がいまいちわかりません
教えていただけないでしょうか。
文字列Aを表示する矩形をRa、文字列Bを表示する矩形をRb、
両者の重なりを表す矩形をRiとして、
CRect Ra( 0, 0, 400, 300 );// 例
CRect Rb( 200, 150, 600, 450 );// 例
CRect Ri;
BOOL bIntersect = Ri.IntersectRect( &Ra, &Rb );
こうすると
bIntersect==TRUE
Ri==CRect( 200, 150, 400, 300 )
となります。
重なってるなら1を返し重なってなければ0を返すんですよね
これで判定できたのですが文字を張るか張らないかをif文か
swich文で書こうと思っているのですがどちらのほうが処理
が重いですか?
何件のデータ(文字列)を処理しようとしているのかわかりませんが、
処理の重さを気にしなければならないほど大量なのですか?
まずはif分でもswitch分でもよいので、
思い通りの動きをするプログラムを組み立てることが先決のように思うのですが。
その上で、動作スピードに問題が出るようなら、その時改めて質問すればよろしいかと。
小さな問題をひとつずつ段階的にクリアして成果を出していかないと、続かないですよん。
(差し出がましいようで申し訳ないです。)
CArray<CRect,CRect>mp;
pDoc->mp.Add(CRect(100,100,140,120));
を作ったとして今mp[0]に値がはいってますよね
それを後から書き換えることは可能なんでしょうか?
CArrayとCRectをMSDNで調べるのが吉ぢゃ。
> CArray<CRect,CRect>mp;
こう定義した時、
> 今mp[0]に値がはいってますよね
ってことは、mp[0]は何型かはわかってますよね?
ってことは・・・?
CRect Ri;
int p;
CSize size;
for(int i=0;i<100;i++){
for(int q=0;q<100;q++){
BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
if(Intersect==1){
p=1;
size = pDC->GetTextExtent(pDoc->mt[i]);
pDoc->mp[i]=CRect(pDoc->mp[i].left,pDoc->mp[i].top+size.cy,pDoc->mp
[i].right,pDoc->mp[i].bottom+size.cy);
break;
}
else p=0;
}
if(p==1){
for(int q=0;q<100;q++){
BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
if(Intersect==1){
p=2;
size = pDC->GetTextExtent(pDoc->mt[i]);
pDoc->mp[i]=CRect(pDoc->mp[i].left-size.cx,pDoc->m[i].top,pDoc-
>mp[i].right-size.cx,pDoc->mp[i].bottom);
break;
}
else p=0;
}
}
else if(p==2){
for(int q=0;q<100;q++){
BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
if(Intersect==1){
p=3;
size = pDC->GetTextExtent(pDoc->mt[i]);
pDoc->mp[i]=CRect(pDoc->mp[i].left,pDoc->m[i].top+size.cy,pDoc-
>mp[i].right,pDoc->mp[i].bottom+size.cy);
break;
}
else p=0;
}
}
else if(p==0){
pDC->TextOut(pDoc->mp[i].left,pDoc->mp[i].top,pDoc->mt[i]);
}
else if(p==3){
p=0;
}
}
一応書いてみたのですがBOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp
[q]);のところで同じものを参照してしまうのですがこれを改善できる方法はないでしょうか?
これより短くプログラムを書くことができるとおもうのですが
ほかの人の提案をお聞かせください おねがいします。
CArray<CRect,CRect>mp;
CArray<CString,CString>mt;
を書きわすれてました。
すいませんウソ教えました。
ウソ:bIntersect==TRUE
OK:bIntersect!=FALSE
というのは、ヘルプに「非0を返す」とあるわけでTRUEを返すとは限らないのでした。
(やってみたら一応1が返ってきてましたが)
上のプログラムを動かすとmp[0]がfor文を通るときpの値が-86・・・となります。
なぜでしょうか?
なぜ、というか、
まだ初期化されてないから適当な値が入ってるんじゃないかと。
デバッグビルドでは 0xCCCCCCCC になるんでしたっけ。
>これより短くプログラムを書くことができるとおもうのですが
>ほかの人の提案をお聞かせください おねがいします。
あなたが示されたコードからは何がしたいのかが良く判りませんでした。出来ましたら
何処で何が起きているのか、または何がしたいのかについてソースにコメントが付いて
いたら、判断材料になったかもしれないのでコメント付きのソースをアップしていただけ
ませんか?
>for(int i=0;i<100;i++){
> for(int q=0;q<100;q++){
> BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
> if(Intersect==1){
> p=1;
> size = pDC->GetTextExtent(pDoc->mt[i]);
> pDoc->mp[i]=CRect(pDoc->mp[i].left,pDoc->mp[i].top+size.cy,pDoc->mp
> [i].right,pDoc->mp[i].bottom+size.cy);
> break;
> }
> else p=0;
> }
の部分ですが、これですと、i 番目の矩形に重なる矩形が一つでも見つかったら、内側の
制御変数が q のループは打ち切る事になっていますが(判定も if (Intersect !=0) の
方が n さんのお話では相応(ふさわ)しいようですが)、これはあなたのお望みの動作
なんでしょうか?
更に、このままですと q と i とが等しい場合について何も考慮されていませんがその場合
は除外する必要はないのですか?
それから、何故 q 番目のではなくて i 番目の方が操作の対象なんでしょうか?
返事おくれてすみません
やりたいことを書きました
よろしくおねがいします
CRect Ri;
int p;
CSize size;
>for(int i=0;i<100;i++){
> for(int q=0;q<100;q++){
> if(pDoc->mp[i]!=pDoc->mp[q]){
> BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
> if(Intersect==1){
> p=1;
>size = pDC->GetTextExtent(pDoc->mt[i]);
>pDoc->mp[i]=CRect(pDoc->mp[i].left,pDoc->mp[i].top+size.cy,pDoc->mp
>[i].right,pDoc->mp[i].bottom+size.cy);
>break;
>}
>else p=0;
>}
>}
mp[i]の中にmp[i]以外のすべてのmpをみていきもし重なっていたならmp[i]の値を上より
に変えてp=1にする。もしなかったらp=0にする。
>if(p==1){
>for(int q=0;q<100;q++){
>if(pDoc->mp[i]!=pDoc->mp[q]){
>BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
>if(Intersect==1){
>p=2;
>size = pDC->GetTextExtent(pDoc->mt[i]);
>pDoc->mp[i]=CRect(pDoc->mp[i].left-size.cx,pDoc->m[i].top,pDoc-
>mp[i].right-size.cx,pDoc->mp[i].bottom);
>break;
>}
>else p=0;
>}
>}
>}
先ほど場所で貼れなかったのでpには1がはいって先ほどと同じ作業をしmp[i]の中にmp[i]
以外のすべてのmpをみていきもし重なっていたならmp[i]の値を左よりに変えてp=2にす
る。もしなかったらp=0にする。
>else if(p==2){
>for(int q=0;q<100;q++){
if(pDoc->mp[i]!=pDoc->mp[q]){
> BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
> if(Intersect==1){
> p=3;
> size = pDC->GetTextExtent(pDoc->mt[i]);
> pDoc->mp[i]=CRect(pDoc->mp[i].left,pDoc->m[i].top+size.cy,pDoc-
>mp[i].right,pDoc->mp[i].bottom+size.cy);
>break;
> }
>else p=0;
>}
>}
>}
先ほど場所で貼れなかったのでpには2がはいって先ほどと同じ作業をしmp[i]の中にmp[i]
以外のすべてのmpをみていきもし重なっていたならmp[i]の値を下よりに変えてp=3にす
る。もしなかったらp=0にする。
else if(p==3){
for(int q=0;q<i;q++){
if(pDoc->mp[i]!=pDoc->mp[q]){
BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);
if(Intersect==1){
p=4;
size = pDC->GetTextExtent(pDoc->mt[i]);
pDoc->mp[i]=CRect(pDoc->mp[i].left,pDoc->mp[i].top+size.cy
,pDoc->mp[i].right,pDoc->mp[i].bottom+size.cy);
break;
}
else p=0;
}
}
}
先ほど場所で貼れなかったのでpには3がはいって先ほどと同じ作業をしmp[i]の中にmp[i]
以外のすべてのmpをみていきもし重なっていたならmp[i]の値を消す(消し方がわからな
い)p=4にする。もしなかったらp=0にする。
>else if(p==0){
> pDC->TextOut(pDoc->mp[i].left,pDoc->mp[i].top,pDoc->mt[i]);
>}
p=0は他のmpが重なっていないところなのでそこに貼る。
>else if(p==4){
>p=0;
>}
次のforの前にpを初期化。
>}