teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

コードを修正しました

2018/02/24 08:41

投稿

TRON1216.
TRON1216.

スコア37

title CHANGED
File without changes
body CHANGED
@@ -17,7 +17,7 @@
17
17
 
18
18
 
19
19
  case WM_CREATE:
20
- SetTimer(hWnd_bitmap, ID_MYTIMER, 1000, NULL);
20
+ SetTimer(hWnd_2, ID_MYTIMER, 1000, NULL);
21
21
  break;
22
22
 
23
23
       case WM_PAINT:
@@ -40,7 +40,7 @@
40
40
 
41
41
 
42
42
  EndPaint(hWnd2, &ps);
43
- ReleaseDC( hWnd2, hdc );
43
+
44
44
  break;
45
45
 
46
46
       case WM_TIMER:

3

コードを修正しました

2018/02/24 08:41

投稿

TRON1216.
TRON1216.

スコア37

title CHANGED
File without changes
body CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
  以下は、ウィンドウプロシージャのswitch内のコードです。ファイルの選択、読み込みなどは別のソースファイルで行っています。
14
14
   
15
-
15
+ ```ここに言語を入力
16
16
  switch (msg) {
17
17
 
18
18
 
@@ -77,5 +77,4 @@
77
77
 
78
78
 
79
79
  }
80
-
81
80
  ```

2

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

2018/02/24 08:19

投稿

TRON1216.
TRON1216.

スコア37

