minigui:mGNCS简介塈设置控件(widget)enable/disable

mGNCS

在 miniStudio 的开发中,为实现可视化图形界面的设计,飞漫软件在 MiniGUI 现有接口基础上,开发了一套新的控件集。miniStudio 引入的新控件集是在原 MiniGUI 控件集基础上发展而来的,为与 MiniGUI 固有控件集(Intrinsic Control Set)区别,称为“新控件集(New Control Set,简称 mGNCS)”。
基于miniStudio开发UI界面更加方便,UI设计的同时自动生成c代码框架,真正实现了所见即所得(WYSIWYG).
这里写图片描述

mGNCS独立于minigui的核心库libminigui
源码下载地址:http://www.minigui.org/downloads/libmgncs-1.0.8.tar.gz
在ubuntu下如果参照下面的说明ap-get方式安装minigui开发环境:
http://wiki.minigui.com/twiki/bin/view/Products/MiniGUIUMV32P01
mGNCS会含在libminigui-ths-dev package中与libminigui一并安装

关于mGNCS的相关技术手册参见mnigui官网:
在线帮助(中文): http://wiki.minigui.com/twiki/bin/view/Products/MStudioMGNCSV1dot0PG
离线PDF(中文):http://www.minigui.com/docs/MGNCS-PROG-GUIDE-V1.0-C.pdf
更多参见:http://wiki.minigui.com/twiki/bin/view/Products/WebHome#MiniGUI_Components

设置控件enable/disable

如果是基于libminigui核心库的API设置控件enable/disable,一般应该是像下面这样,调用SendNotifyMessage函数发送MSG_ENABLE消息

void ui_widget_enable(mWidget *widget,BOOL enable){
    if(widget){
        SendNotifyMessage(widget->hwnd,MSG_ENABLE,(WPARAM)enable,(LPARAM)NULL);
    }
}

基于mGNCS控制控件的enable/disable与基于libminigui不同。
libmgncs-1.0.8源码文件夹下搜索NCSN_WIDGET_DISABLED即能找对于MG_ENABLE消息的处理逻辑

$ grep -rn –include *.c NCSN_WIDGET_DISABLED .
./src/mwidget.c:550: ncsNotifyParent(self, wParam?NCSN_WIDGET_ENABLED:NCSN_WIDGET_DISABLED);

代码如下
这里写图片描述

可以看到调用PostMessage函数发送MSG_ENABLE消息还是会被转为通过ncsNotifyParent函数发送NCSN_WIDGET_ENABLE/DISABLE消息,相当于多绕了一层。
如果要减少消息转的环节,对mWidget控件,设置enable/disable应该如下操作:

#include <minigui/common.h>
#include <minigui/minigui.h>
#include <minigui/gdi.h>
#include <minigui/window.h>

#include <mgncs/mgncs.h>

#include "resource.h"
#include "ncs-windows.h"
// 设置widget的enable属性
void ui_widget_enable(mWidget *widget,BOOL enable){
    if(widget){
        if(enable){
            ExcludeWindowStyle(widget->hwnd, WS_DISABLED);// WS_DISABLED标志置0
        }else{
            IncludeWindowStyle(widget->hwnd, WS_DISABLED);// WS_DISABLED标志置1
        }
        // 调用ncsNotifyParent前必须调用ExcludeWindowStyle/IncludeWindowStyle修改窗口style,
        // 否则调用无效
        enum mWidgetNotify msg = enable ? NCSN_WIDGET_ENABLED : NCSN_WIDGET_DISABLED;
        ncsNotifyParent(widget,msg);//向 widget发送NCSN_WIDGET_ENABLE/DISABLE消息
    }
}
// 设置widget的子控件enable属性
void ui_child_enable(mWidget *widget,int childId,BOOL enable){
    if(widget){
        // 根据ID获取当前窗口中的子控件对象
        mWidget* child = ncsGetChildObj(widget->hwnd,childId);
        if(child){
            ui_widget_enable(child,enable);
        }
    }
}

猜你喜欢

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