我有一个程序,它从配置文件中读取十六进制字符串表示形式,将其转换为来自 Gdk 的 GdkRGBA 结构,使用
gtk_color_dialog_button_set_rgba ()
将其设置为 GtkColorDialogButton 的默认颜色,然后监听用户对上述按钮。
在用户更改时,我想将所选值写回配置文件,以便它在程序启动时保持不变,并且出于遗留兼容性原因,我需要它是十六进制字符串表示形式(配置文件是
~/.Xresources
,所以它需要与许多现有程序兼容)。然而,虽然 Gdk 提供了一个 gdk_rgba_parse ()
函数来将颜色的十六进制字符串表示解析为 GdkRGBA 结构,但我找不到任何可以执行逆操作的东西,即将 GdkRGBA 结构转换为十六进制字符串表示。有 gdk_rgba_to_string ()
,但它只返回 rgb(r,g,b)
或 rgba(r,g,b,a)
形式的字符串,而我想要 #rrggbb
。
如何在 C 中获取 GdkRGBA 结构体值的十六进制字符串表示形式?
有
,但它只返回 rgb(r,g,b) 或 rgba(r,g,b,a) 形式的字符串,而我想要#rrggbb。gdk_rgba_to_string()
因此解析
gdk_rgba_to_string()
返回的字符串并根据需要格式化结果。 有很多方法可以实现这一点。 例如,
char *rgba_str = gdk_rgba_to_string(rgba);
unsigned int r, g, b;
// rgba_str has the form "rgb(r,g,b)" or "rgba(r,g,b,a)", where r, g, b, a are
// decimal integers in the range 0 - 255.
int fields = sscanf(rgba_str, "%*[^(](%u,%u,%u", &r, &g, &b);
// the caller of gdk_rgba_to_string() is responsible for freeing the result
free(rgba_str);
if (fields < 3) {
// handle malformed rgba_str ...
}
// if paranoid then validate that r, g, and b are within the expected range ...
char result[8];
sprintf(result, "#%02x%02x%02x", r, g, b);
虽然 [
s
]scanf
对于交互式输入可能会出现问题,但对于常规格式的输入来说它会非常好,因为你可以依靠 gdk_rgba_to_string()
来生成。