颜色 HXColor
没有颜色的 GUI 就像没有灵魂的画布。HiEasyX 的 HXColor 是一个带透明通道的 RGBA 结构体,既兼容 EasyX 的 COLORREF,又支持现代 UI 必备的透明度控制。
类型定义
struct HXColor {
uint8_t R; // 红色分量 [0, 255]
uint8_t G; // 绿色分量 [0, 255]
uint8_t B; // 蓝色分量 [0, 255]
uint8_t A; // 透明度 [0, 255],0=完全透明,255=完全不透明
};
信息
四个分量都是 uint8_t,内存布局紧凑,占 4 字节,可以直接传给底层图形 API,也可以塞到 std::vector 里批量传输而不心疼内存。
与 EasyX COLORREF 互转
EasyX 使用 COLORREF(本质上是 0x00BBGGRR 格式的 32 位整数,没有 Alpha)。HiEasyX 提供了无缝转换:
// COLORREF 与 HXColor 的转换函数暂未提供,建议手动按字段映射
提示
EasyX 的 COLORREF 是 BBGGRR 顺序,而 HXColor 的字段是 R, G, B 顺序。转换时请留意顺序差异。
常用颜色常量
框架内置了一些常用的颜色常量,拿来即用:
HXColor HX_WHITE = {255, 255, 255, 255};
HXColor HX_BLACK = {0, 0, 0, 255};
HXColor HX_RED = {255, 0, 0, 255};
HXColor HX_GREEN = {0, 255, 0, 255};
HXColor HX_BLUE = {0, 0, 255, 255};
HXColor HX_TRANSPARENT = {0, 0, 0, 0};
// ... 更多见 hex_color.h
你也可以自己随手捏颜色:
HXColor myOrange{255, 140, 0, 255}; // 深橙色
HXColor glassWhite{255, 255, 255, 40}; // 毛玻璃白,Alpha 很低
HXColor shadow{0, 0, 0, 80}; // 半透明阴影
主题中的颜色 Token 命名规范
HiEasyX 的主题系统 HXTheme 用一组语义化的颜色 token 来描述整个界面的配色。命名遵循 "控件 + 状态 + 属性" 的层次,比如:
| Token | 含义 |
|---|---|
WindowBackground | 窗口背景色 |
WindowTitleBackground | 窗口标题栏背景 |
ButtonBackground | 按钮默认背景 |
ButtonOnHoverBackground | 鼠标悬停时的按钮背景 |
ButtonOnHoverBorder | 鼠标悬停时的按钮边框 |
ButtonPressedBackground | 按钮按下时的背景 |
TextPrimary | 主要文字颜色 |
TextSecondary | 次要/提示文字颜色 |
AccentColor | 主题强调色(选中、滑块、高亮) |
提示
命名规律:
- 不带状态 = 默认态
OnHover= 鼠标悬停Pressed/Active= 按下/激活Border= 边框,Background= 背景- 写自定义控件时,尽量复用主题已有的 token,不要硬编码颜色,这样换主题时控件会自动跟着变。
使用主题颜色的示例
HX::ButtonProfile bp;
bp.Background = HX::GetTheme().ButtonBackground;
bp.HoverBackground = HX::GetTheme().ButtonOnHoverBackground;
bp.BorderColor = HX::GetTheme().ButtonOnHoverBorder;
HX::Button(HXStr("确定"), bp);
颜色插值与动画
HXColor 支持线性插值,常用于颜色过渡动画:
HXColor Lerp(const HXColor& a, const HXColor& b, float t) {
return {
static_cast<uint8_t>(a.R + (b.R - a.R) * t),
static_cast<uint8_t>(a.G + (b.G - a.G) * t),
static_cast<uint8_t>(a.B + (b.B - a.B) * t),
static_cast<uint8_t>(a.A + (b.A - a.A) * t),
};
}
// 从白色渐变到主题强调色
HXColor c = Lerp(HX_WHITE, HX::GetTheme().AccentColor, 0.5f);
信息
框架的动画系统 HXAnimationColor 内部就是用类似的插值实现的。如果你只是想做按钮悬停时的颜色渐变,直接用动画 API 更省事,不用自己手写插值。
一句话总结
| 要点 | 说明 |
|---|---|
| 内存布局 | R, G, B, A 各 1 字节,共 4 字节 |
| 转换函数 | FromColorRef / ToColorRef 安全互转 |
| 透明度 | A=255 不透明,A=0 全透明 |
| 主题命名 | 控件 + 状态 + 属性,优先复用 HXTheme token |
提示
颜色是 UI 最直观的语言。善用 HXColor 的 Alpha 通道做阴影、遮罩、悬停反馈,能让界面瞬间高级起来。记住:不要用裸 COLORREF 在 HiEasyX 控件里硬编码颜色,拥抱主题系统,你的用户会感谢你能一键换肤。