样式编辑区: - 移除顶部「样式 + 信号名 + 文件名」标题行,选中信号即代表编辑目标。 - 绘制方式取消阶梯选项,仅保留线段/散点/点线,标签由「方式」改为「样式」。 - 线宽改为「最细预设 + 数值旋钮 + 最粗预设」:中间为带左右增减箭头的输入框, 步进 0.2px,取值范围 0.5-6.0px,并标注单位为 px。 - 颜色在 10 个预设色块后新增带加号图标的方格,点击展开 RGB 三通道滑块面板, 可实时预览并显示十六进制值;点击面板外任意位置收起。 - 移除网格归属下拉框,改由每条信号行末尾的 G 徽标承载,点击弹出网格归属菜单。 信号面板与菜单: - 文件分组行新增关闭按钮,可直接从工作区移除该文件,与整体风格保持一致。 - 新增 PopupMenu 组件:绘制在窗口后备缓冲区内的自绘菜单,含圆角、投影、悬停高亮、 单选对勾、色块行与分组标题,彻底替换系统默认弹出菜单; 菜单打开期间接管鼠标与键盘(Esc / 上下键 / 回车),失焦或在菜单外释放时自动关闭。 - 信号、文件、网格、标签页四类右键菜单全部改用该组件。 其他修复: - 信号名称不再保留尾部单位括号,避免名称后再重复显示单位。 - 数据模型移除 DrawMode::STEP 枚举。 - 标签栏与信号面板弹出菜单后补充重绘请求,修复菜单不显示的问题。
238 lines
7.3 KiB
C++
238 lines
7.3 KiB
C++
#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 图标朝向。
|
||
*/
|
||
enum class IconDirection : int
|
||
{
|
||
LEFT = 0, /**< 指向左侧。 */
|
||
RIGHT = 1, /**< 指向右侧。 */
|
||
UP = 2, /**< 指向上方。 */
|
||
DOWN = 3 /**< 指向下方。 */
|
||
};
|
||
|
||
/**
|
||
* @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 测量单行文本的像素宽度(无需 GDI+ 上下文,可在布局阶段调用)。
|
||
* @param [IN] font 字体句柄。
|
||
* @param [IN] text 文本内容。
|
||
* @return 文本像素宽度。
|
||
*/
|
||
float UiMeasureTextWidth(HFONT font, const std::wstring& text);
|
||
|
||
/**
|
||
* @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);
|
||
|
||
/**
|
||
* @brief 在矩形中心绘制一个加号图标。
|
||
* @param [IN,OUT] g 绘图上下文。
|
||
* @param [IN] rect 图标布局矩形。
|
||
* @param [IN] argb 线条颜色。
|
||
* @param [IN] strokeWidth 线条宽度。
|
||
*/
|
||
void UiDrawPlusIcon(gd::Graphics& g, const gd::RectF& rect, std::uint32_t argb, float strokeWidth);
|
||
|
||
/**
|
||
* @brief 在矩形中心绘制一个叉号(关闭)图标。
|
||
* @param [IN,OUT] g 绘图上下文。
|
||
* @param [IN] rect 图标布局矩形。
|
||
* @param [IN] argb 线条颜色。
|
||
* @param [IN] strokeWidth 线条宽度。
|
||
*/
|
||
void UiDrawCrossIcon(gd::Graphics& g, const gd::RectF& rect, std::uint32_t argb, float strokeWidth);
|
||
|
||
/**
|
||
* @brief 在矩形中心绘制一个箭头(折线形)图标。
|
||
* @param [IN,OUT] g 绘图上下文。
|
||
* @param [IN] rect 图标布局矩形。
|
||
* @param [IN] argb 线条颜色。
|
||
* @param [IN] strokeWidth 线条宽度。
|
||
* @param [IN] direction 箭头朝向。
|
||
*/
|
||
void UiDrawArrowIcon(gd::Graphics& g, const gd::RectF& rect, std::uint32_t argb, float strokeWidth,
|
||
IconDirection direction);
|
||
|
||
/**
|
||
* @brief 在矩形中心绘制一个实心三角形指示器。
|
||
* @param [IN,OUT] g 绘图上下文。
|
||
* @param [IN] rect 图标布局矩形。
|
||
* @param [IN] argb 填充颜色。
|
||
* @param [IN] direction 三角形朝向。
|
||
*/
|
||
void UiDrawTriangleIcon(gd::Graphics& g, const gd::RectF& rect, std::uint32_t argb, IconDirection direction);
|
||
|
||
/**
|
||
* @brief 将滑块轨道上的横坐标换算为取值比例。
|
||
* @param [IN] trackRect 轨道矩形。
|
||
* @param [IN] x 横坐标。
|
||
* @return 取值比例,范围 0-1。
|
||
*/
|
||
double UiSliderRatioFromX(const gd::RectF& trackRect, float x);
|
||
|
||
/**
|
||
* @brief 绘制一个带边框的复选框。
|
||
* @param [IN,OUT] g 绘图上下文。
|
||
* @param [IN] rect 复选框矩形。
|
||
* @param [IN] state 选中状态:0 未选,1 全选,2 部分选。
|
||
* @param [IN] radius 圆角半径。
|
||
*/
|
||
void UiDrawCheckBox(gd::Graphics& g, const gd::RectF& rect, int state, float radius);
|
||
|
||
} // namespace jdi
|
||
|
||
#endif // __PAINT_UTIL_HPP__
|