QQ: 282397369
画笔与画刷
在TUniCanvas中,已定义画笔画刷
TUniCanvasPen* FPen;
TUniCanvasBrush* FBrush;
再看一下,这两个类还有点关系:
其实也很简单的关系。
但从HTML5 Canvas的角度来看,画刷也就一个属性:fillStyle,只不过该属性可以有三种形式:color|gradient|pattern
搞明白这个,界面实现就有思路。把画笔与画刷合在一起,能共用的就共用。
再借鉴Windows中的画刷体验,把画刷的填充模式设置为五种:无填充、纯色填充、线性渐变、雷达渐变、图案纹理。这应该足够用的了。
效果
逐个实现填充模式。
基于时间与需求,图片纹理暂不实现,先支持软件的初步使用效果即可,不用花太多时间去抠界面及其易用性。所以线性渐变与雷达渐变,也先不处理图形设计方式。等后续时间充足了再优化这块。
其实,根本原因在于还没有彻底理解线性渐变与雷达渐变各参数的含义,现在做出来也是浪费,以后会觉得,都编了些什么垃圾代码,不爽。
无填充
纯色填充
颜色选择这块,uniGUI有个TUniColorBUtton控件,让我省了一些事。该控件可以自定义可选择的颜色项。不过系统缺省提供的选项已大体够用。
线性渐变
雷达渐变
所有的实现,均采用格式化JS代码输出方式。比如填充效果
int fillIndex = UniPageControl_Fill->ActivePageIndex;
if(fillIndex > 1) {
UnicodeString colorStopsString = UniEdit_ColorStops_Linear->Text;
if(fillIndex == 2)
jsCode += THelper::FormatString(L"var gradient=ctx.createLinearGradient(%s);", UniEdit_LinearRect->Text.Trim());
else {
jsCode += THelper::FormatString(L"var gradient=ctx.createRadialGradient(%s);", UniEdit_RadiarRect->Text.Trim());
colorStopsString = UniEdit_ColorStops_Radiar->Text;
}
TStrings * list = TTypeConvert::String2List(colorStopsString, L";");
for(int i = 0; i < list->Count; ++i) {
UnicodeString text = list->Strings[i];
double pos = THelper::String::GetStringAt(text, L",", 0).Trim().ToDouble();
UnicodeString value = THelper::String::GetStringAt(text, L",", 1).Trim();
jsCode += THelper::FormatString(L"gradient.addColorStop(%3.2f, %s);", pos, value);
}
delete list;
}
明天再处理下字体,就可以着手图元类库搭建。想想还有点期待。