全部博文(40)
2011年(40)
分类: C/C++
2011-08-29 21:24:51
Agar的tlist控件不支持中文,这可能让很多agar的开发者大失所望。在agar中显示中文,通常的做法都是加载SDL中的TTF中文库,生成surface,然后贴在label和button等控件上。以此想法,何不也让tlist中贴surface呢,如此一来不是可以显示中文了吗?是的,不过这一切都得去代码库去动手了。
首先,打开tlist.h,在AG_TlistItem结构体中添加surface的变量,如图33行
另外,在agar1-3-4/include/agar/gui/tlist.h中也有同样地一个结构体,此结构体供tilist.c文件以外的函数引用,记得两个文件同步修改。
接下来就要改tlist.c文件了,进入Init函数,添加如下代码:
此段代码主要去检测新添加的surface变量是不是为空,如果为空,则加载英文和数字等字符(未修改代码前的作用),如果surface不为空,则去复制传递进来的surface,此处必须去复制surface内容,不能只是将it->Surname指向surname,因为在FreeItem函数中,会对每个it->label进行释放。
如此一来,初始化tlist控件时就能显示中文了,但如何将surface传进来还是个问题。特别是每个Item的surface又是不同的。那么我们就从AG_TlistAdd函数入手,修改此函数的传递参数,增加AG_Surface *surname变量:
记得在Tlist.h文件中同步更新声明函数:
传递了surface的参数,怎么用呢?继续修改AllocItem的参数,将surface参数传递到AllocItem函数进行处理。
新建一个UpdateItemSurname函数,具体函数如下:
此函数只是对传递进来的surname参数传到item->Surname,如此一来Item中的surface就和你传递进来的surface对接了,此处不做surface拷贝,只是简单的指向。别忘了此函数要在文件前声明哦。
这样,你就可以在Tlist中自由地显示中文了。
不过以此同时也带来一个问题:当你选中某个Item时,因为没有直接的一个变量表示你选中了items中的哪一项,除非去循环检测每个item中的flag变量是否为1,1代表被选中。但是很麻烦。在前面的AG_TlistItem结构体中,你可能发现出来AG_Surface *surname变量外,还多了一个int node的变量,此变量就是标示本item在tlist中排行老几。具体的代码实现见TlistAdd函数的截图。结合贴中文surface的例子,只要知道选中第几个item,就可以把item所指向的surface贴到某个label,显示对应的中文。
由于修改时间仓促,修改的代码考虑不周全,难免存在bugs,请多修正。
----by HUA