标题栏内存占用 / 样式区增益与取绝对值·中心反转 / 拾色器排版 / 图例去托底与命中优先级
标题栏: - 应用名称后追加「 | RAM : <值>」:竖线两侧各留两个空格(与分组标题「组X | 组名」的间距风格一致)。 - 数值按 KB/MB/GB 自适应、保留两位小数(复用 FormatByteSize);用 K32GetProcessMemoryInfo 取本进程 工作集(与任务管理器「内存」一致,无需新增链接依赖);1 秒定时器刷新,数值未变时不调用 SetWindowTextW。 信号样式自定义栏: - 线宽与透明度交换上下位置(线宽在上、透明度在下)。 - 新增「系数增益」:输入框(默认 1,只接受数值,范围 ±10000),点击进入编辑、回车/点击别处提交。 - 新增「取绝对值」「中心反转」两个同行的切换按钮。 - 三者作用顺序固定为「系数增益 → 取绝对值 → 中心反转」(中心反转最后结算),实现为 ApplyDrawTransform(style, value),在 BuildPolyline(逐点描边与像素列包络两条路径,含粗粒度分组层)、 派生预览曲线与光标取值读数统一调用;样式属于信号本身(跨视图共享)并进入 SceneContentHash / SceneStyleEntry / 折线缓存键,改动会立即重绘。 - 非保序变换(取绝对值 / 反转 / 负增益)会回退到逐采样点变换、不再使用粗粒度包络层,保证包络精确。 自定义颜色面板: - 把底部的「色号 + 预览色块」移到 RGB 滑块上方;右侧一列(预览行 + 三行滑块)与左侧「色域方块 + 色相条」高度严格相等,两列上下边对齐,面板不再为它单独保留一行。 网格内: - 去掉图例与 GX 编号下方的整块不透明托底(它会把网格线整片擦掉,看起来像一个"可点击控件", 而其右侧空白实际并不响应点击)。 - 图例与 GX 徽标改为优先命中:先于时间光标线 / 光标读数 / 边沿计数横向光标 / 选区放大判定, 因此选区放大模式下也能正常拖拽 GX 标签与点选图例(浮动面板仍然优先,与绘制层序一致)。 验证:离屏 harness(.preflight/uitest,SW_HIDE、不动鼠标键盘屏幕)新增 [AK] 标题栏内存读数(格式与竖线间隙、单位阈值、两位小数、随 256MB 分配增长、定时器刷新); [AL] 样式区行序与几何、增益输入提交、两个切换按钮的真实点击、ApplyDrawTransform 顺序,以及 BuildPolyline 顶点范围与变换后数据范围逐项对齐(默认 / 增益 2 / 取绝对值 / 中心反转 / 负增益+取绝对值+中心反转叠加); [AM] 拾色器两列严格等高(140.00 == 140.00); [AN] 选区放大模式下 GX 拖拽重排 + 图例点选 + 网格线穿过图例带(托底已移除)。 另修正旧用例 [AI](远端已删除"光标跟随视界",改为断言光标时间位置不变、允许滑出视窗)。 合计 530/530 通过;make clean && make all 零警告。
This commit is contained in:
1 parent
20b90848fe
commit
c3343907ec
8 files changed
+420
-105
No files matched your search
@@ -6,6 +6,7 @@
|
||||
#include <thread>
|
||||
|
||||
#include <commdlg.h>
|
||||
#include <psapi.h>
|
||||
#include <shellapi.h>
|
||||
#include <windowsx.h>
|
||||
|
||||
@@ -27,7 +28,16 @@ namespace jdi
|
||||
namespace
|
||||
{
|
||||
const wchar_t* kWindowClassName = L"JustDataInspectorMainWindow"; /**< 窗口类名。 */
|
||||
const wchar_t* kWindowTitle = L"Just DataInspector"; /**< 窗口标题(仅显示应用名称)。 */
|
||||
const wchar_t* kWindowTitle = L"Just DataInspector"; /**< 窗口标题中的应用名称部分。 */
|
||||
/**
|
||||
* @brief 应用名称与内存占用之间的分隔竖线。
|
||||
*
|
||||
* 与信号分组标题里「组X | 组名」的分隔方式一致:竖线两侧各留出空隙
|
||||
*(`kGroupSeparatorGap` 是那个分隔线的左右间距,这里用两个空格达到同等观感)。
|
||||
*/
|
||||
const wchar_t* kTitleSeparator = L" | ";
|
||||
/** @brief 内存占用的显示前缀(与具体数值之间保留一个空格)。 */
|
||||
const wchar_t* kRamTitlePrefix = L"RAM : ";
|
||||
const float kSplitterWidth = 4.0f; /**< 分隔条宽度(逻辑像素)。 */
|
||||
const float kMinPanelWidth = 260.0f; /**< 面板最小宽度(逻辑像素)。 */
|
||||
const float kMaxPanelWidth = 400.0f; /**< 面板最大宽度(逻辑像素)。 */
|
||||
@@ -37,6 +47,29 @@ namespace jdi
|
||||
const UINT kMessageRemoveSignal = WM_APP + 2; /**< 面板请求移除单个信号的自定义消息。 */
|
||||
const UINT_PTR kHintTimerId = 1; /**< 提示浮层淡出用的定时器 ID。 */
|
||||
const UINT kHintTimerPeriodMs = 33; /**< 提示浮层淡出的重绘间隔(约 30fps)。 */
|
||||
const UINT_PTR kRamTimerId = 2; /**< 标题栏内存占用刷新的定时器 ID。 */
|
||||
const UINT kRamTimerPeriodMs = 1000; /**< 标题栏内存占用的刷新间隔(1 秒)。 */
|
||||
|
||||
/**
|
||||
* @brief 查询本进程当前占用的物理内存(工作集)。
|
||||
*
|
||||
* 与任务管理器里显示的“内存”一致:进程已驻留在物理内存中的字节数。
|
||||
* 使用 `K32GetProcessMemoryInfo`(kernel32 导出)以免为 `psapi` 增加一条链接依赖。
|
||||
*
|
||||
* @return 工作集字节数;查询失败返回 0。
|
||||
*/
|
||||
unsigned long long ProcessWorkingSetBytes()
|
||||
{
|
||||
PROCESS_MEMORY_COUNTERS_EX counters = {};
|
||||
counters.cb = sizeof(counters);
|
||||
if (K32GetProcessMemoryInfo(GetCurrentProcess(),
|
||||
reinterpret_cast<PROCESS_MEMORY_COUNTERS*>(&counters),
|
||||
sizeof(counters)) == FALSE)
|
||||
{
|
||||
return 0ull;
|
||||
}
|
||||
return static_cast<unsigned long long>(counters.WorkingSetSize);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 只失效绘图区所在的矩形。
|
||||
@@ -345,6 +378,8 @@ namespace jdi
|
||||
NewTab();
|
||||
|
||||
Relayout();
|
||||
// 标题栏内存占用按固定间隔刷新(不使用每帧刷新,避免频繁改动窗口标题)。
|
||||
SetTimer(m_hwnd, kRamTimerId, kRamTimerPeriodMs, nullptr);
|
||||
ShowWindow(m_hwnd, showCommand);
|
||||
UpdateWindow(m_hwnd);
|
||||
LoadCommandLineFiles();
|
||||
@@ -862,8 +897,19 @@ namespace jdi
|
||||
|
||||
void Application::UpdateWindowTitle()
|
||||
{
|
||||
// 标题栏只显示应用名称,不附带标签页、文件数量等无关信息。
|
||||
SetWindowTextW(m_hwnd, kWindowTitle);
|
||||
// 标题栏 = 应用名称 + 分隔竖线 + 内存占用(单位在 KB/MB/GB 间自适应,保留两位小数)。
|
||||
// 除内存占用外不再附带标签页、文件数量等无关信息。
|
||||
std::wstring title = kWindowTitle;
|
||||
title += kTitleSeparator;
|
||||
title += kRamTitlePrefix;
|
||||
title += FormatByteSize(ProcessWorkingSetBytes());
|
||||
// 数值未变化时不调用 SetWindowTextW,避免无谓地重绘标题栏。
|
||||
if (title == m_windowTitleText)
|
||||
{
|
||||
return;
|
||||
}
|
||||
m_windowTitleText = title;
|
||||
SetWindowTextW(m_hwnd, m_windowTitleText.c_str());
|
||||
}
|
||||
|
||||
void Application::OpenFileDialog()
|
||||
@@ -2748,6 +2794,12 @@ namespace jdi
|
||||
}
|
||||
case WM_TIMER:
|
||||
{
|
||||
// 标题栏内存占用:只改窗口标题,不动客户区,因此无需重绘。
|
||||
if (wParam == kRamTimerId)
|
||||
{
|
||||
UpdateWindowTitle();
|
||||
return 0;
|
||||
}
|
||||
// 提示浮层淡出:仅重绘,不再做其它处理;Render 会在淡出结束后停表。
|
||||
if (wParam == kHintTimerId)
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user