質問編集履歴

4

コードを修正しました

2018/02/24 08:41

投稿

TRON1216.
TRON1216.

スコア37

test CHANGED
File without changes
test CHANGED
@@ -36,7 +36,7 @@
36
36
 
37
37
  case WM_CREATE:
38
38
 
39
- SetTimer(hWnd_bitmap, ID_MYTIMER, 1000, NULL);
39
+ SetTimer(hWnd_2, ID_MYTIMER, 1000, NULL);
40
40
 
41
41
  break;
42
42
 
@@ -82,7 +82,7 @@
82
82
 
83
83
  EndPaint(hWnd2, &ps);
84
84
 
85
- ReleaseDC( hWnd2, hdc );
85
+
86
86
 
87
87
  break;
88
88
 

3

コードを修正しました

2018/02/24 08:41

投稿

TRON1216.
TRON1216.

スコア37

test CHANGED
File without changes
test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
   
28
28
 
29
-
29
+ ```ここに言語を入力
30
30
 
31
31
  switch (msg) {
32
32
 
@@ -156,6 +156,4 @@
156
156
 
157
157
  }
158
158
 
159
-
160
-
161
159
  ```

2

要点をまとめてわかりやすくシンプルにしました。

2018/02/24 08:19

投稿

TRON1216.
TRON1216.

スコア37

