アプリ版:「スタンプのみでお礼する」機能のリリースについて

MFCのダイアログベースで 変化を表すグラフを作成したのですが
線を描くときに原点復帰してしまいます。

左上のエディットに数値をいれ 実行を押すと座標(200,200)から横にエディットで入力した数値分線を引いていくというものです。

Timerを使い1秒ごとに書かせています。

void CsinDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: ここにメッセージ ハンドラー コードを追加するか、既定の処理を呼び出します。
static int count=0;
static double i,x=0;
char buf[100];
CString str;
/*------描写設定----*/
CWnd* h = GetDlgItem(IDC_BB);
CDC* pDC=h->GetDC();
//-----------------------------------//
CEdit *edit = (CEdit*)GetDlgItem(IDC_EDIT1);
edit->GetWindowText(str);
i = atof((const char*)str);
x=x+i;
sprintf(buf,"%lf",x);
siki_edit.SetWindowText(buf);
/*---------------------------------------*/
if(count==0)
pDC->MoveTo(200,200); // 座標(200,200) に移動

pDC->LineTo(200+x,200); // 座標(200+x,200) まで線を引く


count++;

h->ReleaseDC(pDC);

CDialogEx::OnTimer(nIDEvent);
}

実行結果は添付した画像のようになります。
イメージではcountが0の時だけMoveToで動かし、それ以降は座標(200,200)から横に線を引いていきたいのですが。
どのように直せばよいのでしょうか?
LineToからLineToの指令ができないということでしょうか?

「LineTo,MoveToについて」の質問画像

A 回答 (3件)

> イメージではcountが0の時だけMoveToで動かし、それ以降は座標(200,200)から横に線を引いていきたいのですが。



ReleaseDC後もカレント座標が保持されていると考えるから、そのような処理にしたのでしょうが、そんなことは保障されていません。

また、OnTimerで描画すると、ダイアログの上に別のウィンドウが重なったりすると、表示が消えてしまいますよ。表示はOnPaintで行うべきです。表示に必要なデータの作成と再描画の指示だけをOnTimerで行いましょう。

そのほかにも、

> CEdit *edit = (CEdit*)GetDlgItem(IDC_EDIT1);
> edit->GetWindowText(str);

これはGetDlgItemText関数1つでできます。

> sprintf(buf,"%lf",x);

doubleの場合の書式は%fです。scanf系関数の場合は、floatとdoubleの違いを示すためにlが必要ですが、printf系関数では、引数にfloatを渡してもdoubleに変換されるので、どちらも%fです。
    • good
    • 0

毎回 MoveTo する.

    • good
    • 0

単に


デバイスコンテキストごとに参照点がある
ってだけじゃない?

この回答への補足

初心者なのでどのように直せばよいか教えていただけると助かります。

補足日時:2013/09/08 00:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!