• R/O
  • HTTP
  • SSH
  • HTTPS

提交

标签
No Tags

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

UART通信を用いた組み込みデバッグ用途向けメモリモニタ


Commit MetaInfo

修订版0ba3dee6c10f617112967be772611418ea6d0527 (tree)
时间2018-05-03 09:59:24
作者Yasushi Tanaka <tanaka_yasushi2008@yaho...>
CommiterYasushi Tanaka

Log Message

4月作業分

更改概述

差异

--- a/DebugMonitor/src/framework/bdlist.c
+++ b/DebugMonitor/src/framework/bdlist.c
@@ -10,6 +10,19 @@
1010
1111 /*
1212 * 双方向リスト
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+ * 双方向リスト
1326 * リストの終端を取得
1427 */
1528 BDLIST_ENTRY* bdlist_get_tail(BDLIST_ENTRY *bdlist)
--- a/DebugMonitor/src/framework/bdlist.h
+++ b/DebugMonitor/src/framework/bdlist.h
@@ -23,6 +23,9 @@ typedef struct _BDLIST_ENTRY
2323 * グローバル関数
2424 */
2525
26+/* リストを初期化 */
27+void bdlist_init(BDLIST_ENTRY *bdlist);
28+
2629 /* リストの終端を取得 */
2730 BDLIST_ENTRY* bdlist_get_tail(BDLIST_ENTRY *bdlist);
2831
@@ -30,4 +33,4 @@ BDLIST_ENTRY* bdlist_get_tail(BDLIST_ENTRY *bdlist);
3033 void bdlist_insert_tail(BDLIST_ENTRY *bdlist, BDLIST_ENTRY *entry);
3134
3235 /* リストから取り外す */
33-BDLIST_ENTRY* bdlist_remove(BDLIST_ENTRY *entry)
36+BDLIST_ENTRY* bdlist_remove(BDLIST_ENTRY *entry);
--- a/DebugMonitor/src/framework/screen.c
+++ b/DebugMonitor/src/framework/screen.c
@@ -13,6 +13,9 @@
1313 * 定数
1414 */
1515
16+/* ウィンドウクラス*/
17+#define SCREEN_CLASS_NAME L"ScreenWindow"
18+
1619 /* スクリーン色定義(白色) */
1720 #define SCREEN_COLOR_WHITE (RGB(255, 255, 255))
1821
@@ -65,9 +68,9 @@ static BOOL screen_chr_is_equal(const SCREEN_CHR *chr1, const SCREEN_CHR *chr2)
6568
6669 /*
6770 * スクリーン
68- * キャラクタを描画
71+ * 表示キャラクタを描画
6972 */
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)
7174 {
7275 COLORREF fore_prev;
7376 COLORREF back_prev;
@@ -84,7 +87,7 @@ static BOOL screen_chr_draw(HDC hDC, SCREEN_VIRT_CHR *chr, SCREEN_OBJECT *object
8487 }
8588
8689 /* フォアグラウンドカラーの更新が必要か */
87- if (chr->current.fore != object->fore)
90+ if (chr->current.fore != object->fore_draw)
8891 {
8992 /* フォアグラウンドカラーを更新する */
9093 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
9598 }
9699
97100 /* 更新成功 */
98- object->fore = chr->current.fore;
101+ object->fore_draw = chr->current.fore;
99102 }
100103
101104 /* バックグラウンドカラーの更新が必要か */
102- if (chr->current.back != object->back)
105+ if (chr->current.back != object->back_draw)
103106 {
104107 /* バックグラウンドカラーを更新する */
105108 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
110113 }
111114
112115 /* 更新成功 */
113- object->back = chr->current.back;
116+ object->back_draw = chr->current.back;
114117 }
115118
116119 /* 右側であれば、化け防止のため半角スペースに強制変更する */
@@ -147,9 +150,9 @@ static BOOL screen_chr_draw(HDC hDC, SCREEN_VIRT_CHR *chr, SCREEN_OBJECT *object
147150
148151 /*
149152 * スクリーン
150- * ライン単位で比較
153+ * 表示ラインの比較
151154 */
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)
153156 {
154157 UINT loop;
155158 BOOL result;
@@ -163,13 +166,15 @@ static BOOL screen_line_is_equal(SCREEN_VIRT_LINE *line, SCREEN_OBJECT *object)
163166 return TRUE;
164167 }
165168
169+ assert(NULL != line->buf);
170+
166171 /* 上下方向が描画範囲を超えていれば常にTRUE(一致) */
167- if (0 > line->chr[0].rect_ank.bottom)
172+ if (0 > line->buf[0].rect_ank.bottom)
168173 {
169174 /* 描画範囲より上すぎる */
170175 return TRUE;
171176 }
172- if (object->height < line->chr[0].rect_ank.top)
177+ if (object->height < line->buf[0].rect_ank.top)
173178 {
174179 /* 描画範囲が下すぎる */
175180 return TRUE;
@@ -179,13 +184,13 @@ static BOOL screen_line_is_equal(SCREEN_VIRT_LINE *line, SCREEN_OBJECT *object)
179184 for (loop = 0; loop < line->chrs; loop++)
180185 {
181186 /* 左右方向が描画範囲を超えていれば打ち切る */
182- if (object->width < line->chr[loop].rect_ank.left)
187+ if (object->width < line->buf[loop].rect_ank.left)
183188 {
184189 break;
185190 }
186191
187192 /* 比較結果を得る */
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);
189194 if (result == FALSE)
190195 {
191196 /* 不一致キャラクタを検出 */
@@ -199,9 +204,9 @@ static BOOL screen_line_is_equal(SCREEN_VIRT_LINE *line, SCREEN_OBJECT *object)
199204
200205 /*
201206 * スクリーン
202- * ライン単位で描画
207+ * 表示ラインの描画
203208 */
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)
205210 {
206211 UINT loop;
207212 BOOL result;
@@ -217,15 +222,15 @@ static BOOL screen_line_draw(HDC hDC, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *obj
217222 }
218223
219224 /* キャラクタ数は1以上 */
220- assert(NULL != line->chr);
225+ assert(NULL != line->buf);
221226
222227 /* 上下方向が描画範囲を超えていればFALSEを返す */
223- if (0 > line->chr[0].rect_ank.bottom)
228+ if (0 > line->buf[0].rect_ank.bottom)
224229 {
225230 /* 描画範囲より上すぎる */
226231 return FALSE;
227232 }
228- if (object->height < line->chr[0].rect_ank.top)
233+ if (object->height < line->buf[0].rect_ank.top)
229234 {
230235 /* 描画範囲が下すぎる */
231236 return FALSE;
@@ -235,13 +240,13 @@ static BOOL screen_line_draw(HDC hDC, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *obj
235240 for (loop = 0; loop < line->chrs; loop++)
236241 {
237242 /* 左右方向が描画範囲を超えていれば打ち切る */
238- if (object->width < line->chr[loop].rect_ank.left)
243+ if (object->width < line->buf[loop].rect_ank.left)
239244 {
240245 break;
241246 }
242247
243248 /* 1キャラクタ描画 */
244- result = screen_chr_draw(hDC, &line->chr[loop], object);
249+ result = screen_realchr_draw(hDC, &line->buf[loop], object);
245250
246251 /* 実際に描画していて */
247252 if (result == TRUE)
@@ -250,28 +255,31 @@ static BOOL screen_line_draw(HDC hDC, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *obj
250255 if (loop < (line->chrs - 1))
251256 {
252257 /* 全角か */
253- if (0x0100 <= line->chr[loop].current.chr)
258+ if (0x0100 <= line->buf[loop].current.chr)
254259 {
255260 /* 左側か */
256- if (FALSE == line->chr[loop].current.right)
261+ if (FALSE == line->buf[loop].current.right)
257262 {
258263 /* 左側を描画しているので、右側も一致させる */
259- line->chr[loop + 1].draw = line->chr[loop].draw;
264+ line->buf[loop + 1].draw = line->buf[loop].draw;
260265
261266 /* ただし右側とする */
262- line->chr[loop + 1].draw.right = TRUE;
267+ line->buf[loop + 1].draw.right = TRUE;
263268 }
264269 }
265270 }
266271 }
267272 }
273+
274+ /* 次の行に継続させるので、TRUEを返す */
275+ return TRUE;
268276 }
269277
270278 /*
271279 * スクリーン
272- * ライン矩形の再設定
280+ * 表示ライン矩形の再設定
273281 */
274-static void screen_line_rect(LONG top, SCREEN_VIRT_LINE *line)
282+static void screen_realline_setrect(LONG top, SCREEN_REAL_LINE *line)
275283 {
276284 UINT loop;
277285 LONG bottom;
@@ -285,23 +293,23 @@ static void screen_line_rect(LONG top, SCREEN_VIRT_LINE *line)
285293 for (loop = 0; loop < line->chrs; loop++)
286294 {
287295 /* 矩形(半角) */
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;
290298
291299 /* 矩形(全角) */
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;
294302 }
295303 }
296304
297305 /*
298306 * スクリーン
299- * ラインのリサイズ
307+ * 表示ラインのリサイズ
300308 */
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)
302310 {
303311 UINT loop;
304- SCREEN_VIRT_CHR *array;
312+ SCREEN_REAL_CHR *array;
305313 RECT rect_ank;
306314 RECT rect_kanji;
307315
@@ -309,25 +317,30 @@ static void screen_line_resize(LONG top, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *
309317 assert(object != NULL);
310318
311319 /* 現在のキャラクタ数と一致しているか、より大きければ */
312- if (object->virt.width_chr <= line->chrs)
320+ if (object->real.width_chr <= line->chrs)
313321 {
314322 /* 矩形を再設定するのみ */
315- screen_line_rect(top, line);
323+ screen_realline_setrect(top, line);
316324 return;
317325 }
318326
319327 /* 要求キャラクタ数が0なら何もしない */
320- if (0 == object->virt.width_chr)
328+ if (0 == object->real.width_chr)
321329 {
322330 return;
323331 }
324332
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);
328341
329342 /* 全ての最新キャラクタを半角スペースで初期化する */
330- for (loop = 0; loop < object->virt.width_chr; loop++)
343+ for (loop = 0; loop < object->real.width_chr; loop++)
331344 {
332345 array[loop].current.chr = L' ';
333346 array[loop].current.right = FALSE;
@@ -338,22 +351,22 @@ static void screen_line_resize(LONG top, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *
338351 /* 現在のキャラクタ数が1以上ならコピー */
339352 if (0 < line->chrs)
340353 {
341- assert(NULL != line->chr);
354+ assert(NULL != line->buf);
342355
343356 /* コピーして */
344- memcpy(array, line->chr, sizeof(SCREEN_VIRT_CHR) * line->chrs);
357+ memcpy(array, line->buf, sizeof(SCREEN_REAL_CHR) * line->chrs);
345358
346359 /* 古い配列を解放 */
347- free(line->chr);
348- line->chr = NULL;
360+ free(line->buf);
361+ line->buf = NULL;
349362 line->chrs = 0;
350363 }
351364
352365 /* ポインタをセット */
353- line->chr = array;
366+ line->buf = array;
354367
355368 /* 新しいキャラクタ数をセット */
356- line->chrs = object->virt.width_chr;
369+ line->chrs = object->real.width_chr;
357370
358371 /* 半角矩形を初期化 */
359372 rect_ank.left = 0;
@@ -371,8 +384,8 @@ static void screen_line_resize(LONG top, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *
371384 for (loop = 0; loop < line->chrs; loop++)
372385 {
373386 /* 矩形を更新 */
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;
376389
377390 /* コピー元矩形を、右側へ移動 */
378391 rect_ank.left += g_tm.tmAveCharWidth;
@@ -384,28 +397,28 @@ static void screen_line_resize(LONG top, SCREEN_VIRT_LINE *line, SCREEN_OBJECT *
384397
385398 /*
386399 * スクリーン
387- * ラインの破棄
400+ * 表示ラインの破棄
388401 */
389-static void screen_line_destroy(SCREEN_VIRT_LINE *line)
402+static void screen_realline_destroy(SCREEN_REAL_LINE *line)
390403 {
391- assret(NULL != line);
404+ assert(NULL != line);
392405
393406 /* 現在のキャラクタ数が0を超えていれば */
394407 if (0 < line->chrs)
395408 {
396409 /* キャラクタ配列を解放 */
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;
400413 line->chrs = 0;
401414 }
402415 }
403416
404417 /*
405418 * スクリーン
406- * ラインの無効化
419+ * 表示ラインの無効化
407420 */
408-static void screen_line_invalidate(SCREEN_VIRT_LINE *line)
421+static void screen_realline_invalidate(SCREEN_REAL_LINE *line)
409422 {
410423 UINT loop;
411424
@@ -415,69 +428,76 @@ static void screen_line_invalidate(SCREEN_VIRT_LINE *line)
415428 for (loop = 0; loop < line->chrs; loop++)
416429 {
417430 /* 描画済みキャラクタをヌル文字に変更 */
418- line->chr[loop].draw.chr = L'\0';
431+ assert(NULL != line->buf);
432+ line->buf[loop].draw.chr = L'\0';
419433 }
420434 }
421435
422436 /*
423437 * スクリーン
424- * 全てのラインのリサイズ
438+ * 表示スクリーンのリサイズ
425439 */
426-static void screen_allline_resize(SCREEN_OBJECT *object)
440+static void screen_real_resize(SCREEN_OBJECT *object)
427441 {
428442 UINT add;
429443 UINT loop;
430444 LONG top;
431- SCREEN_VIRT_LINE *line;
445+ SCREEN_REAL_LINE *line;
432446
433447 assert(NULL != object);
434448
435449 /* クライアント領域の幅から、キャラクタ数を決める(余りがあれば+1) */
436- object->virt.width_chr = object->width / g_tm.tmAveCharWidth;
450+ object->real.width_chr = object->width / g_tm.tmAveCharWidth;
437451 if (0 < object->width % g_tm.tmAveCharWidth)
438452 {
439- object->virt.width_chr++;
453+ object->real.width_chr++;
440454 }
441455
442456 /* クライアント領域の高さから、キャラクタ数を決める(余りがあれば+1) */
443- object->virt.height_chr = object->height / g_tmAllHeight;
457+ object->real.height_chr = object->height / g_tmAllHeight;
444458 if (0 < object->height % g_tmAllHeight)
445459 {
446- object->virt.height_chr++;
460+ object->real.height_chr++;
447461 }
448462
449463 /* 現在の行数 < 算出した行数の場合 */
450- if (object->virt.lines < object->virt.height_chr)
464+ if (object->real.lines < object->real.height_chr)
451465 {
452466 /* 現在存在する行数を考慮して、追加すべき行を算出する */
453- add = object->virt.height_chr - object->virt.lines;
467+ add = object->real.height_chr - object->real.lines;
454468
455469 /* 行を追加 */
456470 for (loop = 0; loop < add; loop++)
457471 {
458472 /* 新たな行オブジェクトを作成 */
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);
461481
462482 /* 最初の行か*/
463- if (NULL == object->virt.head)
483+ if (NULL == object->real.head)
464484 {
465485 /* 最初の行なので、そのままセット */
466- object->virt.head = line;
486+ object->real.head = line;
467487 }
468488 else
469489 {
470490 /* 終端に追加 */
471- bdlist_insert_tail((BDLIST_ENTRY*)object->virt.head, (BDLIST_ENTRY*)line);
491+ bdlist_insert_tail((BDLIST_ENTRY*)object->real.head, (BDLIST_ENTRY*)line);
472492 }
473493 }
474494
475495 /* 行の数を更新 */
476- object->virt.lines = object->virt.height_chr;
496+ object->real.lines = object->real.height_chr;
477497 }
478498
479499 /* dir_upを考慮して、topを決める */
480- if (TRUE == object->virt.dir_up)
500+ if (TRUE == object->real.dir_up)
481501 {
482502 /* 下方向から上方向に延びる*/
483503 top = object->height - g_tmAllHeight;
@@ -489,16 +509,16 @@ static void screen_allline_resize(SCREEN_OBJECT *object)
489509 }
490510
491511 /* 全ての行をリサイズ */
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++)
494514 {
495515 assert(NULL != line);
496516
497517 /* ラインのリサイズ */
498- screen_line_resize(top, line, object);
518+ screen_realline_resize(top, line, object);
499519
500520 /* topを更新 */
501- if (FALSE == object->virt.dir_up)
521+ if (FALSE == object->real.dir_up)
502522 {
503523 /* 上から下へ */
504524 top += g_tmAllHeight;
@@ -510,30 +530,30 @@ static void screen_allline_resize(SCREEN_OBJECT *object)
510530 }
511531
512532 /* 次のラインへ*/
513- line = (SCREEN_VIRT_LINE*)line->bdlist.bdlist_next;
533+ line = (SCREEN_REAL_LINE*)line->bdlist.bdlist_next;
514534 }
515535 }
516536
517537 /*
518538 * スクリーン
519-* 全てのラインの比較
539+* 表示スクリーンの比較
520540 */
521-static BOOL screen_allline_is_equal(SCREEN_OBJECT *object)
541+static BOOL screen_real_is_equal(SCREEN_OBJECT *object)
522542 {
523- SCREEN_VIRT_LINE *line;
543+ SCREEN_REAL_LINE *line;
524544 BOOL result;
525545
526546 assert(NULL != object);
527547
528548 /* 最初のラインを取得、戻り値をTRUEに初期化 */
529- line = object->virt.head;
549+ line = object->real.head;
530550 result = TRUE;
531551
532552 /* ラインが存在する限りループ */
533553 while (NULL != line)
534554 {
535555 /* このラインを比較 */
536- result = screen_line_is_equal(line, object);
556+ result = screen_realline_is_equal(line, object);
537557
538558 /* 結果がFALSEであれば直ちに抜ける */
539559 if (FALSE == result)
@@ -542,7 +562,7 @@ static BOOL screen_allline_is_equal(SCREEN_OBJECT *object)
542562 }
543563
544564 /* 次のラインを得る */
545- line = (BDLIST_ENTRY*)line->bdlist.bdlist_next;
565+ line = (SCREEN_REAL_LINE*)line->bdlist.bdlist_next;
546566 }
547567
548568 /* 結果を返す */
@@ -551,11 +571,11 @@ static BOOL screen_allline_is_equal(SCREEN_OBJECT *object)
551571
552572 /*
553573 * スクリーン
554-* 全てのラインの描画
574+* 表示スクリーンの描画
555575 */
556-static void screen_allline_draw(HDC hDC, SCREEN_OBJECT *object)
576+static void screen_real_draw(HDC hDC, SCREEN_OBJECT *object)
557577 {
558- SCREEN_VIRT_LINE *line;
578+ SCREEN_REAL_LINE *line;
559579 BOOL result;
560580 COLORREF fore_prev;
561581 COLORREF back_prev;
@@ -564,18 +584,31 @@ static void screen_allline_draw(HDC hDC, SCREEN_OBJECT *object)
564584 assert(object != NULL);
565585
566586 /* 最初のラインを得る */
567- line = object->virt.head;
587+ line = object->real.head;
568588
569589 /* フォアグラウンドカラーをデフォルト色にセット */
570590 fore_prev = SetTextColor(hDC, object->fore_def);
571591 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;
573606
574607 /* ラインが存在する限りループ */
575608 while (NULL != line)
576609 {
577610 /* このラインを描画 */
578- result = screen_line_draw(hDC, line, object);
611+ result = screen_realline_draw(hDC, line, object);
579612
580613 /* 描画範囲を超えていればFALSEが返る */
581614 if (FALSE == result)
@@ -584,31 +617,31 @@ static void screen_allline_draw(HDC hDC, SCREEN_OBJECT *object)
584617 }
585618
586619 /* 次のラインを得る */
587- line = (SCREEN_VIRT_LINE*)line->bdlist.bdlist_next;
620+ line = (SCREEN_REAL_LINE*)line->bdlist.bdlist_next;
588621 }
589622 }
590623
591624 /*
592625 * スクリーン
593- * 全てのラインの破棄
626+ * 表示スクリーンの破棄
594627 */
595-static void screen_allline_destroy(SCREEN_OBJECT *object)
628+static void screen_real_destroy(SCREEN_OBJECT *object)
596629 {
597- SCREEN_VIRT_LINE *line;
630+ SCREEN_REAL_LINE *line;
598631
599632 assert(NULL != object);
600633
601- /* 最初のラインが有効であればループ */
602- while (NULL != object->virt.head)
634+ /* 最初のラインが有効である限りループ */
635+ while (NULL != object->real.head)
603636 {
604637 /* ラインを記憶しておく */
605- line = object->virt.head;
606-
607- /* このラインを削除 */
608- screen_line_destroy(line);
638+ line = object->real.head;
609639
610640 /* リストから取り外す */
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);
612645
613646 /* 行オブジェクトを解放 */
614647 free(line);
@@ -617,25 +650,135 @@ static void screen_allline_destroy(SCREEN_OBJECT *object)
617650
618651 /*
619652 * スクリーン
620- * 全てのラインの無効化
653+ * 表示スクリーンの無効化
621654 */
622-static void screen_allline_invalidate(SCREEN_OBJECT *object)
655+static void screen_real_invalidate(SCREEN_OBJECT *object)
623656 {
624- SCREEN_VIRT_LINE *line;
657+ SCREEN_REAL_LINE *line;
625658
626659 assert(NULL != object);
627660
628661 /* 最初のラインを得る */
629- line = object->virt.head;
662+ line = object->real.head;
630663
631664 /* ラインが存在する限りループ */
632665 while (NULL != line)
633666 {
634667 /* このラインを無効化 */
635- screen_line_invalidate(line);
668+ screen_realline_invalidate(line);
636669
637670 /* 次のラインを得る */
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);
639782 }
640783 }
641784
@@ -670,7 +813,7 @@ static SCREEN_OBJECT* screen_get_object(HWND hwnd)
670813 }
671814
672815 /* 次へ移動 */
673- object = object->bdlist.bdlist_next;
816+ object = (SCREEN_OBJECT*)object->bdlist.bdlist_next;
674817 }
675818
676819 /* 見つかった */
@@ -700,8 +843,8 @@ static void screen_destroy_object(SCREEN_OBJECT *object)
700843 assert(NULL != object);
701844 assert(TRUE == object->destroy);
702845
703- /* 全てのラインを破棄 */
704- screen_allline_destroy(object);
846+ /* 仮想スクリーンを破棄 */
847+ screen_real_destroy(object);
705848
706849 /* 先頭かどうか */
707850 if (g_screen_object_head == object)
@@ -731,8 +874,8 @@ static void screen_update_object(SCREEN_OBJECT *object)
731874
732875 assert(NULL != object);
733876
734- /* 全てのラインを比較 */
735- result = screen_allline_is_equal(object);
877+ /* 仮想スクリーンを比較 */
878+ result = screen_real_is_equal(object);
736879 if (FALSE == result)
737880 {
738881 /* 描画要求をセット */
@@ -776,8 +919,8 @@ static void screen_draw_object(SCREEN_OBJECT *object)
776919 return;
777920 }
778921
779- /* 全てのラインを描画 */
780- screen_allline_draw(hDC, object);
922+ /* 表示スクリーンを描画 */
923+ screen_real_draw(hDC, object);
781924
782925 /* デバイスコンテキストを解放 */
783926 ReleaseDC(object->hwnd, hDC);
@@ -830,10 +973,10 @@ static BOOL screen_on_create(HWND hWnd, const LPCREATESTRUCT lpcs)
830973 }
831974
832975 /* 垂直スクロールバーの有無で方向を設定 */
833- object->virt.dir_up = object->vscroll;
976+ object->real.dir_up = object->vscroll;
834977
835978 /* リサイズによって仮想ラインを作成する */
836- screen_allline_resize(object);
979+ screen_real_resize(object);
837980
838981 /* スクリーンの先頭によって分ける */
839982 if (NULL == g_screen_object_head)
@@ -848,7 +991,7 @@ static BOOL screen_on_create(HWND hWnd, const LPCREATESTRUCT lpcs)
848991 }
849992
850993 /* 成功 */
851- return FALSE;
994+ return TRUE;
852995 }
853996
854997 /*
@@ -920,7 +1063,7 @@ static void screen_on_size(HWND hWnd, int width, int height)
9201063 object->height = height;
9211064
9221065 /* スクリーンのリサイズ */
923- screen_allline_resize(object);
1066+ screen_real_resize(object);
9241067 }
9251068
9261069 /*
@@ -944,7 +1087,7 @@ static void screen_on_paint(HWND hWnd)
9441087 }
9451088
9461089 /* 全てのラインを無効化 */
947- screen_allline_invalidate(object);
1090+ screen_real_invalidate(object);
9481091
9491092 /* 描画を開始(WM_ERASEBKGNDが送信される) */
9501093 hDC = BeginPaint(hWnd, &ps);
@@ -955,7 +1098,7 @@ static void screen_on_paint(HWND hWnd)
9551098 }
9561099
9571100 /* 全てのラインを描画 */
958- screen_allline_draw(hDC, object);
1101+ screen_real_draw(hDC, object);
9591102
9601103 /* 描画を終了 */
9611104 EndPaint(hWnd, &ps);
@@ -1082,7 +1225,7 @@ BOOL screen_init(void)
10821225 BOOL result;
10831226
10841227 /* ウィンドウクラスを登録 */
1085- result = screen_register();
1228+ result = screen_register_class();
10861229 assert(FALSE != result);
10871230 if (FALSE == result)
10881231 {
@@ -1102,7 +1245,6 @@ BOOL screen_init(void)
11021245 */
11031246 BOOL screen_create(SCREEN_OBJECT *screen)
11041247 {
1105- BOOL bResult;
11061248 DWORD dwStyle;
11071249
11081250 assert(NULL != screen);
@@ -1116,7 +1258,13 @@ BOOL screen_create(SCREEN_OBJECT *screen)
11161258 assert(0 <= screen->height);
11171259
11181260 /* スクリーン側が管理する領域 */
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;
11201268 screen->update = FALSE;
11211269 screen->destroy = FALSE;
11221270 screen->hwnd = NULL;
@@ -1160,8 +1308,6 @@ BOOL screen_create(SCREEN_OBJECT *screen)
11601308 */
11611309 void screen_resize(SCREEN_OBJECT *screen)
11621310 {
1163- BOOL bResult;
1164-
11651311 assert(NULL != screen);
11661312
11671313 /* 呼び出し元がセットする領域 */
@@ -1172,7 +1318,7 @@ void screen_resize(SCREEN_OBJECT *screen)
11721318
11731319 if (NULL != screen->hwnd)
11741320 {
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);
11761322 }
11771323 }
11781324
@@ -1182,5 +1328,56 @@ void screen_resize(SCREEN_OBJECT *screen)
11821328 */
11831329 void screen_idle(void)
11841330 {
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+ }
11851345 }
11861346
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+}
--- a/DebugMonitor/src/framework/screen.h
+++ b/DebugMonitor/src/framework/screen.h
@@ -10,11 +10,6 @@
1010 #include "bdlist.h"
1111
1212 /*
13- * ウィンドウクラス
14- */
15-#define SCREEN_CLASS_NAME L"ScreenWindow"
16-
17-/*
1813 * キャラクタ構造体
1914 */
2015 typedef struct _SCREEN_CHR
@@ -33,9 +28,9 @@ typedef struct _SCREEN_CHR
3328 } SCREEN_CHR;
3429
3530 /*
36- * 仮想キャラクタ構造体
31+ * 表示キャラクタ構造体
3732 */
38-typedef struct _SCREEN_VIRT_CHR
33+typedef struct _SCREEN_REAL_CHR
3934 {
4035 /* 現在のキャラクタ */
4136 SCREEN_CHR current;
@@ -48,27 +43,27 @@ typedef struct _SCREEN_VIRT_CHR
4843
4944 /* 描画座標(全角) */
5045 RECT rect_kanji;
51-} SCREEN_VIRT_CHR;
46+} SCREEN_REAL_CHR;
5247
5348 /*
54- * 仮想ライン構造体
49+ * 表示ライン構造体
5550 */
56-typedef struct _SCREEN_VIRT_LINE
51+typedef struct _SCREEN_REAL_LINE
5752 {
58- /* 仮想ライン単位で双方向リストを構成 */
53+ /* 表示ライン単位で双方向リストを構成 */
5954 BDLIST_ENTRY bdlist;
6055
6156 /* このラインの文字数 */
6257 UINT chrs;
6358
64- /* 仮想キャラクタ構造体の配列 */
65- SCREEN_VIRT_CHR *chr;
66-} SCREEN_VIRT_LINE;
59+ /* 表示キャラクタ構造体の配列 */
60+ SCREEN_REAL_CHR *buf;
61+} SCREEN_REAL_LINE;
6762
6863 /*
69- * 仮想スクリーン構造体
64+ * 表示スクリーン構造体
7065 */
71-typedef struct _SCREEN_VIRT_SCREEN
66+typedef struct _SCREEN_REAL_SCREEN
7267 {
7368 /* ラインの方向 */
7469 BOOL dir_up;
@@ -83,6 +78,33 @@ typedef struct _SCREEN_VIRT_SCREEN
8378 UINT lines;
8479
8580 /* 最初のライン */
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+ /* 最初のライン */
86108 SCREEN_VIRT_LINE *head;
87109 } SCREEN_VIRT_SCREEN;
88110
@@ -129,14 +151,29 @@ typedef struct _SCREEN_OBJECT
129151 * スクリーン側が管理する領域
130152 */
131153
154+ /* 表示スクリーン */
155+ SCREEN_REAL_SCREEN real;
156+
132157 /* 仮想スクリーン */
133158 SCREEN_VIRT_SCREEN virt;
134159
135160 /* 描画中のフォアグラウンドカラー */
136- COLORREF fore;
161+ COLORREF fore_draw;
137162
138163 /* 描画中のバックグラウンドカラー */
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;
140177
141178 /* 更新要求フラグ */
142179 BOOL update;
@@ -162,4 +199,10 @@ BOOL screen_create(SCREEN_OBJECT *screen);
162199 void screen_resize(SCREEN_OBJECT *screen);
163200
164201 /* アイドル */
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, ...);
--- a/DebugMonitor/src/framework/winmain.c
+++ b/DebugMonitor/src/framework/winmain.c
@@ -323,6 +323,14 @@ static BOOL OnCreate(HWND hWnd, const CREATESTRUCT *lpcs)
323323 /* スクリーンとログのサイズを算出 */
324324 CalcSubWidthSize(hWnd);
325325
326+ /* スクリーンの初期化 */
327+ bResult = screen_init();
328+ assert(FALSE != bResult);
329+ if (FALSE == bResult)
330+ {
331+ return FALSE;
332+ }
333+
326334 /* モニタを作成 */
327335 bResult = monitor_init(hWnd, (int)g_lConsoleWidth, 0, (int)g_lScreenWidth, (int)g_lScreenHeight);
328336 assert(FALSE != bResult);