文字がかさならないようにするためには

[戻る]
wen 2003/02/08(土) 03:08:28
SDIで作成しているんですが
座標をCArray<CPoint,CPoint>a;とし文字をCArray<CString,CString>b;に
多数のデータをいれて
表示したときに文字が重なったら表示しないように
する方法はありませんでしょうか?
なにか良い提案はないでしょうかよろしくお願いします。

sugar 2003/02/08(土) 03:47:58
この座標って、文字列を表示する際の起点となる位置のことですよね?
重なりを判定するなら、起点座標に加え、
文字列表示に必要な幅と高さも保持しておく必要があると思います。
CPointのアレイではなく、CRectのアレイの方がよいのでは?

ところで、
a[0] ⇒ 文字列b[0]を表示する時の起点
a[1] ⇒ 文字列b[1]を表示する時の起点
  :       :
a[n] ⇒ 文字列b[n]を表示する時の起点
と解釈しましたが、よい?

ナオーバ 2003/02/08(土) 08:26:31
回答ではありません

CArray<CString,CString>b はCStringArray bでいいのでは?

wen 2003/02/08(土) 11:26:39
ご返事ありがとうございます。
>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

スマイル 2003/02/08(土) 15:33:09
CRect    Rect;
CDC::DrawText(pDoc->b[1], -1, &Rect, DT_LEFT | DT_VCENTER)
を使えばRectでクリッピングされます。

wen 2003/02/08(土) 16:02:49
>CRect    Rect;
>CDC::DrawText(pDoc->b[1], -1, &Rect, DT_LEFT | DT_VCENTER)
>を使えばRectでクリッピングされます。

クリッピングとは何でしょうか。
文字があるってゆうことを認識できるようになるとゆう意味でしょうか。

n [E-Mail] 2003/02/08(土) 16:18:34
> クリッピングとは何でしょうか。
その矩形からはみだす部分が描かれなくなるという意味です。

ところで文字が重なるかどうかはどう判断するんですか?
起点と起点を比較するんですか?

スマイル 2003/02/08(土) 16:26:17
文字があるってゆうことを認識はできないですが、
CRectの座標が左上が (10,10) で右下が (20,20) などの場合
それより外に描写されない(切れてしまう)ってことです。
CRectの配列をお互い重ならないように初期化すれば、
結果として、文字は重なりません。エクセルのセル(Cell)って感じかな

CDC::GetTextExtentも調べてください。

n [E-Mail] 2003/02/08(土) 16:29:54
> ところで文字が重なるかどうかはどう判断するんですか?
すいませんそれを聞かれてるんですね。

文字が重なるかどうかは、CDC::GetTextExtent() 等で寸法を得て、自分で
重なるか重ならないか計算する以外ないです。

wen 2003/02/08(土) 16:58:46
ご返事ありがとうございます
やっぱり文字の周りの座標を得なければ
いけないのでしょうか。

スマイル 2003/02/08(土) 20:32:45
ヘルプにより

TextOut 関数を呼び出したときに、現在位置を更新したいときは、
SetTextAlign メンバ関数の nFlags に TA_UPDATECP を設定して呼び出します。
このフラグが設定されているときは、Windows は続く TextOut 関数の呼び出しで、x 
と y を無視し、
代わりに現在位置を使います。


CDC::SetTextAlign 
UINT SetTextAlign( UINT nFlags );

TA_UPDATECP   テキスト出力関数呼び出し各回の後に、現在位置を更新します。
新しい位置は、テキストに外接する四角形の右辺の位置になります。
このフラグが設定されているときは、TextOut メンバ関数の呼び出しで指定された座標
は無視されます。

試してないですが、y方向はどうなんでしょうか?

wen 2003/02/08(土) 21:28:12
これをつかえば座標点に密接した文字配置できますよね
これを使いたいのですがそこに文字があるのかを認識
させるためには文字周りの座標だけで良いのでしょうか?

