欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-11 11:19:46
...

mGNCS

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

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);

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

可以看到调用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);
        }
    }
}