• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

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

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


Commit MetaInfo

Revisión1e50466f03af3bb2c0a7b1bde18ef83b3e3b0b4c (tree)
Tiempo2018-05-07 22:56:34
AutorYasushi Tanaka <tanaka_yasushi2008@yaho...>
CommiterYasushi Tanaka

Log Message

マウスでのスクロールOK

Cambiar Resumen

Diferencia incremental

--- a/DebugMonitor/src/framework/cons.c
+++ b/DebugMonitor/src/framework/cons.c
@@ -82,7 +82,10 @@ void cons_idle(void)
8282 }
8383 g_dwTime += 200;
8484
85- cons_printf("g_dwTime = %d", g_dwTime);
85+ if (g_cons_screen.virt.lines < 60)
86+ {
87+ cons_printf("Lines = %02d, g_dwTime = %d", g_cons_screen.virt.lines, g_dwTime);
88+ }
8689 }
8790
8891 /*
--- a/DebugMonitor/src/framework/screen.c
+++ b/DebugMonitor/src/framework/screen.c
@@ -1075,6 +1075,8 @@ static void screen_virt_scrollrange(SCREEN_OBJECT *object)
10751075 {
10761076 SCROLLINFO prev;
10771077 SCROLLINFO info;
1078+ BOOL pos;
1079+ int diff;
10781080
10791081 assert(NULL != object);
10801082
@@ -1084,16 +1086,16 @@ static void screen_virt_scrollrange(SCREEN_OBJECT *object)
10841086 return;
10851087 }
10861088
1087- /* 構造体を初期化 */
1089+ /* 現在のスクロールバー情報を得る */
10881090 memset(&prev, 0, sizeof(prev));
10891091 prev.cbSize = sizeof(prev);
1092+ prev.fMask = SIF_ALL;
1093+ GetScrollInfo(object->hwnd, SB_VERT, &prev);
1094+
1095+ /* 構造体を初期化 */
10901096 memset(&info, 0, sizeof(info));
10911097 info.cbSize = sizeof(info);
10921098
1093- /* 現在のスクロールバー情報を得る */
1094- prev.fMask = SIF_DISABLENOSCROLL | SIF_PAGE | SIF_POS | SIF_RANGE;
1095- GetScrollInfo(object->hwnd, SB_VERT, &prev);
1096-
10971099 /* 仮想行数 <= 表示行数であればスクロールバーは不要 */
10981100 if (object->virt.lines <= object->real.height_chr)
10991101 {
@@ -1106,21 +1108,52 @@ static void screen_virt_scrollrange(SCREEN_OBJECT *object)
11061108 return;
11071109 }
11081110
1109- /* スクロールバーの最大数は、仮想行数 - 表示行数 */
1111+ /* スクロールバーの範囲を設定 */
11101112 info.fMask = SIF_DISABLENOSCROLL | SIF_RANGE | SIF_PAGE;
11111113 info.nMin = 0;
11121114 info.nMax = object->virt.lines - 1;
11131115 info.nPage = object->real.height_chr;
1116+ SetScrollInfo(object->hwnd, SB_VERT, &info, TRUE);
1117+
1118+ /* 再度取得 */
1119+ info.fMask = SIF_ALL;
1120+ GetScrollInfo(object->hwnd, SB_VERT, &info);
1121+
1122+ /* 前回スクロールバーがなかったか、または最大位置であったかを判定 */
1123+ pos = FALSE;
1124+ if (prev.nMin == prev.nMax)
1125+ {
1126+ /* 前回はスクロールバーがなかった */
1127+ pos = TRUE;
1128+ }
1129+ if (prev.nPos == (int)(prev.nMax - prev.nPage + 1))
1130+ {
1131+ /* 前回はスクロールバーが最大位置にあった */
1132+ pos = TRUE;
1133+ }
11141134
1115- /* 前回がnPos=nMaxであれば、nPosをnMaxに設定 */
1116- if (prev.nPos == (int)(prev.nMax - (prev.nPage - 1)))
1135+ if (TRUE == pos)
11171136 {
11181137 /* 自動スクロール */
1119- info.fMask |= SIF_POS;
1120- info.nPos = info.nMax - (info.nPage - 1);
1138+ info.fMask = SIF_POS;
1139+ info.nPos = info.nMax - info.nPage + 1;
1140+ SetScrollInfo(object->hwnd, SB_VERT, &info, FALSE);
11211141 }
1142+ else
1143+ {
1144+ /* 過去のスクロール位置をキープするため、スクロールバーの増加量を知る */
1145+ diff = info.nMax - prev.nMax;
1146+ if (0 < diff)
1147+ {
1148+ /* スクロールバーの増加量に呼応して、表示開始位置をシフト */
1149+ object->virt.pos += (UINT)diff;
11221150
1123- SetScrollInfo(object->hwnd, SB_VERT, &info, TRUE);
1151+ /* スクロールバーの位置を変更 */
1152+ info.fMask = SIF_POS;
1153+ info.nPos = (UINT)(info.nMax - info.nPage + 1 - object->virt.pos);
1154+ SetScrollInfo(object->hwnd, SB_VERT, &info, FALSE);
1155+ }
1156+ }
11241157 }
11251158
11261159 /*
@@ -1136,9 +1169,23 @@ static void screen_virt_copy(SCREEN_OBJECT *object)
11361169
11371170 assert(NULL != object);
11381171
1139- /* スクロール位置はゼロ固定とする */
1140- pos = 0;
1172+ /* 縦方向でなければ何もしない */
1173+ if (FALSE == object->real.dir_up)
1174+ {
1175+ return;
1176+ }
1177+
1178+ /* スクロール位置からvirt_lineを取得 */
1179+ pos = object->virt.pos;
11411180 virt_line = object->virt.head;
1181+ for (loop = 0; loop < pos; loop++)
1182+ {
1183+ if (NULL != virt_line)
1184+ {
1185+ virt_line = (SCREEN_VIRT_LINE*)virt_line->bdlist.bdlist_next;
1186+ }
1187+ }
1188+
11421189 real_line = object->real.head;
11431190
11441191 /* realの行数だけループ */
@@ -1496,6 +1543,151 @@ static void screen_on_paint(HWND hWnd)
14961543
14971544 /*
14981545 * スクリーン
1546+ * WM_VSCOLLハンドラ
1547+ */
1548+static void screen_on_vscroll(HWND hWnd, WORD msg)
1549+{
1550+ SCREEN_OBJECT *object;
1551+ SCROLLINFO si;
1552+ int nVertPos;
1553+
1554+ assert(NULL != hWnd);
1555+
1556+ /* ウィンドウハンドルからオブジェクトを逆引きする */
1557+ object = screen_get_object(hWnd);
1558+ assert(NULL != object);
1559+ if (NULL == object)
1560+ {
1561+ return;
1562+ }
1563+
1564+ /* 現在のスクロール情報を取得 */
1565+ memset(&si, 0, sizeof(si));
1566+ si.cbSize = sizeof(si);
1567+ si.fMask = SIF_ALL;
1568+ GetScrollInfo(hWnd, SB_VERT, &si);
1569+
1570+ /* 現在の位置を記憶 */
1571+ nVertPos = si.nPos;
1572+
1573+ switch (msg)
1574+ {
1575+ /* 最も上*/
1576+ case SB_TOP:
1577+ si.nPos = si.nMin;
1578+ break;
1579+
1580+ /* 最も下 */
1581+ case SB_BOTTOM:
1582+ si.nPos = si.nMax;
1583+ break;
1584+
1585+ /* 一つ上に移動 */
1586+ case SB_LINEUP:
1587+ si.nPos--;
1588+ break;
1589+
1590+ /* 一つ下に移動 */
1591+ case SB_LINEDOWN:
1592+ si.nPos++;
1593+ break;
1594+
1595+ /* ページを上に移動 */
1596+ case SB_PAGEUP:
1597+ si.nPos -= (int)si.nPage;
1598+ break;
1599+
1600+ /* ページを下に移動 */
1601+ case SB_PAGEDOWN:
1602+ si.nPos += (int)si.nPage;
1603+ break;
1604+
1605+ /* つまみを移動 */
1606+ case SB_THUMBTRACK:
1607+ si.nPos = si.nTrackPos;
1608+ break;
1609+ }
1610+
1611+ /* ポジションを設定して、再度取得(WindowsによってnPosが変更されるため) */
1612+ si.fMask = SIF_POS;
1613+ SetScrollInfo(hWnd, SB_VERT, &si, TRUE);
1614+ GetScrollInfo(hWnd, SB_VERT, &si);
1615+
1616+ /* 過去の位置と異なっていれば、再描画 */
1617+ if (si.nPos != nVertPos)
1618+ {
1619+ /* ポジションを変更 */
1620+ assert(si.nPos <= (si.nMax - (int)si.nPage + 1));
1621+ if (si.nPos <= si.nMax - (int)si.nPage + 1)
1622+ {
1623+ /* 仮想スクリーンの表示開始位置を変更 */
1624+ object->virt.pos = (UINT)(si.nMax - si.nPage + 1 - si.nPos);
1625+
1626+ /* 仮想スクリーンから表示スクリーンへコピー */
1627+ screen_virt_copy(object);
1628+
1629+ /* WM_PAINTをポスト */
1630+ InvalidateRect(hWnd, NULL, FALSE);
1631+ }
1632+ }
1633+
1634+}
1635+
1636+/*
1637+ * スクリーン
1638+ * WM_KEYDOWNハンドラ
1639+ */
1640+static void screen_on_keydown(HWND hWnd, DWORD vk)
1641+{
1642+ SCREEN_OBJECT *object;
1643+
1644+ assert(NULL != hWnd);
1645+
1646+ /* ウィンドウハンドルからオブジェクトを逆引きする */
1647+ object = screen_get_object(hWnd);
1648+ assert(NULL != object);
1649+ if (NULL == object)
1650+ {
1651+ return;
1652+ }
1653+
1654+ /* 垂直スクロールバーがなければ、何もしない */
1655+ if (FALSE == object->vscroll)
1656+ {
1657+ return;
1658+ }
1659+
1660+ /* キー別 */
1661+ switch (vk)
1662+ {
1663+ case VK_HOME:
1664+ SendMessage(hWnd, WM_VSCROLL, SB_TOP, 0);
1665+ break;
1666+
1667+ case VK_END:
1668+ SendMessage(hWnd, WM_VSCROLL, SB_BOTTOM, 0);
1669+ break;
1670+
1671+ case VK_PRIOR:
1672+ SendMessage(hWnd, WM_VSCROLL, SB_PAGEUP, 0);
1673+ break;
1674+
1675+ case VK_NEXT:
1676+ SendMessage(hWnd, WM_VSCROLL, SB_PAGEDOWN, 0);
1677+ break;
1678+
1679+ case VK_UP:
1680+ SendMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0);
1681+ break;
1682+
1683+ case VK_DOWN:
1684+ SendMessage(hWnd, WM_VSCROLL, SB_LINEDOWN, 0);
1685+ break;
1686+ }
1687+}
1688+
1689+/*
1690+ * スクリーン
14991691 * ウィンドウプロシージャ
15001692 */
15011693 static LRESULT CALLBACK screen_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
@@ -1548,6 +1740,16 @@ static LRESULT CALLBACK screen_proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM
15481740 screen_on_paint(hWnd);
15491741 return 0;
15501742
1743+ /* 垂直スクロールバーが操作された */
1744+ case WM_VSCROLL:
1745+ screen_on_vscroll(hWnd, LOWORD(wParam));
1746+ return 0;
1747+
1748+ /* キーが押された */
1749+ case WM_KEYDOWN:
1750+ screen_on_keydown(hWnd, wParam);
1751+ return 0;
1752+
15511753 /* その他 */
15521754 default:
15531755 break;