test CHANGED
@@ -1 +1 @@
1
- タイマ関数を使って1番目のデタから最後までアニメーションように図形を描画が、とびとびで描画されてしまう
1
+ タイマーの割り込み処理が正く行われない。
test CHANGED
@@ -1,4 +1,32 @@
1
- 様々な大きさの円の直径の値が、s[0]~s[5000](s[k]、kの初期値0)までの中に入っています。そして、タイマー関数を使い、インターバルごとにk+=1;をしてs[k]をs[0]からs[5000]を用いて順に円をアニメーションのように描画していきたいと考えています。ですがいざ作ってみて、インターバルを1秒2秒と遅く設定してみてみると、一番目に描かれる円がs[1]ではなく、s[25]の円とな、インターバルをはさんで次に描かれる円が、こんどはs[37]など、とびとびで描画されてまいます。s[0]からs[5000]まで順に描画するには、どうすればよいでしょうか?WM_PAINTの中でメッセージボックスをつくり、kの値を表示させようとしたとろ、直径のデータが入ったファイル選択途中にもかかわらず次々にメッセージボックスが出てきてkの値が大きくなっており、ファイルを選択してデータの読み込みが完了してからからkの値が1ずつ増えていくようにしたいです。ですがどうすればそうできるかいまのころわからないです。```
1
+ - やりいこと
2
+
3
+  タイマー関数を用いて丸(円)が大きくなったり小さくなったりアニメーションのようなプログラムの作成。
4
+
5
+ - 理想のプログラムの大まかな流れ
6
+
7
+  0. ファイル(円の直径のデータが一行ずつ5000個入っている)を選択して、データを読み込み、一行ずつs[0]~s[4999]の配列に入れる。
8
+
9
+  0. タイマー関数を用い、一定時間ごとにk++(初期値k=0)を施し、WM_PAINT内でellipse関数を用い、そこにs[k]のデータを入れて、s[0]からs[4999]で順に描画していく。
10
+
11
+  0. マウスの左ボタンを押すと、タイマーが停止し、メッセージボックスが表示される。そこには、現在のデータが何番目かを表示(kの値)させる。
12
+
13
+  0. マウスの右ボタンを押すと、再びタイマーが作動し、続きから描画されていく。
14
+
15
+ - 問題点
16
+
17
+  プログラムはビルドでき、実行したところ、パッと見た感じでは円が大きくなったり小さくなったりして成功したように見える。左クリックで現在のデータの番号が表示されて、右クリックで再び続きのデータを描画が開始された。しかし、タイマーの間隔を1sや2sにして、データ一つひとつに対して見てみると、一個目の円が描画されたときのkの値が25、二個目の円のときは50など、kが0から1ずつ増えていかず、とびとびの値になる。
18
+
19
+ - 試してみたこと
20
+
21
+  WM_PAINT内で、ellipse()を書いたあとにメッセージボックスを加えて、kの値を表示するようにした。すると、実行した瞬間(ファイルを選択し、データを読み込む前から)画面に次々にメッセージボックスが出てきてkの値が大きくなっていった。データの読み込みが完了してからタイマーを作動さればよい、、、、?けどどうしたらよいかわからない。
22
+
23
+
24
+
25
+ 以下は、ウィンドウプロシージャのswitch内のコードです。ファイルの選択、読み込みなどは別のソースファイルで行っています。
26
+
27
+  
28
+
29
+
2
30
 
3
31
  switch (msg) {
4
32
 
@@ -6,55 +34,29 @@
6
34
 
7
35
 
8
36
 
9
- case WM_CREATE: //ウインドウが生成されたときに1度だけ通過
37
+ case WM_CREATE:
10
38
 
11
- //時間割り込みの発生タイミングを設定
12
-
13
-
14
-
15
- SetTimer(hWnd_bitmap, ID_MYTIMER, 1000, NULL);
39
+ SetTimer(hWnd_bitmap, ID_MYTIMER, 1000, NULL);
16
-
17
-
18
40
 
19
41
  break;
20
42
 
21
43
 
22
44
 
23
-     case WM_PAINT:
45
+      case WM_PAINT:
24
46
 
25
- g_img.bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
47
+ hdc = BeginPaint(hWnd2, &ps);
26
48
 
27
- g_img.bmi.bmiHeader.biWidth = 659/*674*/;
49
+ hPen_MOON = CreatePen(PS_DOT, 0, RGB(255, 255, 0));
28
50
 
29
- g_img.bmi.bmiHeader.biHeight = -494/*532*/;
51
+ h01dPen_MOON = (HPEN)SelectObject(hdc, hPen_MOON);
30
52
 
31
- g_img.bmi.bmiHeader.biPlanes = 1;
53
+ hBrush_MOON = CreateSolidBrush(RGB(255, 255, 0));
32
54
 
33
- g_img.bmi.bmiHeader.biBitCount = 32;
34
-
35
- g_img.bmi.bmiHeader.biCompression = BI_RGB;
55
+ h01dBrush_MOON = (HBRUSH)SelectObject(hdc, hBrush_MOON);
36
-
37
- g_img.bmi.bmiHeader.biSizeImage = 659/*674*/ * 494/*532*/ * 4;
38
-
39
- g_img.bmi.bmiHeader.biXPelsPerMeter = 3704;
40
-
41
- g_img.bmi.bmiHeader.biYPelsPerMeter = 3704;
42
-
43
- g_img.bmi.bmiHeader.biClrUsed = 0;
44
-
45
- g_img.bmi.bmiHeader.biClrImportant = 0;
46
56
 
47
57
 
48
58
 
49
- g_img.lpBmpData = (BYTE *)malloc(659/*674*/ * 494/*532*/ * 4);
59
+ 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()を用いて描画
50
-
51
-
52
-
53
- q = 0;
54
-
55
- p = 0;
56
-
57
- ok = 0;
58
60
 
59
61
 
60
62
 
@@ -62,309 +64,37 @@
62
64
 
63
65
 
64
66
 
65
- hdc = BeginPaint(hWnd_bitmap, &ps);
66
67
 
68
+
69
+ DeleteObject(hPen_MOON);
70
+
67
- hdc_mem = CreateCompatibleDC( hdc );
71
+ SelectObject(hdc, h01dPen_MOON);
72
+
73
+ SelectObject(hdc, hBrush_MOON);
74
+
75
+ SelectObject(hdc, h01dBrush_MOON);
76
+
77
+ DeleteObject(hBrush_MOON);
78
+
79
+
68
80
 
69
81
 
70
82
 
71
-
83
+ EndPaint(hWnd2, &ps);
72
84
 
73
-
74
-
75
- for ( a = 0; a < 494/*532*/; a++){
76
-
77
- for( b = 0; b < 659/*674*/; b++){
78
-
79
- ab = a*(659/*674*/*4) + b*4; //始めの項が行数、次の項が左から何ビット目かを表す。(blueの位置を決めている)
80
-
81
-
82
-
83
- if((b-329.5)*(b-329.5)+(a-494)*(a-494) <= (s[k]/4*1000000*329.5+0.5)*(s[k]/4*1000000*329.5+0.5)){
84
-
85
-
86
-
87
- x = b-329.5;
88
-
89
- y = 494-a;
90
-
91
- z = sqrtf(-(x*x)-(y*y)+(s[k]/4*1000000*329.5+0.5)*(s[k]/4*1000000*329.5+0.5));
92
-
93
- r = sqrtf(x*x + y*y + z*z);
94
-
95
-
96
-
97
-
98
-
99
- lam1 = (x*XSUNm_3[k] + y*YSUNm_3[k] + z*ZSUNm_3[k])/(r*SUN_MOON[k]); //太陽の方向との内積
100
-
101
- lam2 = (x*XEARTHm_3[k] + y*YEARTHm_3[k] + z*ZEARTHm_3[k])/(r*EARTH_MOON[k]); //地球の方向との内積
102
-
103
- lam3 = (x*XEQLm_3[k] + y*YEQLm_3[k] + z*ZEQLm_3[k])/(r*EQL_MOON[k]); //EQLの方向との内積
104
-
105
-
106
-
107
- /*g_img.lpBmpData[ab] = 179*lam3;
108
-
109
- g_img.lpBmpData[ab+1] = 179*lam3;
110
-
111
- g_img.lpBmpData[ab+2] = 179*lam3;
112
-
113
- g_img.lpBmpData[ab+3] = 0;*/
114
-
115
-
116
-
117
-
118
-
119
-
120
-
121
- if(lam2>0){
122
-
123
- g_img.lpBmpData[ab] = 30/*230**lam2*/;
124
-
125
- g_img.lpBmpData[ab+1] = 20/*216*lam2*/;
126
-
127
- g_img.lpBmpData[ab+2] = 0;
128
-
129
- g_img.lpBmpData[ab+3] = 0;
130
-
131
-
132
-
133
- }
134
-
135
-
136
-
137
- if(lam1>0){
138
-
139
- g_img.lpBmpData[ab] = 0;
140
-
141
- g_img.lpBmpData[ab+1] = 100/*255*lam1*/;
142
-
143
- g_img.lpBmpData[ab+2] = 100/*255*lam1*/;
144
-
145
- g_img.lpBmpData[ab+3] = 0;
146
-
147
- }
148
-
149
-
150
-
151
- if(!(lam1>=0 || lam2>=0) ){
152
-
153
- g_img.lpBmpData[ab] = 179*lam3;
154
-
155
- g_img.lpBmpData[ab+1] = 179*lam3;
156
-
157
- g_img.lpBmpData[ab+2] = 179*lam3;
158
-
159
- g_img.lpBmpData[ab+3] = 0;
160
-
161
-
162
-
163
- q = q+1;
164
-
165
- }
166
-
167
- p = p + 1; //円の内側のピクセル数の合計
168
-
169
- /*if (494 < (s[k] / 4 * 1000000 * 329.5 + 0.5)) {
170
-
171
- ok[k] = q * 100 / 325546;
172
-
173
- if (ok[k] >= 10) N1_10 = N1_10 + 1;
174
-
175
- if (ok[k] >= 20) N1_20 = N1_20 + 1;
176
-
177
- if (ok[k] >= 30) N1_30 = N1_30 + 1;
178
-
179
- if (ok[k] >= 40) N1_40 = N1_40 + 1;
180
-
181
- if (ok[k] >= 50) N1_50 = N1_50 + 1;
182
-
183
- if (ok[k] >= 60) N1_60 = N1_60 + 1;
184
-
185
- if (ok[k] >= 70) N1_70 = N1_70 + 1;
186
-
187
- if (ok[k] >= 80) N1_80 = N1_80 + 1;
188
-
189
- if (ok[k] >= 90) N1_90 = N1_90 + 1;
190
-
191
- }
192
-
193
-
194
-
195
- if (494 >= (s[k] / 4 * 1000000 * 329.5 + 0.5)) {
196
-
197
- ok[k] = q * 100 / p;
198
-
199
- if (ok[k] >= 10) N2_10 = N2_10 + 1;
200
-
201
- if (ok[k] >= 20) N2_20 = N2_20 + 1;
202
-
203
- if (ok[k] >= 30) N2_30 = N2_30 + 1;
204
-
205
- if (ok[k] >= 40) N2_40 = N2_40 + 1;
206
-
207
- if (ok[k] >= 50) N2_50 = N2_50 + 1;
208
-
209
- if (ok[k] >= 60) N2_60 = N2_60 + 1;
210
-
211
- if (ok[k] >= 70) N2_70 = N2_70 + 1;
212
-
213
- if (ok[k] >= 80) N2_80 = N2_80 + 1;
214
-
215
- if (ok[k] >= 90) N2_90 = N2_90 + 1;
216
-
217
- }*/
218
-
219
-
220
-
221
- }
222
-
223
-
224
-
225
- // else{
226
-
227
- if((b-329.5)*(b-329.5)+(a-494)*(a-494) > (s[k]/4*1000000*329.5+0.5)*(s[k]/4*1000000*329.5+0.5)){
228
-
229
- g_img.lpBmpData[ab] = 0;
230
-
231
- g_img.lpBmpData[ab+1] = 0;
232
-
233
- g_img.lpBmpData[ab+2] = 0;
234
-
235
- g_img.lpBmpData[ab+3] = 0;
236
-
237
- }
238
-
239
-
240
-
241
-
242
-
243
- }
244
-
245
-
246
-
247
- }
248
-
249
- if (494 < (s[k] / 4 * 1000000 * 329.5 + 0.5)) {
250
-
251
- ok = (q * 100) / 325546;
252
-
253
- if (ok >= 0) N1_0 = N1_0 + 1;
254
-
255
- if (ok >= 10) N1_10 = N1_10 + 1;
256
-
257
- if (ok >= 20) N1_20 = N1_20 + 1;
258
-
259
- if (ok >= 30) N1_30 = N1_30 + 1;
260
-
261
- if (ok >= 40) N1_40 = N1_40 + 1;
262
-
263
- if (ok >= 50) N1_50 = N1_50 + 1;
264
-
265
- if (ok >= 60) N1_60 = N1_60 + 1;
266
-
267
- if (ok >= 70) N1_70 = N1_70 + 1;
268
-
269
- if (ok >= 80) N1_80 = N1_80 + 1;
270
-
271
- if (ok >= 90) N1_90 = N1_90 + 1;
272
-
273
- }
274
-
275
-
276
-
277
- if (494 >= (s[k] / 4 * 1000000 * 329.5 + 0.5)) {
278
-
279
- ok = (q*100)/p;
280
-
281
- if (ok >= 0) N2_0 = N2_0 + 1;
282
-
283
- if (ok >= 10) N2_10 = N2_10 + 1;
284
-
285
- if (ok >= 20) N2_20 = N2_20 + 1;
286
-
287
- if (ok >= 30) N2_30 = N2_30 + 1;
288
-
289
- if (ok >= 40) N2_40 = N2_40 + 1;
290
-
291
- if (ok >= 50) N2_50 = N2_50 + 1;
292
-
293
- if (ok >= 60) N2_60 = N2_60 + 1;
294
-
295
- if (ok >= 70) N2_70 = N2_70 + 1;
296
-
297
- if (ok >= 80) N2_80 = N2_80 + 1;
298
-
299
- if (ok >= 90) N2_90 = N2_90 + 1;
300
-
301
- }
302
-
303
-
304
-
305
- hBmp = CreateDIBitmap(hdc, &(g_img.bmi.bmiHeader), CBM_INIT, g_img.lpBmpData, &(g_img.bmi), DIB_RGB_COLORS);
306
-
307
- free(g_img.lpBmpData);
308
-
309
- SelectObject(hdc_mem, hBmp);
310
-
311
- SetStretchBltMode(hdc, COLORONCOLOR);
312
-
313
- StretchBlt(hdc, 0, 0, 659/*674*/, 494/*532*/, hdc_mem, 0, 0, 659/*674*/, 494/*532*/, SRCCOPY);
314
-
315
- DeleteDC( hdc );
316
-
317
- DeleteDC( hdc_mem );
318
-
319
- DeleteObject( hBmp );
320
-
321
- EndPaint(hWnd_bitmap, &ps);
322
-
323
- ReleaseDC( hWnd_bitmap, hdc );
85
+ ReleaseDC( hWnd2, hdc );
324
-
325
-
326
-
327
-
328
-
329
-
330
-
331
- //sprintf_s(szBuf, 256, "%d個", k);
332
-
333
- //MessageBox(NULL, szBuf, TEXT("データ数"), MB_OK);
334
-
335
-
336
-
337
-
338
-
339
-
340
-
341
-
342
-
343
-
344
-
345
-
346
-
347
-
348
-
349
- //InvalidateRect(hWnd_bitmap, NULL, TRUE);
350
-
351
-
352
-
353
- //ReleaseDC( hWnd_bitmap, hdc ); // 画面のデバイスコンテキストhdcを破棄する
354
-
355
- //}
356
86
 
357
87
  break;
358
88
 
359
89
 
360
90
 
361
- case WM_TIMER:
91
+      case WM_TIMER:
362
92
 
363
93
  if (wp != ID_MYTIMER)
364
94
 
365
95
  return (DefWindowProc(hWnd_bitmap, msg, wp, lp));
366
96
 
367
- k += 1;
97
+ ++k;
368
98
 
369
99
  if (++k > total_n)
370
100
 
@@ -372,79 +102,41 @@
372
102
 
373
103
  InvalidateRect(hWnd_bitmap, NULL, FALSE);
374
104
 
375
- free(g_img.lpBmpData);
376
-
377
- break;
105
+ break;
378
106
 
379
107
 
380
108
 
381
109
  case WM_LBUTTONDOWN:
382
110
 
383
- KillTimer(hWnd_bitmap, 1);
111
+ KillTimer(hWnd2, 1);
384
112
 
385
- KillTimer(hWnd5, 1);
113
+ sprintf_s(szBuf, 256, "%d番目のデータ",k);
386
114
 
387
- KillTimer(hWnd4, 1);
115
+ MessageBox(NULL, szBuf, "データの番号", MB_OK);
388
116
 
389
- KillTimer(hWnd3, 1);
390
-
391
- free(g_img.lpBmpData);
392
-
393
- //KillTimer(hWnd2, 1);
394
-
395
- sprintf_s(szBuf, 256, "月面高度%12.2fkm\n観測領域のピクセル数%d個\n観測領域%12.2f%\n太陽離角%12.2f度\n地球離角%12.2f度\nEQUULEUSの速さ%12.2fkm/s\n月の速さ%12.2fkm/s\n%d番目のデータ\n月の内側のピクセル数p %12.2f個",EQL_MOON[k]-1737,q,ok,deg1[k],deg2[k],VEQL[k],VMOON[k],k,p);
396
-
397
- MessageBox(NULL, szBuf, "観測情報", MB_OK);
398
-
399
- //if (k = total_n - 1) {
400
-
401
- sprintf_s(szBuf, 256, "視野1での観測領域の累積個数%d個 %d個 %d個 %d個 %d個 %d個 %d個 %d個 %d個 %d個\n視野2での観測領域の累積個数%d個 %d個 %d個 %d個 %d個 %d個 %d個 %d個 %d個 %d個", N1_0,N1_10, N1_20, N1_30, N1_40, N1_50, N1_60, N1_70, N1_80, N1_90,N2_0, N2_10, N2_20, N2_30, N2_40, N2_50, N2_60, N2_70, N2_80, N2_90);
402
-
403
- MessageBox(NULL, szBuf, "観測領域検討", MB_OK);
404
-
405
- //}
406
-
407
-
408
-
409
- break;
117
+ break;
410
118
 
411
119
 
412
120
 
413
121
  case WM_RBUTTONDOWN:
414
122
 
415
- SendMessage(hWnd_bitmap, WM_CREATE, 0,0);
416
-
417
- SendMessage(hWnd5, WM_CREATE, 0,0);
123
+ SendMessage(hWnd2, WM_CREATE, 0,0);
418
-
419
- SendMessage(hWnd4, WM_CREATE, 0,0);
420
-
421
- SendMessage(hWnd3, WM_CREATE, 0,0);
422
-
423
- free(g_img.lpBmpData);
424
124
 
425
125
  break;
426
126
 
127
+
427
128
 
428
129
 
429
- case WM_MOVE:
430
-
431
- free(g_img.lpBmpData);
432
-
433
- break;
434
-
435
-
436
130
 
437
131
  case WM_DESTROY:
438
132
 
439
133
  if( k = NULL){
440
134
 
441
- KillTimer(hWnd_bitmap, ID_MYTIMER);
135
+ KillTimer(hWnd2, ID_MYTIMER);
442
136
 
443
137
  }
444
138
 
445
139
  PostQuitMessage(0);
446
-
447
- free(g_img.lpBmpData);
448
140
 
449
141
  break;
450
142
 
@@ -454,7 +146,7 @@
454
146
 
455
147
  default:
456
148
 
457
- return (DefWindowProc(hWnd_bitmap, msg, wp, lp));
149
+ return (DefWindowProc(hWnd2, msg, wp, lp));
458
150
 
459
151
 
460
152
 
@@ -464,14 +156,6 @@
464
156
 
465
157
  }
466
158
 
467
- return 0;
159
+
468
-
469
-
470
-
471
- }
472
-
473
-
474
-
475
-
476
160
 
477
161
  ```

