最在用miniStudio
设计UI,我的minigui
升级到了3.2.0,libmgncs
版本是1.2.0,但在使用渲染器设置文字颜色时出了问题。
如下,我只是想做一个黑底白字的效果,所以用渲染器指定了字体颜色为白色,背景为黑色。
然而,程序实际运行的时候却是这样的,说好的白色呢?
遇到这个问题我瞬间就懵了,前几天还好好的呀。怎么会这样?退回来仔细想想,前几天我用的是apt-get
安装的minigui官方的二进制包,而最近我使用的是自己编译的libminigui-3.2.0/,libmgncs-1.2.0
库。看来问题出在自己编译的libmgncs-1.2.0
库上。
反复检查了libmgncs-1.2.0
的编译选项,没什么特别的。问题应该不是出在编译方式上。有可能是官方libmgncs-1.2.0
二进制包的版本与发布的libmgncs-1.2.0
源码并不同步,接下来只能从源码中找原因喽。
经过反复跟踪代码,找到了原因:
简单一句描述就是,ministuido 1.2.1生成的渲染器(renderer)配置在libmgncs-1.2.0
无法被正确读取。
ministudio在读取渲染器配置文件(
rdr.xml
)时将ColorTextEnable
定义为默认前景色,映射为NCS_FGC_3DBODY
(0x7000)(定义在libmgncs-1.2.0/include/mrdr.h
),但在libmgncs 1.2.0
版本中mLabelPiece
(libmgncs-1.2.0/src/pieces/mlabelpiece.c
)的paint
函数刷新屏幕时,在从渲染器对象读取前景色时使用的ID是NCS_FGC_WINDOW
(0x7001),所以无法正确读取前景色就使用了默认的黑色。libmgncs1.0.8
版本则是用NCS_FGC_3DBODY
,所以可以正确读取颜色(我也是对比了1.0.8版本的代码才找到解决办法的)。
libmgncs 1.2.0
改为使用NCS_FGC_WINDOW
估计为了代码规范,让宏定义字面上的意思保持一致。但没有同步更新miniStudio.导致这个问题,所以这里改回使用NCS_FGC_3DBODY
以兼容miniStudio,就解决问题。
修改位置详见下面的代码片段中的中文注释
static void mLabelPiece_paint(mLabelPiece *self, HDC hdc, mWidget *owner, DWORD add_data)
{
//draw Text
RECT rcClient;
DWORD uFormat = DT_WORDBREAK;
DWORD fg_color = 0/*, bg_color = 0*/;
//gal_pixel old_color;
const char* str = self->str;
if(owner == NULL || str == NULL)
return ;
SelectFont(hdc, GetWindowFont(owner->hwnd));
_c(self)->getRect(self, &rcClient);
if ((NCS_PIECE_PAINT_STATE_MASK&add_data) == PIECE_STATE_DISABLE) {
//is disable
fg_color = ncsGetElement(owner, NCS_FGC_DISABLED_ITEM);
//bg_color = ncsGetElement(owner, NCS_BGC_DISABLED_ITEM);
}
else {
if(mLabelPiece_isSelected(self)) {
fg_color = ncsGetElement(owner, NCS_BGC_SELECTED_ITEM);
//bg_color = ncsGetElement(owner, NCS_FGC_SELECTED_ITEM);
}
else {
// 本文作者注:NCS_FGC_WINDOW 改为 NCS_FGC_3DBODY 解决问题
fg_color = ncsGetElement(owner, NCS_FGC_3DBODY);// for compatibility with ministudio
//bg_color = ncsGetElement(owner, NCS_BGC_WINDOW);
}
}
// 。。。
}