UART通信を用いた組み込みデバッグ用途向けメモリモニタ
Revisión | 1e50466f03af3bb2c0a7b1bde18ef83b3e3b0b4c (tree) |
---|---|
Tiempo | 2018-05-07 22:56:34 |
Autor | ![]() |
Commiter | Yasushi Tanaka |
マウスでのスクロールOK
@@ -82,7 +82,10 @@ void cons_idle(void) | ||
82 | 82 | } |
83 | 83 | g_dwTime += 200; |
84 | 84 | |
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 | + } | |
86 | 89 | } |
87 | 90 | |
88 | 91 | /* |
@@ -1075,6 +1075,8 @@ static void screen_virt_scrollrange(SCREEN_OBJECT *object) | ||
1075 | 1075 | { |
1076 | 1076 | SCROLLINFO prev; |
1077 | 1077 | SCROLLINFO info; |
1078 | + BOOL pos; | |
1079 | + int diff; | |
1078 | 1080 | |
1079 | 1081 | assert(NULL != object); |
1080 | 1082 |
@@ -1084,16 +1086,16 @@ static void screen_virt_scrollrange(SCREEN_OBJECT *object) | ||
1084 | 1086 | return; |
1085 | 1087 | } |
1086 | 1088 | |
1087 | - /* 構造体を初期化 */ | |
1089 | + /* 現在のスクロールバー情報を得る */ | |
1088 | 1090 | memset(&prev, 0, sizeof(prev)); |
1089 | 1091 | prev.cbSize = sizeof(prev); |
1092 | + prev.fMask = SIF_ALL; | |
1093 | + GetScrollInfo(object->hwnd, SB_VERT, &prev); | |
1094 | + | |
1095 | + /* 構造体を初期化 */ | |
1090 | 1096 | memset(&info, 0, sizeof(info)); |
1091 | 1097 | info.cbSize = sizeof(info); |
1092 | 1098 | |
1093 | - /* 現在のスクロールバー情報を得る */ | |
1094 | - prev.fMask = SIF_DISABLENOSCROLL | SIF_PAGE | SIF_POS | SIF_RANGE; | |
1095 | - GetScrollInfo(object->hwnd, SB_VERT, &prev); | |
1096 | - | |
1097 | 1099 | /* 仮想行数 <= 表示行数であればスクロールバーは不要 */ |
1098 | 1100 | if (object->virt.lines <= object->real.height_chr) |
1099 | 1101 | { |
@@ -1106,21 +1108,52 @@ static void screen_virt_scrollrange(SCREEN_OBJECT *object) | ||
1106 | 1108 | return; |
1107 | 1109 | } |
1108 | 1110 | |
1109 | - /* スクロールバーの最大数は、仮想行数 - 表示行数 */ | |
1111 | + /* スクロールバーの範囲を設定 */ | |
1110 | 1112 | info.fMask = SIF_DISABLENOSCROLL | SIF_RANGE | SIF_PAGE; |
1111 | 1113 | info.nMin = 0; |
1112 | 1114 | info.nMax = object->virt.lines - 1; |
1113 | 1115 | 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 | + } | |
1114 | 1134 | |
1115 | - /* 前回がnPos=nMaxであれば、nPosをnMaxに設定 */ | |
1116 | - if (prev.nPos == (int)(prev.nMax - (prev.nPage - 1))) | |
1135 | + if (TRUE == pos) | |
1117 | 1136 | { |
1118 | 1137 | /* 自動スクロール */ |
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); | |
1121 | 1141 | } |
1142 | + else | |
1143 | + { | |
1144 | + /* 過去のスクロール位置をキープするため、スクロールバーの増加量を知る */ | |
1145 | + diff = info.nMax - prev.nMax; | |
1146 | + if (0 < diff) | |
1147 | + { | |
1148 | + /* スクロールバーの増加量に呼応して、表示開始位置をシフト */ | |
1149 | + object->virt.pos += (UINT)diff; | |
1122 | 1150 | |
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 | + } | |
1124 | 1157 | } |
1125 | 1158 | |
1126 | 1159 | /* |
@@ -1136,9 +1169,23 @@ static void screen_virt_copy(SCREEN_OBJECT *object) | ||
1136 | 1169 | |
1137 | 1170 | assert(NULL != object); |
1138 | 1171 | |
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; | |
1141 | 1180 | 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 | + | |
1142 | 1189 | real_line = object->real.head; |
1143 | 1190 | |
1144 | 1191 | /* realの行数だけループ */ |
@@ -1496,6 +1543,151 @@ static void screen_on_paint(HWND hWnd) | ||
1496 | 1543 | |
1497 | 1544 | /* |
1498 | 1545 | * スクリーン |
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 | + * スクリーン | |
1499 | 1691 | * ウィンドウプロシージャ |
1500 | 1692 | */ |
1501 | 1693 | 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 | ||
1548 | 1740 | screen_on_paint(hWnd); |
1549 | 1741 | return 0; |
1550 | 1742 | |
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 | + | |
1551 | 1753 | /* その他 */ |
1552 | 1754 | default: |
1553 | 1755 | break; |