minigui/mgncs 1.2.0:解决miniStudio生成的渲染器(renderer)设置文本颜色无效问题

最在用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);
        }
    }
    // 。。。
}

猜你喜欢

转载自blog.csdn.net/10km/article/details/81156411