スマイル 2003/02/08(土) 22:23:34
文字を描写する座標(開始点)から
CSize GetTextExtent( const CString& str ) const;で得た
CSize領域をCDC::GetPixelでくまなく調べる。
それで文字と同じRGBカラーがあればそこに文字があるという事でしょうか?

でもあまりおすすめな方法では、なさそうですが? ??);

wen 2003/02/08(土) 23:04:19
CRectで指定した値の四角の中に点があるかどうか
を判定する方法はないのでしょうか?

2003/02/08(土) 23:12:28
クラス CRect について調べれば直(す)ぐに分る事ですが
CRect::NormalizeRect(), と CRect::PtInRect() とを組み合せれば
指定した点が矩形内部にあるかどうかの判定が出来ます

sugar 2003/02/09(日) 01:18:54
「起点となる座標が、任意のCRectに含まれるか?」を調べればよいのですか?
起点座標は任意のCRectに含まれていなくても、終点座標が含まれていたら??

CRect::IntersectRect()は、2つの四角形を調べ、重なりがあるかどうかを返します。
これから表示しようとするテキストが占める四角形と、
既に表示済みのテキストの四角形に重なりがあるか調べれば・・・

wen 2003/02/09(日) 09:51:52
CRect::IntersectRect()をつかいたいのですが
書き方がいまいちわかりません
教えていただけないでしょうか。

n [E-Mail] 2003/02/09(日) 10:23:57
文字列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 )

となります。

wen 2003/02/09(日) 11:33:07
重なってるなら1を返し重なってなければ0を返すんですよね
これで判定できたのですが文字を張るか張らないかをif文か
swich文で書こうと思っているのですがどちらのほうが処理
が重いですか?

sugar 2003/02/09(日) 14:13:19
何件のデータ(文字列)を処理しようとしているのかわかりませんが、
処理の重さを気にしなければならないほど大量なのですか?

まずはif分でもswitch分でもよいので、
思い通りの動きをするプログラムを組み立てることが先決のように思うのですが。
その上で、動作スピードに問題が出るようなら、その時改めて質問すればよろしいかと。
小さな問題をひとつずつ段階的にクリアして成果を出していかないと、続かないですよん。
(差し出がましいようで申し訳ないです。)

wen 2003/02/09(日) 14:22:08
CArray<CRect,CRect>mp;

pDoc->mp.Add(CRect(100,100,140,120));
を作ったとして今mp[0]に値がはいってますよね
それを後から書き換えることは可能なんでしょうか?

n [E-Mail] 2003/02/09(日) 15:33:51
CArrayとCRectをMSDNで調べるのが吉ぢゃ。

sugar 2003/02/09(日) 17:00:29
> CArray<CRect,CRect>mp;

こう定義した時、

> 今mp[0]に値がはいってますよね

ってことは、mp[0]は何型かはわかってますよね?
ってことは・・・?

wen 2003/02/09(日) 18:34:36
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]);のところで同じものを参照してしまうのですがこれを改善できる方法はないでしょうか?

これより短くプログラムを書くことができるとおもうのですが
ほかの人の提案をお聞かせください おねがいします。

wen 2003/02/09(日) 18:42:23
CArray<CRect,CRect>mp;
CArray<CString,CString>mt;

を書きわすれてました。

n [E-Mail] 2003/02/10(月) 09:43:09
すいませんウソ教えました。

 ウソ:bIntersect==TRUE
 OK:bIntersect!=FALSE

というのは、ヘルプに「非0を返す」とあるわけでTRUEを返すとは限らないのでした。
(やってみたら一応1が返ってきてましたが)

wen 2003/02/10(月) 15:17:48
上のプログラムを動かすとmp[0]がfor文を通るときpの値が-86・・・となります。
なぜでしょうか?

PAI 2003/02/10(月) 15:53:31
なぜ、というか、
まだ初期化されてないから適当な値が入ってるんじゃないかと。

デバッグビルドでは 0xCCCCCCCC になるんでしたっけ。

2003/02/10(月) 16:26:58
>これより短くプログラムを書くことができるとおもうのですが
>ほかの人の提案をお聞かせください おねがいします。