1

具体的な説明を加えました

2018/02/24 07:32

投稿

TRON1216.
TRON1216.

スコア37

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- 様々な大きさの円の直径の値が、s[0]~s[5000](s[k]、kの初期値0)までの中に入っています。そして、タイマー関数を使い、インターバルごとにk+=1;をしてs[k]をs[0]からs[5000]を用いて順に円をアニメーションのように描画していきたいと考えています。ですがいざ作ってみて、インターバルを1秒や2秒と遅く設定してみてみると、一番目に描かれる円がs[1]ではなく、s[25]の円となり、インターバルをはさんで次に描かれる円が、こんどはs[37]など、とびとびで描画されていまいます。s[0]からs[5000]まで順に描画するには、どうすればよいでしょうか?```
1
+ 様々な大きさの円の直径の値が、s[0]~s[5000](s[k]、kの初期値0)までの中に入っています。そして、タイマー関数を使い、インターバルごとにk+=1;をしてs[k]をs[0]からs[5000]を用いて順に円をアニメーションのように描画していきたいと考えています。ですがいざ作ってみて、インターバルを1秒や2秒と遅く設定してみてみると、一番目に描かれる円がs[1]ではなく、s[25]の円となり、インターバルをはさんで次に描かれる円が、こんどはs[37]など、とびとびで描画されていまいます。s[0]からs[5000]まで順に描画するには、どうすればよいでしょうか?WM_PAINTの中でメッセージボックスをつくり、kの値を表示させようとしたところ、直径のデータが入ったファイル選択途中にもかかわらず次々にメッセージボックスが出てきてkの値が大きくなっており、ファイルを選択してデータの読み込みが完了してからからkの値が1ずつ増えていくようにしたいです。ですがどうすればそうできるかいまのところわからないです。```
2
2
 
3
3
  switch (msg) {
4
4