title CHANGED
@@ -1,1 +1,1 @@
1
- タイマ関数を使って1番目のデタから最後までアニメーションように図形を描画したい、とびとびで描画されてまう
1
+ タイマーの割り込み処理く行われない
body CHANGED
@@ -1,239 +1,81 @@
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
+  0. ファイル(円の直径のデータが一行ずつ5000個入っている)を選択して、データを読み込み、一行ずつs[0]~s[4999]の配列に入れる。
5
+  0. タイマー関数を用い、一定時間ごとにk++(初期値k=0)を施し、WM_PAINT内でellipse関数を用い、そこにs[k]のデータを入れて、s[0]からs[4999]で順に描画していく。
6
+  0. マウスの左ボタンを押すと、タイマーが停止し、メッセージボックスが表示される。そこには、現在のデータが何番目かを表示(kの値)させる。
7
+  0. マウスの右ボタンを押すと、再びタイマーが作動し、続きから描画されていく。
8
+ - 問題点
9
+  プログラムはビルドでき、実行したところ、パッと見た感じでは円が大きくなったり小さくなったりして成功したように見える。左クリックで現在のデータの番号が表示されて、右クリックで再び続きのデータを描画が開始された。しかし、タイマーの間隔を1sや2sにして、データ一つひとつに対して見てみると、一個目の円が描画されたときのkの値が25、二個目の円のときは50など、kが0から1ずつ増えていかず、とびとびの値になる。
10
+ - 試してみたこと
11
+  WM_PAINT内で、ellipse()を書いたあとにメッセージボックスを加えて、kの値を表示するようにした。すると、実行した瞬間(ファイルを選択し、データを読み込む前から)画面に次々にメッセージボックスが出てきてkの値が大きくなっていった。データの読み込みが完了してからタイマーを作動さればよい、、、、?けどどうしたらよいかわからない。
12
+
13
+ 以下は、ウィンドウプロシージャのswitch内のコードです。ファイルの選択、読み込みなどは別のソースファイルで行っています。
14
+  
15
+
2
16
  switch (msg) {
3
17
 
4
18
 
5
- case WM_CREATE: //ウインドウが生成されたときに1度だけ通過
19
+ case WM_CREATE:
6
- //時間割り込みの発生タイミングを設定
7
-
8
- SetTimer(hWnd_bitmap, ID_MYTIMER, 1000, NULL);
20
+ SetTimer(hWnd_bitmap, ID_MYTIMER, 1000, NULL);
9
-
10
21
  break;
11
22
 
12
-     case WM_PAINT:
23
+      case WM_PAINT:
13
- g_img.bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
14
- g_img.bmi.bmiHeader.biWidth = 659/*674*/;
24
+ hdc = BeginPaint(hWnd2, &ps);
15
- g_img.bmi.bmiHeader.biHeight = -494/*532*/;
25
+ hPen_MOON = CreatePen(PS_DOT, 0, RGB(255, 255, 0));
16
- g_img.bmi.bmiHeader.biPlanes = 1;
17
- g_img.bmi.bmiHeader.biBitCount = 32;
18
- g_img.bmi.bmiHeader.biCompression = BI_RGB;
26
+ h01dPen_MOON = (HPEN)SelectObject(hdc, hPen_MOON);
19
- g_img.bmi.bmiHeader.biSizeImage = 659/*674*/ * 494/*532*/ * 4;
20
- g_img.bmi.bmiHeader.biXPelsPerMeter = 3704;
27
+ hBrush_MOON = CreateSolidBrush(RGB(255, 255, 0));
21
- g_img.bmi.bmiHeader.biYPelsPerMeter = 3704;
28
+ h01dBrush_MOON = (HBRUSH)SelectObject(hdc, hBrush_MOON);
22
- g_img.bmi.bmiHeader.biClrUsed = 0;
23
- g_img.bmi.bmiHeader.biClrImportant = 0;
24
29
 
25
- g_img.lpBmpData = (BYTE *)malloc(659/*674*/ * 494/*532*/ * 4);
30
+ 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()を用いて描画
26
-
27
- q = 0;
28
- p = 0;
29
- ok = 0;
30
31
 
31
32
 
32
33
 
33
- hdc = BeginPaint(hWnd_bitmap, &ps);
34
- hdc_mem = CreateCompatibleDC( hdc );
35
-
36
-
37
34
 
35
+ DeleteObject(hPen_MOON);
38
- for ( a = 0; a < 494/*532*/; a++){
36
+ SelectObject(hdc, h01dPen_MOON);
37
+ SelectObject(hdc, hBrush_MOON);
39
- for( b = 0; b < 659/*674*/; b++){
38
+ SelectObject(hdc, h01dBrush_MOON);
40
- ab = a*(659/*674*/*4) + b*4; //始めの項が行数、次の項が左から何ビット目かを表す。(blueの位置を決めている)
39
+ DeleteObject(hBrush_MOON);
41
40
 
42
- 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)){
43
-
44
- x = b-329.5;
45
- y = 494-a;
46
- z = sqrtf(-(x*x)-(y*y)+(s[k]/4*1000000*329.5+0.5)*(s[k]/4*1000000*329.5+0.5));
47
- r = sqrtf(x*x + y*y + z*z);
48
-
49
-
50
- lam1 = (x*XSUNm_3[k] + y*YSUNm_3[k] + z*ZSUNm_3[k])/(r*SUN_MOON[k]); //太陽の方向との内積
51
- lam2 = (x*XEARTHm_3[k] + y*YEARTHm_3[k] + z*ZEARTHm_3[k])/(r*EARTH_MOON[k]); //地球の方向との内積
52
- lam3 = (x*XEQLm_3[k] + y*YEQLm_3[k] + z*ZEQLm_3[k])/(r*EQL_MOON[k]); //EQLの方向との内積
53
-
54
- /*g_img.lpBmpData[ab] = 179*lam3;
55
- g_img.lpBmpData[ab+1] = 179*lam3;
56
- g_img.lpBmpData[ab+2] = 179*lam3;
57
- g_img.lpBmpData[ab+3] = 0;*/
58
-
59
-
60
-
61
- if(lam2>0){
62
- g_img.lpBmpData[ab] = 30/*230**lam2*/;
63
- g_img.lpBmpData[ab+1] = 20/*216*lam2*/;
64
- g_img.lpBmpData[ab+2] = 0;
65
- g_img.lpBmpData[ab+3] = 0;
66
-
67
- }
68
-
69
- if(lam1>0){
70
- g_img.lpBmpData[ab] = 0;
71
- g_img.lpBmpData[ab+1] = 100/*255*lam1*/;
72
- g_img.lpBmpData[ab+2] = 100/*255*lam1*/;
73
- g_img.lpBmpData[ab+3] = 0;
74
- }
75
-
76
- if(!(lam1>=0 || lam2>=0) ){
77
- g_img.lpBmpData[ab] = 179*lam3;
78
- g_img.lpBmpData[ab+1] = 179*lam3;
79
- g_img.lpBmpData[ab+2] = 179*lam3;
80
- g_img.lpBmpData[ab+3] = 0;
81
-
82
- q = q+1;
83
- }
84
- p = p + 1; //円の内側のピクセル数の合計
85
- /*if (494 < (s[k] / 4 * 1000000 * 329.5 + 0.5)) {
86
- ok[k] = q * 100 / 325546;
87
- if (ok[k] >= 10) N1_10 = N1_10 + 1;
88
- if (ok[k] >= 20) N1_20 = N1_20 + 1;
89
- if (ok[k] >= 30) N1_30 = N1_30 + 1;
90
- if (ok[k] >= 40) N1_40 = N1_40 + 1;
91
- if (ok[k] >= 50) N1_50 = N1_50 + 1;
92
- if (ok[k] >= 60) N1_60 = N1_60 + 1;
93
- if (ok[k] >= 70) N1_70 = N1_70 + 1;
94
- if (ok[k] >= 80) N1_80 = N1_80 + 1;
95
- if (ok[k] >= 90) N1_90 = N1_90 + 1;
96
- }
97
-
98
- if (494 >= (s[k] / 4 * 1000000 * 329.5 + 0.5)) {
99
- ok[k] = q * 100 / p;
100
- if (ok[k] >= 10) N2_10 = N2_10 + 1;
101
- if (ok[k] >= 20) N2_20 = N2_20 + 1;
102
- if (ok[k] >= 30) N2_30 = N2_30 + 1;
103
- if (ok[k] >= 40) N2_40 = N2_40 + 1;
104
- if (ok[k] >= 50) N2_50 = N2_50 + 1;
105
- if (ok[k] >= 60) N2_60 = N2_60 + 1;
106
- if (ok[k] >= 70) N2_70 = N2_70 + 1;
107
- if (ok[k] >= 80) N2_80 = N2_80 + 1;
108
- if (ok[k] >= 90) N2_90 = N2_90 + 1;
109
- }*/
110
-
111
- }
112
-
113
- // else{
114
- 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)){
115
- g_img.lpBmpData[ab] = 0;
116
- g_img.lpBmpData[ab+1] = 0;
117
- g_img.lpBmpData[ab+2] = 0;
118
- g_img.lpBmpData[ab+3] = 0;
119
- }
120
-
121
-
122
- }
123
-
124
- }
125
- if (494 < (s[k] / 4 * 1000000 * 329.5 + 0.5)) {
126
- ok = (q * 100) / 325546;
127
- if (ok >= 0) N1_0 = N1_0 + 1;
128
- if (ok >= 10) N1_10 = N1_10 + 1;
129
- if (ok >= 20) N1_20 = N1_20 + 1;
130
- if (ok >= 30) N1_30 = N1_30 + 1;
131
- if (ok >= 40) N1_40 = N1_40 + 1;
132
- if (ok >= 50) N1_50 = N1_50 + 1;
133
- if (ok >= 60) N1_60 = N1_60 + 1;
134
- if (ok >= 70) N1_70 = N1_70 + 1;
135
- if (ok >= 80) N1_80 = N1_80 + 1;
136
- if (ok >= 90) N1_90 = N1_90 + 1;
137
- }
138
-
139
- if (494 >= (s[k] / 4 * 1000000 * 329.5 + 0.5)) {
140
- ok = (q*100)/p;
141
- if (ok >= 0) N2_0 = N2_0 + 1;
142
- if (ok >= 10) N2_10 = N2_10 + 1;
143
- if (ok >= 20) N2_20 = N2_20 + 1;
144
- if (ok >= 30) N2_30 = N2_30 + 1;
145
- if (ok >= 40) N2_40 = N2_40 + 1;
146
- if (ok >= 50) N2_50 = N2_50 + 1;
147
- if (ok >= 60) N2_60 = N2_60 + 1;
148
- if (ok >= 70) N2_70 = N2_70 + 1;
149
- if (ok >= 80) N2_80 = N2_80 + 1;
150
- if (ok >= 90) N2_90 = N2_90 + 1;
151
- }
152
41
 
