我目前正在WinRT
用 C++ 编写一些组件,我需要弄清楚如何获取颜色字符串(例如 "#FF448DCA" )并将其转换为 aColor
以用于构造 a SolidColorBrush
。
在WPF
我们有BrushConverter
,但我们似乎没有等价物WinRT
我可以C#
通过拆分字符串,转换为十六进制块等来做到这一点,但这超出了我目前的C++
技能。
在我花大量时间尝试解决之前,有没有人有一个快速的答案(我的 C++ 会改进,但我的交易线会受到影响)
谢谢
我目前正在WinRT
用 C++ 编写一些组件,我需要弄清楚如何获取颜色字符串(例如 "#FF448DCA" )并将其转换为 aColor
以用于构造 a SolidColorBrush
。
在WPF
我们有BrushConverter
,但我们似乎没有等价物WinRT
我可以C#
通过拆分字符串,转换为十六进制块等来做到这一点,但这超出了我目前的C++
技能。
在我花大量时间尝试解决之前,有没有人有一个快速的答案(我的 C++ 会改进,但我的交易线会受到影响)
谢谢
这是一个简短的示例,如何使用正则表达式完成此操作,使用 vs 2010 express 编写。这只是解析,稍后使用 Marc 所写的 ColorHelper
#include <string>
#include <regex>
bool GetARGBFromS(const std::string& s, int& a, int& r, int& g, int& b) {
try {
std::smatch m;
if ( regex_search(s, m, std::regex("#([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})([0-9A-Fa-f]{2})")) ) {
a = std::stoi(m[1].str(), 0, 16);
r = std::stoi(m[2].str(), 0, 16);
g = std::stoi(m[3].str(), 0, 16);
b = std::stoi(m[4].str(), 0, 16);
}
else
return false;
}
catch(...){ /*should catch/report specific exceptions, but thats just example*/ return false; }
return true;
}
int main() {
int a,r,g,b;
if ( GetARGBFromS("#FF448DCA", a, r, g, b) )
{}
return 0;
}
Unfortunately you'll need to convert it to discrete byte values.
Once you have those you use the ColorHelper class (http://msdn.microsoft.com/en-us/library/windows/apps/hh747822.aspx) to convert them into a Color structure (there isn't a Color.FromArgb method in C++).
这是我的做法。
public static Brush ColorToBrush(string color)
{
color = color.Replace("#", "");
if (color.Length == 6)
{
return new SolidColorBrush(ColorHelper.FromArgb(255,
byte.Parse(color.Substring(0, 2), System.Globalization.NumberStyles.HexNumber),
byte.Parse(color.Substring(2, 2), System.Globalization.NumberStyles.HexNumber),
byte.Parse(color.Substring(4, 2), System.Globalization.NumberStyles.HexNumber)));
}
else
{
return null;
}
}
致电
textbox1.BorderBrush = ColorToBrush("#ffff00");