UART通信を用いた組み込みデバッグ用途向けメモリモニタ
修订版 | 0ba3dee6c10f617112967be772611418ea6d0527 (tree) |
---|---|
时间 | 2018-05-03 09:59:24 |
作者 | Yasushi Tanaka <tanaka_yasushi2008@yaho...> |
Commiter | Yasushi Tanaka |
4月作業分
@@ -10,6 +10,19 @@ | ||
10 | 10 | |
11 | 11 | /* |
12 | 12 | * 双方向リスト |
13 | + * リストを初期化 | |
14 | + */ | |
15 | +void bdlist_init(BDLIST_ENTRY *bdlist) | |
16 | +{ | |
17 | + assert(NULL != bdlist); | |
18 | + | |
19 | + /* 初期化 */ | |
20 | + bdlist->bdlist_prev = NULL; | |
21 | + bdlist->bdlist_next = NULL; | |
22 | +} | |
23 | + | |
24 | +/* | |
25 | + * 双方向リスト | |
13 | 26 | * リストの終端を取得 |
14 | 27 | */ |
15 | 28 | BDLIST_ENTRY* bdlist_get_tail(BDLIST_ENTRY *bdlist) |
@@ -23,6 +23,9 @@ typedef struct _BDLIST_ENTRY | ||
23 | 23 | * グローバル関数 |
24 | 24 | */ |
25 | 25 | |
26 | +/* リストを初期化 */ | |
27 | +void bdlist_init(BDLIST_ENTRY *bdlist); | |
28 | + | |
26 | 29 | /* リストの終端を取得 */ |
27 | 30 | BDLIST_ENTRY* bdlist_get_tail(BDLIST_ENTRY *bdlist); |
28 | 31 |
@@ -30,4 +33,4 @@ BDLIST_ENTRY* bdlist_get_tail(BDLIST_ENTRY *bdlist); | ||
30 | 33 | void bdlist_insert_tail(BDLIST_ENTRY *bdlist, BDLIST_ENTRY *entry); |
31 | 34 | |
32 | 35 | /* リストから取り外す */ |
33 | -BDLIST_ENTRY* bdlist_remove(BDLIST_ENTRY *entry) | |
36 | +BDLIST_ENTRY* bdlist_remove(BDLIST_ENTRY *entry); |
@@ -13,6 +13,9 @@ | ||
13 | 13 | * 定数 |
14 | 14 | */ |
15 | 15 | |
16 | +/* ウィンドウクラス*/ | |
17 | +#define SCREEN_CLASS_NAME L"ScreenWindow" | |
18 | + | |
16 | 19 | /* スクリーン色定義(白色) */ |
17 | 20 | #define SCREEN_COLOR_WHITE (RGB(255, 255, 255)) |
18 | 21 |
@@ -65,9 +68,9 @@ static BOOL screen_chr_is_equal(const SCREEN_CHR *chr1, const SCREEN_CHR *chr2) | ||
65 | 68 | |
66 | 69 | /* |
67 | 70 | * スクリーン |
68 | - * キャラクタを描画 | |
71 | + * 表示キャラクタを描画 | |
69 | 72 | */ |
70 | -static BOOL screen_chr_draw(HDC hDC, SCREEN_VIRT_CHR *chr, SCREEN_OBJECT *object) | |
73 | +static BOOL screen_realchr_draw(HDC hDC, SCREEN_REAL_CHR *chr, SCREEN_OBJECT *object) | |
71 | 74 | { |
72 | 75 | COLORREF fore_prev; |
73 | 76 | COLORREF back_prev; |
@@ -84,7 +87,7 @@ static BOOL screen_chr_draw(HDC hDC, SCREEN_VIRT_CHR *chr, SCREEN_OBJECT *object | ||
84 | 87 | } |
85 | 88 | |
86 | 89 | /* フォアグラウンドカラーの更新が必要か */ |
87 | - if (chr->current.fore != object->fore) | |
90 | + if (chr->current.fore != object->fore_draw) | |
88 | 91 | { |
89 | 92 | /* フォアグラウンドカラーを更新する */ |
90 | 93 | fore_prev = SetTextColor(hDC, chr->current.fore); |
@@ -95,11 +98,11 @@ static BOOL screen_chr_draw(HDC hDC, SCREEN_VIRT_CHR *chr, SCREEN_OBJECT *object | ||
95 | 98 | } |
96 | 99 | |
97 | 100 | /* 更新成功 */ |
98 | - object->fore = chr->current.fore; | |
101 | + object->fore_draw = chr->current.fore; | |
99 | 102 | } |
100 | 103 | |
101 | 104 | /* バックグラウンドカラーの更新が必要か */ |
102 | - if (chr->current.back != object->back) | |
105 | + if (chr->current.back != object->back_draw) | |
103 | 106 | { |
104 | 107 | /* バックグラウンドカラーを更新する */ |
105 | 108 | back_prev = SetBkColor(hDC, chr->current.back); |
@@ -110,7 +113,7 @@ static BOOL screen_chr_draw(HDC hDC, SCREEN_VIRT_CHR *chr, SCREEN_OBJECT *object | ||
110 | 113 | } |
111 | 114 | |
112 | 115 | /* 更新成功 */ |
113 | - object->back = chr->current.back; | |
116 | + object->back_draw = chr->current.back; | |
114 | 117 | } |
115 | 118 | |
116 | 119 | /* 右側であれば、化け防止のため半角スペースに強制変更する */ |
@@ -147,9 +150,9 @@ static BOOL screen_chr_draw(HDC hDC, SCREEN_VIRT_CHR *chr, SCREEN_OBJECT *object | ||
147 | 150 | |
148 | 151 | /* |
149 | 152 | * スクリーン |
150 | - * ライン単位で比較 | |
153 | + * 表示ラインの比較 | |
151 | 154 | */ |
152 | -static BOOL screen_line_is_equal(SCREEN_VIRT_LINE *line, SCREEN_OBJECT *object) | |
155 | +static BOOL screen_realline_is_equal(SCREEN_REAL_LINE *line, SCREEN_OBJECT *object) | |
153 | 156 | { |
154 | 157 | UINT loop; |
155 | 158 | BOOL result; |
@@ -163,13 +166,15 @@ static BOOL screen_line_is_equal(SCREEN_VIRT_LINE *line, SCREEN_OBJECT *object) | ||
163 | 166 | return TRUE; |
164 | 167 | } |
165 | 168 | |
169 | + assert(NULL != line->buf); | |
170 | + | |
166 | 171 | /* 上下方向が描画範囲を超えていれば常にTRUE(一致) */ |
167 | - if (0 > line->chr[0].rect_ank.bottom) | |
172 | + if (0 > line->buf[0].rect_ank.bottom) | |
168 | 173 | { |
169 | 174 | /* 描画範囲より上すぎる */ |
170 | 175 | return TRUE; |
171 | 176 | } |
172 | - if (object->height < line->chr[0].rect_ank.top) | |
177 | + if (object->height < line->buf[0].rect_ank.top) | |
173 | 178 | { |
174 | 179 | /* 描画範囲が下すぎる */ |
175 | 180 | return TRUE; |
@@ -179,13 +184,13 @@ static BOOL screen_line_is_equal(SCREEN_VIRT_LINE *line, SCREEN_OBJECT *object) | ||
179 | 184 | for (loop = 0; loop < line->chrs; loop++) |
180 | 185 | { |
181 | 186 | /* 左右方向が描画範囲を超えていれば打ち切る */ |
182 | - if (object->width < line->chr[loop].rect_ank.left) | |
187 | + if (object->width < line->buf[loop].rect_ank.left) | |
183 | 188 | { |
184 | 189 | break; |
185 | 190 | } |
186 | 191 | |
187 | 192 | /* 比較結果を得る */ |
188 | - result = screen_chr_is_equal(&line->chr[loop].current, &line->chr[loop].draw); | |
193 | + result = screen_chr_is_equal(&line->buf[loop].current, &line->buf[loop].draw); | |
189 | 194 | if (result == FALSE) |
190 | 195 | { |
191 | 196 | /* 不一致キャラクタを検出 */ |
@@ -199,9 +204,9 @@ static BOOL screen_line_is_equal(SCREEN_VIRT_LINE *line, SCREEN_OBJECT *object) | ||
199 | 204 | |
200 | 205 | /* |
201 | 206 | * スクリーン |
202 | - * ライン単位で描画 | |
207 | + * 表示ラインの描画 | |
203 | 208 | */ |
204 | -static BOOL screen_line_draw(HDC hDC, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *object) | |
209 | +static BOOL screen_realline_draw(HDC hDC, SCREEN_REAL_LINE *line, SCREEN_OBJECT *object) | |
205 | 210 | { |
206 | 211 | UINT loop; |
207 | 212 | BOOL result; |
@@ -217,15 +222,15 @@ static BOOL screen_line_draw(HDC hDC, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *obj | ||
217 | 222 | } |
218 | 223 | |
219 | 224 | /* キャラクタ数は1以上 */ |
220 | - assert(NULL != line->chr); | |
225 | + assert(NULL != line->buf); | |
221 | 226 | |
222 | 227 | /* 上下方向が描画範囲を超えていればFALSEを返す */ |
223 | - if (0 > line->chr[0].rect_ank.bottom) | |
228 | + if (0 > line->buf[0].rect_ank.bottom) | |
224 | 229 | { |
225 | 230 | /* 描画範囲より上すぎる */ |
226 | 231 | return FALSE; |
227 | 232 | } |
228 | - if (object->height < line->chr[0].rect_ank.top) | |
233 | + if (object->height < line->buf[0].rect_ank.top) | |
229 | 234 | { |
230 | 235 | /* 描画範囲が下すぎる */ |
231 | 236 | return FALSE; |
@@ -235,13 +240,13 @@ static BOOL screen_line_draw(HDC hDC, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *obj | ||
235 | 240 | for (loop = 0; loop < line->chrs; loop++) |
236 | 241 | { |
237 | 242 | /* 左右方向が描画範囲を超えていれば打ち切る */ |
238 | - if (object->width < line->chr[loop].rect_ank.left) | |
243 | + if (object->width < line->buf[loop].rect_ank.left) | |
239 | 244 | { |
240 | 245 | break; |
241 | 246 | } |
242 | 247 | |
243 | 248 | /* 1キャラクタ描画 */ |
244 | - result = screen_chr_draw(hDC, &line->chr[loop], object); | |
249 | + result = screen_realchr_draw(hDC, &line->buf[loop], object); | |
245 | 250 | |
246 | 251 | /* 実際に描画していて */ |
247 | 252 | if (result == TRUE) |
@@ -250,28 +255,31 @@ static BOOL screen_line_draw(HDC hDC, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *obj | ||
250 | 255 | if (loop < (line->chrs - 1)) |
251 | 256 | { |
252 | 257 | /* 全角か */ |
253 | - if (0x0100 <= line->chr[loop].current.chr) | |
258 | + if (0x0100 <= line->buf[loop].current.chr) | |
254 | 259 | { |
255 | 260 | /* 左側か */ |
256 | - if (FALSE == line->chr[loop].current.right) | |
261 | + if (FALSE == line->buf[loop].current.right) | |
257 | 262 | { |
258 | 263 | /* 左側を描画しているので、右側も一致させる */ |
259 | - line->chr[loop + 1].draw = line->chr[loop].draw; | |
264 | + line->buf[loop + 1].draw = line->buf[loop].draw; | |
260 | 265 | |
261 | 266 | /* ただし右側とする */ |
262 | - line->chr[loop + 1].draw.right = TRUE; | |
267 | + line->buf[loop + 1].draw.right = TRUE; | |
263 | 268 | } |
264 | 269 | } |
265 | 270 | } |
266 | 271 | } |
267 | 272 | } |
273 | + | |
274 | + /* 次の行に継続させるので、TRUEを返す */ | |
275 | + return TRUE; | |
268 | 276 | } |
269 | 277 | |
270 | 278 | /* |
271 | 279 | * スクリーン |
272 | - * ライン矩形の再設定 | |
280 | + * 表示ライン矩形の再設定 | |
273 | 281 | */ |
274 | -static void screen_line_rect(LONG top, SCREEN_VIRT_LINE *line) | |
282 | +static void screen_realline_setrect(LONG top, SCREEN_REAL_LINE *line) | |
275 | 283 | { |
276 | 284 | UINT loop; |
277 | 285 | LONG bottom; |
@@ -285,23 +293,23 @@ static void screen_line_rect(LONG top, SCREEN_VIRT_LINE *line) | ||
285 | 293 | for (loop = 0; loop < line->chrs; loop++) |
286 | 294 | { |
287 | 295 | /* 矩形(半角) */ |
288 | - line->chr[loop].rect_ank.top = top; | |
289 | - line->chr[loop].rect_ank.bottom = bottom; | |
296 | + line->buf[loop].rect_ank.top = top; | |
297 | + line->buf[loop].rect_ank.bottom = bottom; | |
290 | 298 | |
291 | 299 | /* 矩形(全角) */ |
292 | - line->chr[loop].rect_kanji.top = top; | |
293 | - line->chr[loop].rect_kanji.bottom = bottom; | |
300 | + line->buf[loop].rect_kanji.top = top; | |
301 | + line->buf[loop].rect_kanji.bottom = bottom; | |
294 | 302 | } |
295 | 303 | } |
296 | 304 | |
297 | 305 | /* |
298 | 306 | * スクリーン |
299 | - * ラインのリサイズ | |
307 | + * 表示ラインのリサイズ | |
300 | 308 | */ |
301 | -static void screen_line_resize(LONG top, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *object) | |
309 | +static void screen_realline_resize(LONG top, SCREEN_REAL_LINE *line, SCREEN_OBJECT *object) | |
302 | 310 | { |
303 | 311 | UINT loop; |
304 | - SCREEN_VIRT_CHR *array; | |
312 | + SCREEN_REAL_CHR *array; | |
305 | 313 | RECT rect_ank; |
306 | 314 | RECT rect_kanji; |
307 | 315 |
@@ -309,25 +317,30 @@ static void screen_line_resize(LONG top, SCREEN_VIRT_LINE *line, SCREEN_OBJECT * | ||
309 | 317 | assert(object != NULL); |
310 | 318 | |
311 | 319 | /* 現在のキャラクタ数と一致しているか、より大きければ */ |
312 | - if (object->virt.width_chr <= line->chrs) | |
320 | + if (object->real.width_chr <= line->chrs) | |
313 | 321 | { |
314 | 322 | /* 矩形を再設定するのみ */ |
315 | - screen_line_rect(top, line); | |
323 | + screen_realline_setrect(top, line); | |
316 | 324 | return; |
317 | 325 | } |
318 | 326 | |
319 | 327 | /* 要求キャラクタ数が0なら何もしない */ |
320 | - if (0 == object->virt.width_chr) | |
328 | + if (0 == object->real.width_chr) | |
321 | 329 | { |
322 | 330 | return; |
323 | 331 | } |
324 | 332 | |
325 | - /* 新たな仮想キャラクタ配列を確保し、ゼロクリア */ | |
326 | - array = (SCREEN_VIRT_CHR*)malloc(sizeof(SCREEN_VIRT_CHR) * object->virt.width_chr); | |
327 | - memset(array, 0, sizeof(SCREEN_VIRT_CHR) * object->virt.width_chr); | |
333 | + /* 新たな表示キャラクタ配列を確保し、ゼロクリア */ | |
334 | + array = (SCREEN_REAL_CHR*)malloc(sizeof(SCREEN_REAL_CHR) * object->real.width_chr); | |
335 | + assert(NULL != array); | |
336 | + if (NULL == array) | |
337 | + { | |
338 | + return; | |
339 | + } | |
340 | + memset(array, 0, sizeof(SCREEN_REAL_CHR) * object->real.width_chr); | |
328 | 341 | |
329 | 342 | /* 全ての最新キャラクタを半角スペースで初期化する */ |
330 | - for (loop = 0; loop < object->virt.width_chr; loop++) | |
343 | + for (loop = 0; loop < object->real.width_chr; loop++) | |
331 | 344 | { |
332 | 345 | array[loop].current.chr = L' '; |
333 | 346 | array[loop].current.right = FALSE; |
@@ -338,22 +351,22 @@ static void screen_line_resize(LONG top, SCREEN_VIRT_LINE *line, SCREEN_OBJECT * | ||
338 | 351 | /* 現在のキャラクタ数が1以上ならコピー */ |
339 | 352 | if (0 < line->chrs) |
340 | 353 | { |
341 | - assert(NULL != line->chr); | |
354 | + assert(NULL != line->buf); | |
342 | 355 | |
343 | 356 | /* コピーして */ |
344 | - memcpy(array, line->chr, sizeof(SCREEN_VIRT_CHR) * line->chrs); | |
357 | + memcpy(array, line->buf, sizeof(SCREEN_REAL_CHR) * line->chrs); | |
345 | 358 | |
346 | 359 | /* 古い配列を解放 */ |
347 | - free(line->chr); | |
348 | - line->chr = NULL; | |
360 | + free(line->buf); | |
361 | + line->buf = NULL; | |
349 | 362 | line->chrs = 0; |
350 | 363 | } |
351 | 364 | |
352 | 365 | /* ポインタをセット */ |
353 | - line->chr = array; | |
366 | + line->buf = array; | |
354 | 367 | |
355 | 368 | /* 新しいキャラクタ数をセット */ |
356 | - line->chrs = object->virt.width_chr; | |
369 | + line->chrs = object->real.width_chr; | |
357 | 370 | |
358 | 371 | /* 半角矩形を初期化 */ |
359 | 372 | rect_ank.left = 0; |
@@ -371,8 +384,8 @@ static void screen_line_resize(LONG top, SCREEN_VIRT_LINE *line, SCREEN_OBJECT * | ||
371 | 384 | for (loop = 0; loop < line->chrs; loop++) |
372 | 385 | { |
373 | 386 | /* 矩形を更新 */ |
374 | - line->chr[loop].rect_ank = rect_ank; | |
375 | - line->chr[loop].rect_kanji = rect_kanji; | |
387 | + line->buf[loop].rect_ank = rect_ank; | |
388 | + line->buf[loop].rect_kanji = rect_kanji; | |
376 | 389 | |
377 | 390 | /* コピー元矩形を、右側へ移動 */ |
378 | 391 | rect_ank.left += g_tm.tmAveCharWidth; |
@@ -384,28 +397,28 @@ static void screen_line_resize(LONG top, SCREEN_VIRT_LINE *line, SCREEN_OBJECT * | ||
384 | 397 | |
385 | 398 | /* |
386 | 399 | * スクリーン |
387 | - * ラインの破棄 | |
400 | + * 表示ラインの破棄 | |
388 | 401 | */ |
389 | -static void screen_line_destroy(SCREEN_VIRT_LINE *line) | |
402 | +static void screen_realline_destroy(SCREEN_REAL_LINE *line) | |
390 | 403 | { |
391 | - assret(NULL != line); | |
404 | + assert(NULL != line); | |
392 | 405 | |
393 | 406 | /* 現在のキャラクタ数が0を超えていれば */ |
394 | 407 | if (0 < line->chrs) |
395 | 408 | { |
396 | 409 | /* キャラクタ配列を解放 */ |
397 | - assert(NULL != line->chr); | |
398 | - free(line->chr); | |
399 | - line->chr = NULL; | |
410 | + assert(NULL != line->buf); | |
411 | + free(line->buf); | |
412 | + line->buf = NULL; | |
400 | 413 | line->chrs = 0; |
401 | 414 | } |
402 | 415 | } |
403 | 416 | |
404 | 417 | /* |
405 | 418 | * スクリーン |
406 | - * ラインの無効化 | |
419 | + * 表示ラインの無効化 | |
407 | 420 | */ |
408 | -static void screen_line_invalidate(SCREEN_VIRT_LINE *line) | |
421 | +static void screen_realline_invalidate(SCREEN_REAL_LINE *line) | |
409 | 422 | { |
410 | 423 | UINT loop; |
411 | 424 |
@@ -415,69 +428,76 @@ static void screen_line_invalidate(SCREEN_VIRT_LINE *line) | ||
415 | 428 | for (loop = 0; loop < line->chrs; loop++) |
416 | 429 | { |
417 | 430 | /* 描画済みキャラクタをヌル文字に変更 */ |
418 | - line->chr[loop].draw.chr = L'\0'; | |
431 | + assert(NULL != line->buf); | |
432 | + line->buf[loop].draw.chr = L'\0'; | |
419 | 433 | } |
420 | 434 | } |
421 | 435 | |
422 | 436 | /* |
423 | 437 | * スクリーン |
424 | - * 全てのラインのリサイズ | |
438 | + * 表示スクリーンのリサイズ | |
425 | 439 | */ |
426 | -static void screen_allline_resize(SCREEN_OBJECT *object) | |
440 | +static void screen_real_resize(SCREEN_OBJECT *object) | |
427 | 441 | { |
428 | 442 | UINT add; |
429 | 443 | UINT loop; |
430 | 444 | LONG top; |
431 | - SCREEN_VIRT_LINE *line; | |
445 | + SCREEN_REAL_LINE *line; | |
432 | 446 | |
433 | 447 | assert(NULL != object); |
434 | 448 | |
435 | 449 | /* クライアント領域の幅から、キャラクタ数を決める(余りがあれば+1) */ |
436 | - object->virt.width_chr = object->width / g_tm.tmAveCharWidth; | |
450 | + object->real.width_chr = object->width / g_tm.tmAveCharWidth; | |
437 | 451 | if (0 < object->width % g_tm.tmAveCharWidth) |
438 | 452 | { |
439 | - object->virt.width_chr++; | |
453 | + object->real.width_chr++; | |
440 | 454 | } |
441 | 455 | |
442 | 456 | /* クライアント領域の高さから、キャラクタ数を決める(余りがあれば+1) */ |
443 | - object->virt.height_chr = object->height / g_tmAllHeight; | |
457 | + object->real.height_chr = object->height / g_tmAllHeight; | |
444 | 458 | if (0 < object->height % g_tmAllHeight) |
445 | 459 | { |
446 | - object->virt.height_chr++; | |
460 | + object->real.height_chr++; | |
447 | 461 | } |
448 | 462 | |
449 | 463 | /* 現在の行数 < 算出した行数の場合 */ |
450 | - if (object->virt.lines < object->virt.height_chr) | |
464 | + if (object->real.lines < object->real.height_chr) | |
451 | 465 | { |
452 | 466 | /* 現在存在する行数を考慮して、追加すべき行を算出する */ |
453 | - add = object->virt.height_chr - object->virt.lines; | |
467 | + add = object->real.height_chr - object->real.lines; | |
454 | 468 | |
455 | 469 | /* 行を追加 */ |
456 | 470 | for (loop = 0; loop < add; loop++) |
457 | 471 | { |
458 | 472 | /* 新たな行オブジェクトを作成 */ |
459 | - line = (SCREEN_VIRT_LINE*)malloc(sizeof(SCREEN_VIRT_LINE)); | |
460 | - memset(line, 0, sizeof(SCREEN_VIRT_LINE)); | |
473 | + line = (SCREEN_REAL_LINE*)malloc(sizeof(SCREEN_REAL_LINE)); | |
474 | + assert(NULL != line); | |
475 | + if (NULL == line) | |
476 | + { | |
477 | + return; | |
478 | + } | |
479 | + memset(line, 0, sizeof(SCREEN_REAL_LINE)); | |
480 | + bdlist_init((BDLIST_ENTRY*)line); | |
461 | 481 | |
462 | 482 | /* 最初の行か*/ |
463 | - if (NULL == object->virt.head) | |
483 | + if (NULL == object->real.head) | |
464 | 484 | { |
465 | 485 | /* 最初の行なので、そのままセット */ |
466 | - object->virt.head = line; | |
486 | + object->real.head = line; | |
467 | 487 | } |
468 | 488 | else |
469 | 489 | { |
470 | 490 | /* 終端に追加 */ |
471 | - bdlist_insert_tail((BDLIST_ENTRY*)object->virt.head, (BDLIST_ENTRY*)line); | |
491 | + bdlist_insert_tail((BDLIST_ENTRY*)object->real.head, (BDLIST_ENTRY*)line); | |
472 | 492 | } |
473 | 493 | } |
474 | 494 | |
475 | 495 | /* 行の数を更新 */ |
476 | - object->virt.lines = object->virt.height_chr; | |
496 | + object->real.lines = object->real.height_chr; | |
477 | 497 | } |
478 | 498 | |
479 | 499 | /* dir_upを考慮して、topを決める */ |
480 | - if (TRUE == object->virt.dir_up) | |
500 | + if (TRUE == object->real.dir_up) | |
481 | 501 | { |
482 | 502 | /* 下方向から上方向に延びる*/ |
483 | 503 | top = object->height - g_tmAllHeight; |
@@ -489,16 +509,16 @@ static void screen_allline_resize(SCREEN_OBJECT *object) | ||
489 | 509 | } |
490 | 510 | |
491 | 511 | /* 全ての行をリサイズ */ |
492 | - line = object->virt.head; | |
493 | - for (loop = 0; loop < object->virt.lines; loop++) | |
512 | + line = object->real.head; | |
513 | + for (loop = 0; loop < object->real.lines; loop++) | |
494 | 514 | { |
495 | 515 | assert(NULL != line); |
496 | 516 | |
497 | 517 | /* ラインのリサイズ */ |
498 | - screen_line_resize(top, line, object); | |
518 | + screen_realline_resize(top, line, object); | |
499 | 519 | |
500 | 520 | /* topを更新 */ |
501 | - if (FALSE == object->virt.dir_up) | |
521 | + if (FALSE == object->real.dir_up) | |
502 | 522 | { |
503 | 523 | /* 上から下へ */ |
504 | 524 | top += g_tmAllHeight; |
@@ -510,30 +530,30 @@ static void screen_allline_resize(SCREEN_OBJECT *object) | ||
510 | 530 | } |
511 | 531 | |
512 | 532 | /* 次のラインへ*/ |
513 | - line = (SCREEN_VIRT_LINE*)line->bdlist.bdlist_next; | |
533 | + line = (SCREEN_REAL_LINE*)line->bdlist.bdlist_next; | |
514 | 534 | } |
515 | 535 | } |
516 | 536 | |
517 | 537 | /* |
518 | 538 | * スクリーン |
519 | -* 全てのラインの比較 | |
539 | +* 表示スクリーンの比較 | |
520 | 540 | */ |
521 | -static BOOL screen_allline_is_equal(SCREEN_OBJECT *object) | |
541 | +static BOOL screen_real_is_equal(SCREEN_OBJECT *object) | |
522 | 542 | { |
523 | - SCREEN_VIRT_LINE *line; | |
543 | + SCREEN_REAL_LINE *line; | |
524 | 544 | BOOL result; |
525 | 545 | |
526 | 546 | assert(NULL != object); |
527 | 547 | |
528 | 548 | /* 最初のラインを取得、戻り値をTRUEに初期化 */ |
529 | - line = object->virt.head; | |
549 | + line = object->real.head; | |
530 | 550 | result = TRUE; |
531 | 551 | |
532 | 552 | /* ラインが存在する限りループ */ |
533 | 553 | while (NULL != line) |
534 | 554 | { |
535 | 555 | /* このラインを比較 */ |
536 | - result = screen_line_is_equal(line, object); | |
556 | + result = screen_realline_is_equal(line, object); | |
537 | 557 | |
538 | 558 | /* 結果がFALSEであれば直ちに抜ける */ |
539 | 559 | if (FALSE == result) |
@@ -542,7 +562,7 @@ static BOOL screen_allline_is_equal(SCREEN_OBJECT *object) | ||
542 | 562 | } |
543 | 563 | |
544 | 564 | /* 次のラインを得る */ |
545 | - line = (BDLIST_ENTRY*)line->bdlist.bdlist_next; | |
565 | + line = (SCREEN_REAL_LINE*)line->bdlist.bdlist_next; | |
546 | 566 | } |
547 | 567 | |
548 | 568 | /* 結果を返す */ |
@@ -551,11 +571,11 @@ static BOOL screen_allline_is_equal(SCREEN_OBJECT *object) | ||
551 | 571 | |
552 | 572 | /* |
553 | 573 | * スクリーン |
554 | -* 全てのラインの描画 | |
574 | +* 表示スクリーンの描画 | |
555 | 575 | */ |
556 | -static void screen_allline_draw(HDC hDC, SCREEN_OBJECT *object) | |
576 | +static void screen_real_draw(HDC hDC, SCREEN_OBJECT *object) | |
557 | 577 | { |
558 | - SCREEN_VIRT_LINE *line; | |
578 | + SCREEN_REAL_LINE *line; | |
559 | 579 | BOOL result; |
560 | 580 | COLORREF fore_prev; |
561 | 581 | COLORREF back_prev; |
@@ -564,18 +584,31 @@ static void screen_allline_draw(HDC hDC, SCREEN_OBJECT *object) | ||
564 | 584 | assert(object != NULL); |
565 | 585 | |
566 | 586 | /* 最初のラインを得る */ |
567 | - line = object->virt.head; | |
587 | + line = object->real.head; | |
568 | 588 | |
569 | 589 | /* フォアグラウンドカラーをデフォルト色にセット */ |
570 | 590 | fore_prev = SetTextColor(hDC, object->fore_def); |
571 | 591 | assert(CLR_INVALID != fore_prev); |
572 | - if (4) | |
592 | + if (CLR_INVALID == fore_prev) | |
593 | + { | |
594 | + return; | |
595 | + } | |
596 | + object->fore_draw = object->fore_def; | |
597 | + | |
598 | + /* バックグラウンドカラーをデフォルト色にセット */ | |
599 | + back_prev = SetBkColor(hDC, object->back_def); | |
600 | + assert(CLR_INVALID != back_prev); | |
601 | + if (CLR_INVALID == back_prev) | |
602 | + { | |
603 | + return; | |
604 | + } | |
605 | + object->back_draw = object->back_def; | |
573 | 606 | |
574 | 607 | /* ラインが存在する限りループ */ |
575 | 608 | while (NULL != line) |
576 | 609 | { |
577 | 610 | /* このラインを描画 */ |
578 | - result = screen_line_draw(hDC, line, object); | |
611 | + result = screen_realline_draw(hDC, line, object); | |
579 | 612 | |
580 | 613 | /* 描画範囲を超えていればFALSEが返る */ |
581 | 614 | if (FALSE == result) |
@@ -584,31 +617,31 @@ static void screen_allline_draw(HDC hDC, SCREEN_OBJECT *object) | ||
584 | 617 | } |
585 | 618 | |
586 | 619 | /* 次のラインを得る */ |
587 | - line = (SCREEN_VIRT_LINE*)line->bdlist.bdlist_next; | |
620 | + line = (SCREEN_REAL_LINE*)line->bdlist.bdlist_next; | |
588 | 621 | } |
589 | 622 | } |
590 | 623 | |
591 | 624 | /* |
592 | 625 | * スクリーン |
593 | - * 全てのラインの破棄 | |
626 | + * 表示スクリーンの破棄 | |
594 | 627 | */ |
595 | -static void screen_allline_destroy(SCREEN_OBJECT *object) | |
628 | +static void screen_real_destroy(SCREEN_OBJECT *object) | |
596 | 629 | { |
597 | - SCREEN_VIRT_LINE *line; | |
630 | + SCREEN_REAL_LINE *line; | |
598 | 631 | |
599 | 632 | assert(NULL != object); |
600 | 633 | |
601 | - /* 最初のラインが有効であればループ */ | |
602 | - while (NULL != object->virt.head) | |
634 | + /* 最初のラインが有効である限りループ */ | |
635 | + while (NULL != object->real.head) | |
603 | 636 | { |
604 | 637 | /* ラインを記憶しておく */ |
605 | - line = object->virt.head; | |
606 | - | |
607 | - /* このラインを削除 */ | |
608 | - screen_line_destroy(line); | |
638 | + line = object->real.head; | |
609 | 639 | |
610 | 640 | /* リストから取り外す */ |
611 | - object->virt.head = (SCREEN_VIRT_LINE*)bdlist_remove((BDLIST_ENTRY*)&line); | |
641 | + object->real.head = (SCREEN_REAL_LINE*)bdlist_remove((BDLIST_ENTRY*)line); | |
642 | + | |
643 | + /* このラインを削除 */ | |
644 | + screen_realline_destroy(line); | |
612 | 645 | |
613 | 646 | /* 行オブジェクトを解放 */ |
614 | 647 | free(line); |
@@ -617,25 +650,135 @@ static void screen_allline_destroy(SCREEN_OBJECT *object) | ||
617 | 650 | |
618 | 651 | /* |
619 | 652 | * スクリーン |
620 | - * 全てのラインの無効化 | |
653 | + * 表示スクリーンの無効化 | |
621 | 654 | */ |
622 | -static void screen_allline_invalidate(SCREEN_OBJECT *object) | |
655 | +static void screen_real_invalidate(SCREEN_OBJECT *object) | |
623 | 656 | { |
624 | - SCREEN_VIRT_LINE *line; | |
657 | + SCREEN_REAL_LINE *line; | |
625 | 658 | |
626 | 659 | assert(NULL != object); |
627 | 660 | |
628 | 661 | /* 最初のラインを得る */ |
629 | - line = object->virt.head; | |
662 | + line = object->real.head; | |
630 | 663 | |
631 | 664 | /* ラインが存在する限りループ */ |
632 | 665 | while (NULL != line) |
633 | 666 | { |
634 | 667 | /* このラインを無効化 */ |
635 | - screen_line_invalidate(line); | |
668 | + screen_realline_invalidate(line); | |
636 | 669 | |
637 | 670 | /* 次のラインを得る */ |
638 | - line = (SCREEN_VIRT_LINE*)line->bdlist.bdlist_next; | |
671 | + line = (SCREEN_REAL_LINE*)line->bdlist.bdlist_next; | |
672 | + } | |
673 | +} | |
674 | + | |
675 | +/* | |
676 | +* スクリーン | |
677 | +* 仮想ラインのリサイズ | |
678 | +*/ | |
679 | +static void screen_virtline_resize(SCREEN_VIRT_LINE *line, SCREEN_OBJECT *object) | |
680 | +{ | |
681 | + UINT loop; | |
682 | + SCREEN_CHR *array; | |
683 | + | |
684 | + assert(line != NULL); | |
685 | + assert(object != NULL); | |
686 | + | |
687 | + /* 現在のキャラクタ数と一致しているか、より大きければ */ | |
688 | + if (object->real.width_chr <= line->chrs) | |
689 | + { | |
690 | + /* 何もしない */ | |
691 | + return; | |
692 | + } | |
693 | + | |
694 | + /* 要求キャラクタ数が0なら何もしない */ | |
695 | + if (0 == object->real.width_chr) | |
696 | + { | |
697 | + return; | |
698 | + } | |
699 | + | |
700 | + /* 新たな表示キャラクタ配列を確保し、ゼロクリア */ | |
701 | + array = (SCREEN_CHR*)malloc(sizeof(SCREEN_CHR) * object->real.width_chr); | |
702 | + assert(NULL != array); | |
703 | + if (NULL == array) | |
704 | + { | |
705 | + return; | |
706 | + } | |
707 | + memset(array, 0, sizeof(SCREEN_CHR) * object->real.width_chr); | |
708 | + | |
709 | + /* 全ての最新キャラクタを半角スペースで初期化する */ | |
710 | + for (loop = 0; loop < object->real.width_chr; loop++) | |
711 | + { | |
712 | + array[loop].chr = L' '; | |
713 | + array[loop].right = FALSE; | |
714 | + array[loop].fore = object->fore_def; | |
715 | + array[loop].back = object->back_def; | |
716 | + } | |
717 | + | |
718 | + /* 現在のキャラクタ数が1以上ならコピー */ | |
719 | + if (0 < line->chrs) | |
720 | + { | |
721 | + assert(NULL != line->buf); | |
722 | + | |
723 | + /* コピーして */ | |
724 | + memcpy(array, line->buf, sizeof(SCREEN_CHR) * line->chrs); | |
725 | + | |
726 | + /* 古い配列を解放 */ | |
727 | + free(line->buf); | |
728 | + line->buf = NULL; | |
729 | + line->chrs = 0; | |
730 | + } | |
731 | + | |
732 | + /* ポインタをセット */ | |
733 | + line->buf = array; | |
734 | + | |
735 | + /* 新しいキャラクタ数をセット */ | |
736 | + line->chrs = object->real.width_chr; | |
737 | +} | |
738 | + | |
739 | +/* | |
740 | + * スクリーン | |
741 | + * 仮想ラインの破棄 | |
742 | + */ | |
743 | +static void screen_virtline_destroy(SCREEN_VIRT_LINE *line) | |
744 | +{ | |
745 | + assert(NULL != line); | |
746 | + | |
747 | + /* 現在のキャラクタ数が0を超えていれば */ | |
748 | + if (0 < line->chrs) | |
749 | + { | |
750 | + /* キャラクタ配列を解放 */ | |
751 | + assert(NULL != line->buf); | |
752 | + free(line->buf); | |
753 | + line->buf = NULL; | |
754 | + line->chrs = 0; | |
755 | + } | |
756 | +} | |
757 | + | |
758 | +/* | |
759 | + * スクリーン | |
760 | + * 仮想スクリーンの破棄 | |
761 | + */ | |
762 | +static void screen_virt_destroy(SCREEN_OBJECT *object) | |
763 | +{ | |
764 | + SCREEN_VIRT_LINE *line; | |
765 | + | |
766 | + assert(NULL != object); | |
767 | + | |
768 | + /* 最初のラインが有効である限りループ */ | |
769 | + while (NULL != object->virt.head) | |
770 | + { | |
771 | + /* ラインを記憶しておく */ | |
772 | + line = object->virt.head; | |
773 | + | |
774 | + /* リストから取り外す */ | |
775 | + object->virt.head = (SCREEN_VIRT_LINE*)bdlist_remove((BDLIST_ENTRY*)line); | |
776 | + | |
777 | + /* このラインを削除 */ | |
778 | + screen_virtline_destroy(line); | |
779 | + | |
780 | + /* 行オブジェクトを解放 */ | |
781 | + free(line); | |
639 | 782 | } |
640 | 783 | } |
641 | 784 |
@@ -670,7 +813,7 @@ static SCREEN_OBJECT* screen_get_object(HWND hwnd) | ||
670 | 813 | } |
671 | 814 | |
672 | 815 | /* 次へ移動 */ |
673 | - object = object->bdlist.bdlist_next; | |
816 | + object = (SCREEN_OBJECT*)object->bdlist.bdlist_next; | |
674 | 817 | } |
675 | 818 | |
676 | 819 | /* 見つかった */ |
@@ -700,8 +843,8 @@ static void screen_destroy_object(SCREEN_OBJECT *object) | ||
700 | 843 | assert(NULL != object); |
701 | 844 | assert(TRUE == object->destroy); |
702 | 845 | |
703 | - /* 全てのラインを破棄 */ | |
704 | - screen_allline_destroy(object); | |
846 | + /* 仮想スクリーンを破棄 */ | |
847 | + screen_real_destroy(object); | |
705 | 848 | |
706 | 849 | /* 先頭かどうか */ |
707 | 850 | if (g_screen_object_head == object) |
@@ -731,8 +874,8 @@ static void screen_update_object(SCREEN_OBJECT *object) | ||
731 | 874 | |
732 | 875 | assert(NULL != object); |
733 | 876 | |
734 | - /* 全てのラインを比較 */ | |
735 | - result = screen_allline_is_equal(object); | |
877 | + /* 仮想スクリーンを比較 */ | |
878 | + result = screen_real_is_equal(object); | |
736 | 879 | if (FALSE == result) |
737 | 880 | { |
738 | 881 | /* 描画要求をセット */ |
@@ -776,8 +919,8 @@ static void screen_draw_object(SCREEN_OBJECT *object) | ||
776 | 919 | return; |
777 | 920 | } |
778 | 921 | |
779 | - /* 全てのラインを描画 */ | |
780 | - screen_allline_draw(hDC, object); | |
922 | + /* 表示スクリーンを描画 */ | |
923 | + screen_real_draw(hDC, object); | |
781 | 924 | |
782 | 925 | /* デバイスコンテキストを解放 */ |
783 | 926 | ReleaseDC(object->hwnd, hDC); |
@@ -830,10 +973,10 @@ static BOOL screen_on_create(HWND hWnd, const LPCREATESTRUCT lpcs) | ||
830 | 973 | } |
831 | 974 | |
832 | 975 | /* 垂直スクロールバーの有無で方向を設定 */ |
833 | - object->virt.dir_up = object->vscroll; | |
976 | + object->real.dir_up = object->vscroll; | |
834 | 977 | |
835 | 978 | /* リサイズによって仮想ラインを作成する */ |
836 | - screen_allline_resize(object); | |
979 | + screen_real_resize(object); | |
837 | 980 | |
838 | 981 | /* スクリーンの先頭によって分ける */ |
839 | 982 | if (NULL == g_screen_object_head) |
@@ -848,7 +991,7 @@ static BOOL screen_on_create(HWND hWnd, const LPCREATESTRUCT lpcs) | ||
848 | 991 | } |
849 | 992 | |
850 | 993 | /* 成功 */ |
851 | - return FALSE; | |
994 | + return TRUE; | |
852 | 995 | } |
853 | 996 | |
854 | 997 | /* |
@@ -920,7 +1063,7 @@ static void screen_on_size(HWND hWnd, int width, int height) | ||
920 | 1063 | object->height = height; |
921 | 1064 | |
922 | 1065 | /* スクリーンのリサイズ */ |
923 | - screen_allline_resize(object); | |
1066 | + screen_real_resize(object); | |
924 | 1067 | } |
925 | 1068 | |
926 | 1069 | /* |
@@ -944,7 +1087,7 @@ static void screen_on_paint(HWND hWnd) | ||
944 | 1087 | } |
945 | 1088 | |
946 | 1089 | /* 全てのラインを無効化 */ |
947 | - screen_allline_invalidate(object); | |
1090 | + screen_real_invalidate(object); | |
948 | 1091 | |
949 | 1092 | /* 描画を開始(WM_ERASEBKGNDが送信される) */ |
950 | 1093 | hDC = BeginPaint(hWnd, &ps); |
@@ -955,7 +1098,7 @@ static void screen_on_paint(HWND hWnd) | ||
955 | 1098 | } |
956 | 1099 | |
957 | 1100 | /* 全てのラインを描画 */ |
958 | - screen_allline_draw(hDC, object); | |
1101 | + screen_real_draw(hDC, object); | |
959 | 1102 | |
960 | 1103 | /* 描画を終了 */ |
961 | 1104 | EndPaint(hWnd, &ps); |
@@ -1082,7 +1225,7 @@ BOOL screen_init(void) | ||
1082 | 1225 | BOOL result; |
1083 | 1226 | |
1084 | 1227 | /* ウィンドウクラスを登録 */ |
1085 | - result = screen_register(); | |
1228 | + result = screen_register_class(); | |
1086 | 1229 | assert(FALSE != result); |
1087 | 1230 | if (FALSE == result) |
1088 | 1231 | { |
@@ -1102,7 +1245,6 @@ BOOL screen_init(void) | ||
1102 | 1245 | */ |
1103 | 1246 | BOOL screen_create(SCREEN_OBJECT *screen) |
1104 | 1247 | { |
1105 | - BOOL bResult; | |
1106 | 1248 | DWORD dwStyle; |
1107 | 1249 | |
1108 | 1250 | assert(NULL != screen); |
@@ -1116,7 +1258,13 @@ BOOL screen_create(SCREEN_OBJECT *screen) | ||
1116 | 1258 | assert(0 <= screen->height); |
1117 | 1259 | |
1118 | 1260 | /* スクリーン側が管理する領域 */ |
1119 | - memset(&screen->virt, 0, sizeof(screen->virt)); | |
1261 | + bdlist_init((BDLIST_ENTRY*)screen); | |
1262 | + memset(&screen->real, 0, sizeof(SCREEN_REAL_SCREEN)); | |
1263 | + memset(&screen->virt, 0, sizeof(SCREEN_VIRT_SCREEN)); | |
1264 | + screen->x_real = 0; | |
1265 | + screen->y_real = 0; | |
1266 | + screen->fore_real = screen->fore_def; | |
1267 | + screen->back_real = screen->back_def; | |
1120 | 1268 | screen->update = FALSE; |
1121 | 1269 | screen->destroy = FALSE; |
1122 | 1270 | screen->hwnd = NULL; |
@@ -1160,8 +1308,6 @@ BOOL screen_create(SCREEN_OBJECT *screen) | ||
1160 | 1308 | */ |
1161 | 1309 | void screen_resize(SCREEN_OBJECT *screen) |
1162 | 1310 | { |
1163 | - BOOL bResult; | |
1164 | - | |
1165 | 1311 | assert(NULL != screen); |
1166 | 1312 | |
1167 | 1313 | /* 呼び出し元がセットする領域 */ |
@@ -1172,7 +1318,7 @@ void screen_resize(SCREEN_OBJECT *screen) | ||
1172 | 1318 | |
1173 | 1319 | if (NULL != screen->hwnd) |
1174 | 1320 | { |
1175 | - MoveWindow(screen->hwnd, screen->x, screen->y, screen->width, screen->height, FALSE); | |
1321 | + MoveWindow(screen->hwnd, screen->x, screen->y, screen->width, screen->height, TRUE); | |
1176 | 1322 | } |
1177 | 1323 | } |
1178 | 1324 |
@@ -1182,5 +1328,56 @@ void screen_resize(SCREEN_OBJECT *screen) | ||
1182 | 1328 | */ |
1183 | 1329 | void screen_idle(void) |
1184 | 1330 | { |
1331 | + SCREEN_OBJECT *object; | |
1332 | + | |
1333 | + /* 最初のオブジェクトを取得 */ | |
1334 | + object = g_screen_object_head; | |
1335 | + | |
1336 | + /* オブジェクトが有効である限りループ */ | |
1337 | + while (NULL != object) | |
1338 | + { | |
1339 | + /* 描画 */ | |
1340 | + screen_draw_object(object); | |
1341 | + | |
1342 | + /* 次のオブジェクトへ */ | |
1343 | + object = (SCREEN_OBJECT*)object->bdlist.bdlist_next; | |
1344 | + } | |
1185 | 1345 | } |
1186 | 1346 | |
1347 | +/* | |
1348 | + * スクリーン | |
1349 | + * 表示スクリーンの位置を指定 | |
1350 | + */ | |
1351 | +void screen_locate(SCREEN_OBJECT *screen, UINT x, UINT y) | |
1352 | +{ | |
1353 | + assert(NULL != screen); | |
1354 | + | |
1355 | + /* 記憶のみ */ | |
1356 | + screen->x_real = x; | |
1357 | + screen->y_real = y; | |
1358 | +} | |
1359 | + | |
1360 | +/* | |
1361 | + * スクリーン | |
1362 | + * 表示ラインに書式つき出力 | |
1363 | + */ | |
1364 | +void screen_printfw(SCREEN_OBJECT *screen, const wchar_t *format, ...) | |
1365 | +{ | |
1366 | + wchar_t buf[0x400]; | |
1367 | + va_list ap; | |
1368 | + SCREEN_REAL_LINE *line; | |
1369 | + UINT loop; | |
1370 | + | |
1371 | + assert(NULL != screen); | |
1372 | + assert(NULL != format); | |
1373 | + | |
1374 | + /* screen->y_realだけ移動したlineを得る */ | |
1375 | + | |
1376 | + /* フォーマット */ | |
1377 | + va_satrt(ap, format); | |
1378 | + vswprintf_s(buf, _countof(buf), format, ap); | |
1379 | + buf[_countof(buf) - 1] = L'\0'; | |
1380 | + va_end(ap); | |
1381 | + | |
1382 | + /* */ | |
1383 | +} |
@@ -10,11 +10,6 @@ | ||
10 | 10 | #include "bdlist.h" |
11 | 11 | |
12 | 12 | /* |
13 | - * ウィンドウクラス | |
14 | - */ | |
15 | -#define SCREEN_CLASS_NAME L"ScreenWindow" | |
16 | - | |
17 | -/* | |
18 | 13 | * キャラクタ構造体 |
19 | 14 | */ |
20 | 15 | typedef struct _SCREEN_CHR |
@@ -33,9 +28,9 @@ typedef struct _SCREEN_CHR | ||
33 | 28 | } SCREEN_CHR; |
34 | 29 | |
35 | 30 | /* |
36 | - * 仮想キャラクタ構造体 | |
31 | + * 表示キャラクタ構造体 | |
37 | 32 | */ |
38 | -typedef struct _SCREEN_VIRT_CHR | |
33 | +typedef struct _SCREEN_REAL_CHR | |
39 | 34 | { |
40 | 35 | /* 現在のキャラクタ */ |
41 | 36 | SCREEN_CHR current; |
@@ -48,27 +43,27 @@ typedef struct _SCREEN_VIRT_CHR | ||
48 | 43 | |
49 | 44 | /* 描画座標(全角) */ |
50 | 45 | RECT rect_kanji; |
51 | -} SCREEN_VIRT_CHR; | |
46 | +} SCREEN_REAL_CHR; | |
52 | 47 | |
53 | 48 | /* |
54 | - * 仮想ライン構造体 | |
49 | + * 表示ライン構造体 | |
55 | 50 | */ |
56 | -typedef struct _SCREEN_VIRT_LINE | |
51 | +typedef struct _SCREEN_REAL_LINE | |
57 | 52 | { |
58 | - /* 仮想ライン単位で双方向リストを構成 */ | |
53 | + /* 表示ライン単位で双方向リストを構成 */ | |
59 | 54 | BDLIST_ENTRY bdlist; |
60 | 55 | |
61 | 56 | /* このラインの文字数 */ |
62 | 57 | UINT chrs; |
63 | 58 | |
64 | - /* 仮想キャラクタ構造体の配列 */ | |
65 | - SCREEN_VIRT_CHR *chr; | |
66 | -} SCREEN_VIRT_LINE; | |
59 | + /* 表示キャラクタ構造体の配列 */ | |
60 | + SCREEN_REAL_CHR *buf; | |
61 | +} SCREEN_REAL_LINE; | |
67 | 62 | |
68 | 63 | /* |
69 | - * 仮想スクリーン構造体 | |
64 | + * 表示スクリーン構造体 | |
70 | 65 | */ |
71 | -typedef struct _SCREEN_VIRT_SCREEN | |
66 | +typedef struct _SCREEN_REAL_SCREEN | |
72 | 67 | { |
73 | 68 | /* ラインの方向 */ |
74 | 69 | BOOL dir_up; |
@@ -83,6 +78,33 @@ typedef struct _SCREEN_VIRT_SCREEN | ||
83 | 78 | UINT lines; |
84 | 79 | |
85 | 80 | /* 最初のライン */ |
81 | + SCREEN_REAL_LINE *head; | |
82 | +} SCREEN_REAL_SCREEN; | |
83 | + | |
84 | +/* | |
85 | + * 仮想ライン構造体 | |
86 | + */ | |
87 | +typedef struct _SCREEN_VIRT_LINE | |
88 | +{ | |
89 | + /* 仮想ライン単位で双方向リストを構成 */ | |
90 | + BDLIST_ENTRY bdlist; | |
91 | + | |
92 | + /* このラインの文字数 */ | |
93 | + UINT chrs; | |
94 | + | |
95 | + /* キャラクタ構造体の配列 */ | |
96 | + SCREEN_CHR *buf; | |
97 | +} SCREEN_VIRT_LINE; | |
98 | + | |
99 | +/* | |
100 | + * 仮想スクリーン構造体 | |
101 | + */ | |
102 | +typedef struct _SCREEN_VIRT_SCREEN | |
103 | +{ | |
104 | + /* ラインの数 */ | |
105 | + UINT lines; | |
106 | + | |
107 | + /* 最初のライン */ | |
86 | 108 | SCREEN_VIRT_LINE *head; |
87 | 109 | } SCREEN_VIRT_SCREEN; |
88 | 110 |
@@ -129,14 +151,29 @@ typedef struct _SCREEN_OBJECT | ||
129 | 151 | * スクリーン側が管理する領域 |
130 | 152 | */ |
131 | 153 | |
154 | + /* 表示スクリーン */ | |
155 | + SCREEN_REAL_SCREEN real; | |
156 | + | |
132 | 157 | /* 仮想スクリーン */ |
133 | 158 | SCREEN_VIRT_SCREEN virt; |
134 | 159 | |
135 | 160 | /* 描画中のフォアグラウンドカラー */ |
136 | - COLORREF fore; | |
161 | + COLORREF fore_draw; | |
137 | 162 | |
138 | 163 | /* 描画中のバックグラウンドカラー */ |
139 | - COLORREF back; | |
164 | + COLORREF back_draw; | |
165 | + | |
166 | + /* 表示スクリーンのx座標 */ | |
167 | + UINT x_real; | |
168 | + | |
169 | + /* 表示スクリーンのy座標 */ | |
170 | + UINT y_real; | |
171 | + | |
172 | + /* 表示スクリーンのフォアグラウンドカラー */ | |
173 | + COLORREF fore_real; | |
174 | + | |
175 | + /* 表示スクリーンのバックグラウンドカラー */ | |
176 | + COLORREF back_real; | |
140 | 177 | |
141 | 178 | /* 更新要求フラグ */ |
142 | 179 | BOOL update; |
@@ -162,4 +199,10 @@ BOOL screen_create(SCREEN_OBJECT *screen); | ||
162 | 199 | void screen_resize(SCREEN_OBJECT *screen); |
163 | 200 | |
164 | 201 | /* アイドル */ |
165 | -void screen_idle(SCREEN_OBJECT *screen); | |
202 | +void screen_idle(void); | |
203 | + | |
204 | +/* 表示スクリーンの位置を指定 */ | |
205 | +void screen_locate(SCREEN_OBJECT *screen, UINT x, UINT y); | |
206 | + | |
207 | +/* 表示スクリーンへ書式つき出力 */ | |
208 | +void screen_printfw(SCREEN_OBJECT *screen, const wchar_t *format, ...); |
@@ -323,6 +323,14 @@ static BOOL OnCreate(HWND hWnd, const CREATESTRUCT *lpcs) | ||
323 | 323 | /* スクリーンとログのサイズを算出 */ |
324 | 324 | CalcSubWidthSize(hWnd); |
325 | 325 | |
326 | + /* スクリーンの初期化 */ | |
327 | + bResult = screen_init(); | |
328 | + assert(FALSE != bResult); | |
329 | + if (FALSE == bResult) | |
330 | + { | |
331 | + return FALSE; | |
332 | + } | |
333 | + | |
326 | 334 | /* モニタを作成 */ |
327 | 335 | bResult = monitor_init(hWnd, (int)g_lConsoleWidth, 0, (int)g_lScreenWidth, (int)g_lScreenHeight); |
328 | 336 | assert(FALSE != bResult); |