153
- hBmp = CreateDIBitmap(hdc, &(g_img.bmi.bmiHeader), CBM_INIT, g_img.lpBmpData, &(g_img.bmi), DIB_RGB_COLORS);
154
- free(g_img.lpBmpData);
155
- SelectObject(hdc_mem, hBmp);
156
- SetStretchBltMode(hdc, COLORONCOLOR);
157
- StretchBlt(hdc, 0, 0, 659/*674*/, 494/*532*/, hdc_mem, 0, 0, 659/*674*/, 494/*532*/, SRCCOPY);
158
- DeleteDC( hdc );
159
- DeleteDC( hdc_mem );
160
- DeleteObject( hBmp );
161
- EndPaint(hWnd_bitmap, &ps);
42
+ EndPaint(hWnd2, &ps);
162
- ReleaseDC( hWnd_bitmap, hdc );
43
+ ReleaseDC( hWnd2, hdc );
163
-
164
-
165
-
166
- //sprintf_s(szBuf, 256, "%d個", k);
167
- //MessageBox(NULL, szBuf, TEXT("データ数"), MB_OK);
168
-
169
-
170
-
171
-
172
-
173
-
174
-
175
- //InvalidateRect(hWnd_bitmap, NULL, TRUE);
176
-
177
- //ReleaseDC( hWnd_bitmap, hdc ); // 画面のデバイスコンテキストhdcを破棄する
178
- //}
179
44
  break;
