- ベストアンサー
MFC
MFCでグラフを描いてそのx軸とy軸にメモリを入れたいのですが プログラムでどう書けばいいか教えてください。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
だから、うまくいかないのならそのときのコードを示してください。 前回のコードでは、"y"と表示するようになっているので、あなたがその部分をどのように変更して数字を表示するようにしたかは、あなたしかわかりません。また、軸にどんな数字が表示されれば正解なのかも、こちらではわかりません。 CStringのFormatを使っているのなら、そこで与えているデータにiを含む数式を使っているはずなので、 ・iが0のときにどんな数字が表示されればいいのか ・iが増えたとしたら、表示する数字は減るのか増えるのか を考えれば、Formatに与える数式が分かるはずです。
その他の回答 (6)
- m-take0220
- ベストアンサー率60% (477/782)
>for(i=0;i<400;i+=50){ >pDC->MoveTo(50,60+i); >pDC->LineTo(60,60+i); >pDC->TextOut(30,50+i,"y"); >} この部分のことですか? ループを逆順にするか、y座標の計算を逆にするかですね。 ループを逆にするなら、 for(i=350;0<=i;i-=50) でしょうか。 y座標の計算を逆にするなら、iの最大値は350で、そのときのy座標が410なので、 pDC->MoveTo(50,410-i); pDC->LineTo(50,410-i); でしょうか。
- m-take0220
- ベストアンサー率60% (477/782)
> str.Format("%d",10); strの内容を変更している部分が、for文の外にあるのですから、何回繰り返したところで内容が変わるはずがありません。
補足
ありがとうございます。基本的な間違いでした。 y軸のことに関してなのですがこのままでやると 上から下に数字が打たれていくと思うのですが それを逆転させる方法などありますかね
- zwi
- ベストアンサー率56% (730/1282)
こっちを放置しないで下さい。 http://okwave.jp/qa/q7576661.html ちゃんとC++を勉強したほうが良いと思いますね。 基礎的なことがちゃんと出来ていません。
- m-take0220
- ベストアンサー率60% (477/782)
> 変換した数値をfor文を使って増やせなくて困っています 「困っています」とだけ書かれても、原因は突き止められませんよ。 どんな結果がほしいときに、どんなコードを書いて、どううまくいかないのかを説明しないと。 よくある間違い例というのは確かにあるので、推測で間違いの内容を指摘できることもあるけど、あなたが実際にどう間違ったコードを書いているのかは、コードを見ないとわかりません。
補足
こんな感じです、どう修正すればいいですかね // TODO: この場所にネイティブ データ用の描画コードを追加します。 int x0=50, y0=450, xsp=700, ysp=400, xp, yp ; // float xmax, ymax; int DataN=pDoc->DN, i; pDC->SetTextColor(RGB(0,0,255)); pDC->TextOut(0,0,"グラフ表示"); CPen pc1(PS_SOLID,1,RGB(0,0,0)); CPen pc2(PS_SOLID,2,RGB(0,0,0)); CPen* OldPen=pDC->SelectObject(&pc1); CString str; str.Format("%d",10); if(DataN!=0){ pDC->SelectObject(pc2); pDC->MoveTo(x0,y0); pDC->LineTo(x0+xsp,y0); pDC->MoveTo(x0,y0); pDC->LineTo(x0 ,y0-ysp); for(i=0;i<650;i+=50){ pDC->MoveTo(100+i,440); pDC->LineTo(100+i,450); pDC->SetTextColor(RGB(0,0,0)); pDC->TextOut(100+i,460,str); } for(i=0;i<400;i+=50){ pDC->MoveTo(50,60+i); pDC->LineTo(60,60+i); pDC->TextOut(30,50+i,"y"); } for(i=0;i<=DataN;i++){ xp=(int)(x0+pDoc->Dx[i]/100.0*xsp); yp=(int)(y0-pDoc->Dy[i]/100.0*ysp); if(i==0) pDC->MoveTo(xp,yp); else pDC->LineTo(xp,yp); } } pDC->SelectObject(OldPen); }
- kmee
- ベストアンサー率55% (1857/3366)
数値を文字列に変換すればいいのです。 MFCのCStringクラスを使った方法もありますが、C/C++の標準関数を使った基本的な方法もあります。 サンプルだけじゃなくて、マニュアルとかも読みましょうよ。 やはり、C++の基本くらいはちゃんと勉強してからにしませんか?
補足
数値を文字列に変換するところまではCString strとstr.Formatを使ってできているのですが、変換した数値をfor文を使って増やせなくて困っています
- kmee
- ベストアンサー率55% (1857/3366)
MoveToで始点へ移動、LineToで終点まで線を書く。 横線は (Xの端,y)-(Xの反対の端,y)で、yを適当に変える 縦線は (x,Yの端)-(x,Yの反対の端)で、xを適当に変える 目盛線を入れるのに、やることはこれだけです。 文字も書きたいのなら、TextOutを使います。 実際の使用例がそのサンプルコードに出てます。 この説明でわからないようなら、まことに申し訳ありませんが、MFCを使うのはやめて別な手段を考えるた方が早いです(Excelのマクロの使い方とか)。 あるいは、プログラミングやC++言語そのものを勉強して基礎を身に付けてから、改めてMFCに挑戦することをお勧めします。
お礼
ちゃんとできました、ありがとうございました
補足
TextOutで数字を連続的に表示させる場合はどうすればいいですか?
お礼
上に書くのをわすれたので y座標の計算を逆にすれば軸は反転したのですが 数字はそのままの状態になっています 数字を反転する方法はないですか?
補足
ループを逆順にしてもy座標の計算を逆にしてもうまく表示されないのですが