在上一小节内容里我们已经能正确画出一个拆线图,但是一般来说我们的拆线需要区分不同颜色,很显然个颜色不能在代码里写死,需要我们能通过XML来配置它的颜色。这一小节就界面自定义控件的属性定义。
看看前面的代码我们应该已经知道了,SOUI通过
SOUI_ATTRS_BEGIN()
SOUI_ATTRS_END()
宏来处理我们的自下定义属性。在其内置宏里已经定义了常用的宏比如定义颜色使用ATTR_COLOR,字体 ATTR_FONT等等一系列的宏。具体可以查看SAttrCracker.h这个文件。下面我们通过给控件添加一个设置拆线颜色的属性。
定义一个变量用于保存拆线颜色,我们这里叫colLine,
COLORREF colLine = CLR_INVALID;
然后在属性列表添加属性处理
//属性列表
SOUI_ATTRS_BEGIN()
ATTR_COLOR(L"colLine",colLine,TRUE)
SOUI_ATTRS_END()
修改OnPaint
void SCharts::OnPaint(IRenderTarget* pRT)
{
SPainter painter;
BeforePaint(pRT, painter);
std::vector<POINT> ptList;
std::default_random_engine random((unsigned int)time(NULL));
CRect rcClient;
GetClientRect(&rcClient);
std::uniform_int_distribution<int> dis1(0, rcClient.Height());
for (int i = 0; i < 500;i++) {
ptList.push_back({ i * 10,dis1(random)});
}
CalcPoint(ptList);
{
if (colLine != CLR_INVALID)
{
CAutoRefPtr<IPen> _Pen;
pRT->CreatePen(PS_SOLID, colLine, 1, &_Pen);
IPen* oldPen;
pRT->SelectObject(_Pen, (IRenderObj**)&oldPen);
pRT->DrawLines(ptList.data(), ptList.size());
pRT->SelectObject(oldPen);
}
else {
pRT->DrawLines(ptList.data(), ptList.size());
}
}
AfterPaint(pRT, painter);
}
修改XML文件配置颜色。
<scharts text="scharts" size="-2,-2" colLine="RGB(255,0,0)">
</scharts>
最后运行如上。线色已经变成定义的红色。试试其它颜色。