feat: 搭建 Just DataInspector 波形数据查看器基础功能
基于 Win32 API + GDI+ 从零实现仿真数据检查器,用于替代 Simulink.sdi.view 查看带时间轴的 CSV 数据。 - 新增 Utilities 层:UTF-8/宽字符与数值格式化工具、CSV 解析器(自动识别分隔符与引号)、 信号数据集模型(时间轴识别、信号名解析、取值采样)、Solarised Light 主题色板与绘图基础工具 - 新增 Toolbar 组件:打开 CSV、适应窗口、适应时间、放大、缩小、合并网格、每信号一格 - 新增 SignalPanel 组件:信号列表(可见性开关、颜色标识、所属网格标记)、样式编辑区 (颜色、线宽、线段/散点/点线/阶梯显示方式、所属网格),支持右键上下文菜单与滚轮滚动 - 新增 PlotView 组件:多网格波形绘制、自适应时间轴与幅值轴、网格线、信号图例、 时间光标与实时数值读数、纵向滚动条 - 新增 Application 组件:DPI 感知(Per-Monitor V2)、双缓冲绘制、区域布局与分隔条拖拽、 鼠标与键盘消息分发、文件拖放、状态栏提示 - 交互能力:滚轮缩放、Shift+滚轮平移、Ctrl+滚轮缩放幅值、拖拽平移、幅值轴纵向缩放、 右键框选缩放、单击固定/取消时间光标、双击自适应、方向键平移与滚动 - 补齐 Makefile 的源文件与头文件索引,并新增 gdiplus、comdlg32 链接库
This commit is contained in:
commit
132b305544
22 files changed
+7146
No files matched your search
@@ -0,0 +1,163 @@
|
||||
#ifndef __PAINT_UTIL_HPP__
|
||||
#define __PAINT_UTIL_HPP__
|
||||
|
||||
#include <windows.h>
|
||||
#include <objidl.h>
|
||||
#include <gdiplus.h>
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
#include "Theme.hpp"
|
||||
|
||||
namespace jdi
|
||||
{
|
||||
|
||||
/**
|
||||
* @brief 文本水平对齐方式(垂直方向始终居中)。
|
||||
*/
|
||||
enum class TextAlign : int
|
||||
{
|
||||
LEFT = 0, /**< 左对齐。 */
|
||||
CENTER = 1, /**< 水平居中。 */
|
||||
RIGHT = 2 /**< 右对齐。 */
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 按 DPI 创建并缓存整套界面字体(GDI 字体句柄)。
|
||||
*/
|
||||
struct UiFonts
|
||||
{
|
||||
HFONT ui = nullptr; /**< 常规界面字体。 */
|
||||
HFONT uiBold = nullptr; /**< 加粗界面字体。 */
|
||||
HFONT uiSmall = nullptr; /**< 小号界面字体。 */
|
||||
HFONT uiSmallBold = nullptr;/**< 小号加粗界面字体。 */
|
||||
HFONT title = nullptr; /**< 标题字体。 */
|
||||
HFONT mono = nullptr; /**< 等宽数值字体。 */
|
||||
HFONT monoSmall = nullptr; /**< 小号等宽字体。 */
|
||||
UINT dpi = 96; /**< 创建时所使用的 DPI。 */
|
||||
|
||||
/**
|
||||
* @brief 依据 DPI 创建全部字体。
|
||||
* @param [IN] dpi 目标 DPI(96 对应 100% 缩放)。
|
||||
* @return 创建成功返回 true。
|
||||
*/
|
||||
bool Create(UINT dpi);
|
||||
|
||||
/**
|
||||
* @brief 释放全部字体句柄。
|
||||
*/
|
||||
void Destroy();
|
||||
|
||||
~UiFonts() { Destroy(); }
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 将 0xAARRGGBB 颜色值转换为 GDI COLORREF。
|
||||
* @param [IN] argb 颜色值。
|
||||
* @return GDI 颜色值。
|
||||
*/
|
||||
inline COLORREF ToColorRef(std::uint32_t argb)
|
||||
{
|
||||
return RGB((argb >> 16) & 0xFFu, (argb >> 8) & 0xFFu, argb & 0xFFu);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 判断点是否落在矩形内部。
|
||||
* @param [IN] rect 目标矩形。
|
||||
* @param [IN] x 横坐标。
|
||||
* @param [IN] y 纵坐标。
|
||||
* @return 落在内部返回 true。
|
||||
*/
|
||||
inline bool UiPointInRect(const gd::RectF& rect, float x, float y)
|
||||
{
|
||||
return x >= rect.X && x <= (rect.X + rect.Width) && y >= rect.Y && y <= (rect.Y + rect.Height);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 填充矩形区域。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] rect 目标矩形。
|
||||
* @param [IN] argb 填充颜色。
|
||||
*/
|
||||
void UiFillRect(gd::Graphics& g, const gd::RectF& rect, std::uint32_t argb);
|
||||
|
||||
/**
|
||||
* @brief 填充圆角矩形区域。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] rect 目标矩形。
|
||||
* @param [IN] radius 圆角半径。
|
||||
* @param [IN] argb 填充颜色。
|
||||
*/
|
||||
void UiFillRoundRect(gd::Graphics& g, const gd::RectF& rect, float radius, std::uint32_t argb);
|
||||
|
||||
/**
|
||||
* @brief 描边圆角矩形。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] rect 目标矩形。
|
||||
* @param [IN] radius 圆角半径。
|
||||
* @param [IN] argb 线条颜色。
|
||||
* @param [IN] width 线条宽度。
|
||||
*/
|
||||
void UiDrawRoundRect(gd::Graphics& g, const gd::RectF& rect, float radius, std::uint32_t argb, float width);
|
||||
|
||||
/**
|
||||
* @brief 绘制一条直线。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] x1 起点横坐标。
|
||||
* @param [IN] y1 起点纵坐标。
|
||||
* @param [IN] x2 终点横坐标。
|
||||
* @param [IN] y2 终点纵坐标。
|
||||
* @param [IN] argb 线条颜色。
|
||||
* @param [IN] width 线条宽度。
|
||||
*/
|
||||
void UiDrawLine(gd::Graphics& g, float x1, float y1, float x2, float y2, std::uint32_t argb, float width);
|
||||
|
||||
/**
|
||||
* @brief 绘制一条虚线。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] x1 起点横坐标。
|
||||
* @param [IN] y1 起点纵坐标。
|
||||
* @param [IN] x2 终点横坐标。
|
||||
* @param [IN] y2 终点纵坐标。
|
||||
* @param [IN] argb 线条颜色。
|
||||
* @param [IN] width 线条宽度。
|
||||
* @param [IN] dashPattern 虚线样式。
|
||||
*/
|
||||
void UiDrawDashedLine(gd::Graphics& g, float x1, float y1, float x2, float y2, std::uint32_t argb,
|
||||
float width, gd::DashStyle dashPattern = gd::DashStyleDash);
|
||||
|
||||
/**
|
||||
* @brief 在指定矩形内绘制单行文本(垂直居中,超长自动省略)。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] text 文本内容。
|
||||
* @param [IN] font 字体句柄。
|
||||
* @param [IN] rect 文本布局矩形。
|
||||
* @param [IN] argb 文本颜色。
|
||||
* @param [IN] align 水平对齐方式。
|
||||
*/
|
||||
void UiText(gd::Graphics& g, const std::wstring& text, HFONT font, const gd::RectF& rect, std::uint32_t argb,
|
||||
TextAlign align = TextAlign::LEFT);
|
||||
|
||||
/**
|
||||
* @brief 测量单行文本的像素宽度。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] text 文本内容。
|
||||
* @param [IN] font 字体句柄。
|
||||
* @return 文本像素宽度。
|
||||
*/
|
||||
float UiTextWidth(gd::Graphics& g, const std::wstring& text, HFONT font);
|
||||
|
||||
/**
|
||||
* @brief 在超出可用宽度时对文本做尾部省略截断。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] text 原始文本。
|
||||
* @param [IN] font 字体句柄。
|
||||
* @param [IN] maxWidth 允许的最大像素宽度。
|
||||
* @return 截断后的文本。
|
||||
*/
|
||||
std::wstring UiEllipsize(gd::Graphics& g, const std::wstring& text, HFONT font, float maxWidth);
|
||||
|
||||
} // namespace jdi
|
||||
|
||||
#endif // __PAINT_UTIL_HPP__
|
||||
Reference in new issue
Block a user