180
45
 
181
- case WM_TIMER:
46
+      case WM_TIMER:
182
47
  if (wp != ID_MYTIMER)
183
48
  return (DefWindowProc(hWnd_bitmap, msg, wp, lp));
184
- k += 1;
49
+ ++k;
185
50
  if (++k > total_n)
186
51
  k = total_n - 1;
187
52
  InvalidateRect(hWnd_bitmap, NULL, FALSE);
188
- free(g_img.lpBmpData);
189
- break;
53
+ break;
190
54
 
191
55
  case WM_LBUTTONDOWN:
192
- KillTimer(hWnd_bitmap, 1);
193
- KillTimer(hWnd5, 1);
194
- KillTimer(hWnd4, 1);
195
- KillTimer(hWnd3, 1);
196
- free(g_img.lpBmpData);
197
- //KillTimer(hWnd2, 1);
198
- 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);
199
- MessageBox(NULL, szBuf, "観測情報", MB_OK);
200
- //if (k = total_n - 1) {
201
- 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);
202
- MessageBox(NULL, szBuf, "観測領域検討", MB_OK);
203
- //}
56
+ KillTimer(hWnd2, 1);
57
+ sprintf_s(szBuf, 256, "%d番目のデータ",k);
58
+ MessageBox(NULL, szBuf, "データの番号", MB_OK);
59
+ break;
204
60
 
205
- break;
206
-
207
61
  case WM_RBUTTONDOWN:
208
- SendMessage(hWnd_bitmap, WM_CREATE, 0,0);
209
- SendMessage(hWnd5, WM_CREATE, 0,0);
62
+ SendMessage(hWnd2, WM_CREATE, 0,0);
210
- SendMessage(hWnd4, WM_CREATE, 0,0);
211
- SendMessage(hWnd3, WM_CREATE, 0,0);
212
- free(g_img.lpBmpData);
213
63
  break;
64
+
214
65
 
215
- case WM_MOVE:
216
- free(g_img.lpBmpData);
217
- break;
218
-
219
66
  case WM_DESTROY:
220
67
  if( k = NULL){
221
- KillTimer(hWnd_bitmap, ID_MYTIMER);
68
+ KillTimer(hWnd2, ID_MYTIMER);
222
69
  }
223
70
  PostQuitMessage(0);
224
- free(g_img.lpBmpData);
225
71
  break;
226
72
 
227
73
 
228
74
  default:
229
- return (DefWindowProc(hWnd_bitmap, msg, wp, lp));
75
+ return (DefWindowProc(hWnd2, msg, wp, lp));
230
76
 
231
77
 
232
78
 
233
79
  }
234
- return 0;
80
+
235
-
236
- }
237
-
238
-
239
81
  ```

1

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

2018/02/24 07:32

投稿

TRON1216.
TRON1216.

スコア37

title CHANGED
File without changes
body 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
  switch (msg) {
3
3
 
4
4