- やりたいこと
タイマー関数を用いて丸(円)が大きくなったり小さくなったりアニメーションのようなプログラムの作成。
- 理想のプログラムの大まかな流れ
0. ファイル(円の直径のデータが一行ずつ5000個入っている)を選択して、データを読み込み、一行ずつs[0]~s[4999]の配列に入れる。
0. タイマー関数を用い、一定時間ごとにk++(初期値k=0)を施し、WM_PAINT内でellipse関数を用い、そこにs[k]のデータを入れて、s[0]からs[4999]で順に描画していく。
0. マウスの左ボタンを押すと、タイマーが停止し、メッセージボックスが表示される。そこには、現在のデータが何番目かを表示(kの値)させる。
0. マウスの右ボタンを押すと、再びタイマーが作動し、続きから描画されていく。
- 問題点
プログラムはビルドでき、実行したところ、パッと見た感じでは円が大きくなったり小さくなったりして成功したように見える。左クリックで現在のデータの番号が表示されて、右クリックで再び続きのデータを描画が開始された。しかし、タイマーの間隔を1sや2sにして、データ一つひとつに対して見てみると、一個目の円が描画されたときのkの値が25、二個目の円のときは50など、kが0から1ずつ増えていかず、とびとびの値になる。
- 試してみたこと
WM_PAINT内で、ellipse()を書いたあとにメッセージボックスを加えて、kの値を表示するようにした。すると、実行した瞬間(ファイルを選択し、データを読み込む前から)画面に次々にメッセージボックスが出てきてkの値が大きくなっていった。データの読み込みが完了してからタイマーを作動さればよい、、、、?けどどうしたらよいかわからない。
以下は、ウィンドウプロシージャのswitch内のコードです。ファイルの選択、読み込みなどは別のソースファイルで行っています。
switch (msg) { case WM_CREATE: SetTimer(hWnd_2, ID_MYTIMER, 1000, NULL); break; case WM_PAINT: hdc = BeginPaint(hWnd2, &ps); hPen_MOON = CreatePen(PS_DOT, 0, RGB(255, 255, 0)); h01dPen_MOON = (HPEN)SelectObject(hdc, hPen_MOON); hBrush_MOON = CreateSolidBrush(RGB(255, 255, 0)); h01dBrush_MOON = (HBRUSH)SelectObject(hdc, hBrush_MOON); Ellipse(hdc, 329.5-(s[k]*1000000/4*329.5+0.5), 247-(s[k]*1000000/4*329.5+0.5), 329.5+(s[k]*1000000/4*329.5+0.5), 247+(s[k]*1000000/4*329.5+0.5)); //円をEllipse()を用いて描画 DeleteObject(hPen_MOON); SelectObject(hdc, h01dPen_MOON); SelectObject(hdc, hBrush_MOON); SelectObject(hdc, h01dBrush_MOON); DeleteObject(hBrush_MOON); EndPaint(hWnd2, &ps); break; case WM_TIMER: if (wp != ID_MYTIMER) return (DefWindowProc(hWnd_bitmap, msg, wp, lp)); ++k; if (++k > total_n) k = total_n - 1; InvalidateRect(hWnd_bitmap, NULL, FALSE); break; case WM_LBUTTONDOWN: KillTimer(hWnd2, 1); sprintf_s(szBuf, 256, "%d番目のデータ",k); MessageBox(NULL, szBuf, "データの番号", MB_OK); break; case WM_RBUTTONDOWN: SendMessage(hWnd2, WM_CREATE, 0,0); break; case WM_DESTROY: if( k = NULL){ KillTimer(hWnd2, ID_MYTIMER); } PostQuitMessage(0); break; default: return (DefWindowProc(hWnd2, msg, wp, lp)); }
回答3件
あなたの回答
tips
プレビュー