跳到主要内容

颜色 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 的 COLORREFBBGGRR 顺序,而 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 控件里硬编码颜色,拥抱主题系统,你的用户会感谢你能一键换肤。