あなたが示されたコードからは何がしたいのかが良く判りませんでした。出来ましたら
何処で何が起きているのか、または何がしたいのかについてソースにコメントが付いて
いたら、判断材料になったかもしれないのでコメント付きのソースをアップしていただけ
ませんか?

>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 番目の方が操作の対象なんでしょうか?

wen 2003/02/10(月) 22:47:13
返事おくれてすみません
やりたいことを書きました
よろしくおねがいします
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を初期化。
>}

2003/02/10(月) 23:17:06
>>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にする。
とはなっていませんよ。あなたの今回のコードでは Doc ->mp[i] と Doc ->mp[q] とを
比べているので i 番目の矩形と q 番目の矩形とが等しいかどうかだけに着目しているの
です。等しくない場合に重なりがあるか検査しています。

何故

for (int i =0; i <100-1; i++)  {
   for (int q =i +1; q <100; q++)  {
      // i 番目の矩形と q 番目の矩形とが重なる場合は q 番目の矩形を変更して
      // 重なりがない様にするが、i 番目以前の矩形と重ならない事を保証するには
      // どうするのがいいだろうか?
      // 今までに出てきた矩形の下端(したば)の最大値を記録するなり、i 番目までの
      // 矩形を囲む最小の矩形を記録するなり、して確実に重なる事のない領域を割り出す
      // 仕組みを考える事が必要だろう;
   }
}

と言うループになさらないんですか?
  こういうループにしていれば i と q とが同じ値になる事がないので簡単になるでしょう?
再度お尋ねしますが
 重なるものがあったら内側の検索ループを中断するのは何故ですか?
 何故 q 番目のではなくて i 番目の方が操作の対象なんでしょうか?

wen 2003/02/10(月) 23:46:28
考えていることは点に対して文字は左よりに貼られますよね。そこに貼れなければ文字分上にい
って検索をかけ貼れなければそこから文字分左へ行き検索をかけはれなかったら下に行き検索を
かけ貼れなければその文字ははれないので文字を削除したいのです。全部ではれる場所は点にた
いして4つと決めております。

>比べているので i 番目の矩形と q 番目の矩形とが等しいかどうかだけに着目しているの
>です。等しくない場合に重なりがあるか検査しています。

mp[i]自身を検索にかけてしまうと結果重なってるとなってしまうので
mp[i]=mp[q]以外としました。
そのときに
BOOL Intersect = Ri.IntersectRect(&pDoc->mp[i] ,&pDoc->mp[q]);

重なってるかどうかを判定しています。


>for (int i =0; i <100-1; i++)  {
>   for (int q =i +1; q <100; q++)  {
 これは 
for (int i =0; i <100-1; i++)  {
   for (int q =i +1; q < i; q++)  {
と変更しました。


>重なるものがあったら内側の検索ループを中断するのは何故ですか?

break; のことですよね?貼れないのがわかったら次のループに移るように
したかったからです。

>何故 q 番目のではなくて i 番目の方が操作の対象なんでしょうか?

q番目のほうはすでに貼り終えたほうなので次に貼るほうを変更しました。

2003/02/11(火) 00:14:51
>考えていることは点に対して文字は左よりに貼られますよね。
よねっていわれても困っちゃう私でした。何の事やら良く判らないのですよ

>そこに貼れなければ文字分上にいって検索をかけ貼れなければそこから文字分左へ行き
>検索をかけはれなかったら下に行き検索をかけ貼れなければその文字ははれないので
>文字を削除したいのです。
  +--------------+     +-------------+
  |      (A)     |     |     (B)     |
  +--------------+     +-------------+
   +-----------------+ +-------------+
   |       (A')      | |     (B')    |
   +-----------------+ +-------------+
 
 (A) が良い位置でない場合、(A') を試してみて、それも駄目なら(B') を試してみると
そこも駄目なら (B) を試すと言う事ですか?

それならそういう検査を函数にしてしまいましょう。
int CheckNewPos(const CArray& mp, int i, int q) というような函数になるんでしょうか
検査結果を見て新しい配置を作るか、削除するかすればいいでしょう
0 なら (A') , 1 なら (B'), 2 なら (B), -1 なら削除というように返す値を決めれば
済む事ですね

wen 2003/02/11(火) 00:48:01
  B--------------A--------------+
  |      (3)      |      (2)     |
  C--------------@--------------+
  |      (4)      |      (1)     |
  +----------------+--------------+    

@が基準点mp[i]として普通は(1)に貼るのですがここで(1)にmp[q]が
あるとするならmp[i]の値をAへと変えてというふうにCまでやって
(4)にも貼れなければmpの中から削除する。
です

2003/02/11(火) 00:56:16
>@が基準点mp[i]として普通は(1)に貼るのですがここで(1)にmp[q]が
>あるとするならmp[i]の値をAへと変えてというふうにCまでやって
>(4)にも貼れなければmpの中から削除する。

私なら、mp[i] ではなく、mp[q] の方を変更の対象に選びます。その方が後々(あとあと)
楽になると思うからですが、あなたがご自分の判断でどちらをお選びになるかまで云々
(うんぬん)するような差し出がましい事はしたくありません

検査を函数化するという考えはお気に召しませんでしたか?

wen 2003/02/11(火) 01:27:56
int CheckNewPos(const CArray& mp, int i, int q) というような函数になるんでしょうか

ちょっとよくわからないんですがどうゆう関数なんでしょうか?


>私なら、mp[i] ではなく、mp[q] の方を変更の対象に選びます。その方が後々(あとあと)
>楽になると思うからですが、あなたがご自分の判断でどちらをお選びになるかまで云々

mp[q]を変えるとすべての値が変わることになりませんか? あとあと楽になるのはどうしてで
しょうか

2003/02/11(火) 01:43:16
>ちょっとよくわからないんですがどうゆう関数なんでしょうか?

あなたのなさりたいとを私なりに解釈して函数化したものですが、i 番目の矩形と
q 番目の矩形とを対象にする検査です。i 番目の矩形と q 番目の矩形とが重なっていたら
この検査函数を呼び出して、(1) の矩形に対して(2) の矩形が適しているのか
(3) の矩形が適しているのか(4) の矩形が適しているのか、適切な矩形が見つからないのか
検査して結果を返す函数です(繰り返しになりましたが再度説明しました)
当然、i 番目か q 番目かまでの矩形と新しい矩形の候補とを比べて判定しなければならない
ので、矩形の集合である Doc ->mp もこの函数に渡さなければならないでしょう

>あとあと楽になるのはどうしてでしょうか
お判りにならないのなら別に気になさらないで下さい。あなたの考えを変えてしまおうという
意図は私にはないのです。私ならそうするという事でしかないのですから

wen 2003/02/11(火) 02:18:18
>   >    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;

のかわりにint CheckNewPos(const CArray& mp, int i, int q) をつかうってことですよ
ね?
どうゆう風に使ったらいいのか調べてるのですがちょっとわからなく困っています

2003/02/11(火) 09:29:35
戻り値が 1 なら (1)、2 なら (2)、3 なら (3)、4 なら (4)、-1 なら削除
と言う風にでも決めておけばよろしいかと思います
2003/02/11(火) 00:14:51 の回答の焼き直しですけれど、お役に立ちますか?

wen 2003/02/11(火) 16:50:46
CArray のデータはけせるのでしょうか
たとえば
CArray<CRect,CRect>p;として 100個のデータがはいってるとして
p[10]番目のデータを消すといったことはできるのでしょうか?

n [E-Mail] 2003/02/11(火) 17:40:07
MSDNの「CArray クラスメンバ」のとこの下の方に何かありますよ。

wen 2003/02/11(火) 19:32:23
CArray::RemoveAt ですね ありがとうございます

wen 2003/02/16(日) 12:57:36
CSize size;
size = pDC->GetTextExtent(aaa);

これをCArrayでCArray<CSize,CSize>size;としてやりたいのですが
どうすればできますか?

επιστημη 2003/02/16(日) 14:17:00
どうすれば...? なにがわからないのですか?

wen 2003/02/16(日) 14:31:44
>CSize size;
>size = pDC->GetTextExtent(aaa);
>
>これをCArrayでCArray<CSize,CSize>size;としてやりたいのですが
>どうすればできますか?

すいませんできました


プログラムを実行させたんですが文字を表示はできたんですがスクロールバーを
動かすと

Debug Assertion failed
program:場所
file:afxtempl.h
Line:262

For informaition on haw your program can 
cause an assetion failure,see the visualC++ 
decumentation on asserts

とエラーが出るのですがどういったエラーなんでしょうか?

wen 2003/02/17(月) 23:21:59
>プログラムを実行させたんですが文字を表示はできたんですがスクロールバーを
>動かすと
>
>Debug Assertion failed
>program:場所
>file:afxtempl.h
>Line:262
>
>For informaition on haw your program can 
>cause an assetion failure,see the visualC++ 
>decumentation on asserts

>とエラーが出るのですがどういったエラーなんでしょうか?

エラーはでなくなりました。


しかしスクロールバーを動かすと文字がいっぱいでてきて
おかしくなります。

2003/02/18(火) 00:21:50
SDI で作成しているアプリケーションとの事ですので CxxView で表示に関しては扱って
いる事と思いますが、 CxxView は CView 派生ですかそれとも CScrollView 派生ですか?

wen 2003/02/18(火) 01:11:38
CScrollViewでつくりました。

wen 2003/02/19(水) 00:08:47
CViewで同じプログラムを作成し実行させたところ
また同じ現象がでてしまいます
画面のサイズを変えるとテキストで表示した
同じものが再描画されてしまいます。

スマイル 2003/02/19(水) 09:35:13
void CMyView::OnSize(UINT nType, int cx, int cy) 
{
    CScrollView::OnSize(nType, cx, cy);
    
    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
    CWnd::Invalidate(TRUE);
}
void CMyView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{

    CWnd::Invalidate(TRUE);
}
OnRraw で領域をクリアーするとか

wen 2003/02/19(水) 12:48:36
>void CMyView::OnSize(UINT nType, int cx, int cy) 
>{
>    CScrollView::OnSize(nType, cx, cy);
>    
>    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
>    CWnd::Invalidate(TRUE);

初心者なんでわからないんですがこれは書くのですか
それともなにか追加で表示されるものなんですか?

スマイル 2003/02/19(水) 13:08:01
表示メニューのClassWizardからWM_SIZEを選びます。

wen 2003/02/19(水) 13:26:29
たびたびすいません クラスの追加ですか?

επιστημη 2003/02/19(水) 13:34:02
メッセージハンドラの追加です。

解決したら 2003/02/19(水) 13:45:28
向こうにも解決策をかいておいてくださいね

wen 2003/02/19(水) 13:48:30
>void CMyView::OnSize(UINT nType, int cx, int cy) 
>{
>    CScrollView::OnSize(nType, cx, cy);
>    
>    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
>    CWnd::Invalidate(TRUE);


できましたが同じ結果がでました。

n [E-Mail] 2003/02/19(水) 17:06:37
とりあえず、

 CArray<CRect,CRect&>& mp // 型はこれでいいのかな?
  = pDoc->mp;

という風に関数の最初の方に書く(pDoc->mpの「別名」or「参照」の導入)と、

> pDoc->mp[i]=CRect(pDoc->mp[i].left,pDoc->mp[i].top-pDoc->size2[i].cy, ...

の部分を

> mp[i]=CRect(mp[i].left,mp[i].top-size2.cy, ...

という風に「pDoc->」を省いて書けるので、多少読みやすくできます。
それからCRectにはOffsetRect()というメンバ関数があり、

 mp[i].OffsetRect( 0, -size.cy );

と書けばmp[i]をsize.cy分だけ上に移動できます。

wen 2003/02/22(土) 00:32:48
[[解決]]
皆様なんとかできました ありがとうございました。

古いスレッドには追加発言できません。