MiniGUI开发问题集锦

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/anyuliuxing/article/details/78569083

前言

本文记录了我学习MiniGui开发过程中遇到的一些有意思问题与解决方法,会随着我学习的深入慢慢的更新下去。文章中窗口指的是通过CreateMainWindow创建的窗口,控件是指CreateWindowCreateWindowEx创建的控件。

1 创建透明背景窗口

方法一:窗口创建时,在界面的窗口过程函数里添加MSG_ERASEBKGND监听,什么也不画就是透明背景,这种方法有一个缺陷,就是透明背景只能和创建窗口的时候一样,改变控件的形状或位置,原来控件的形状或位置还留在原来的地方,不能透明

case MSG_ERASEBKGND: {
    return 0;
}
 
 
  • 1
  • 2
  • 3

方法二:使用mlshadow引擎
1、在配置的时候使能videomlshadow,真实引擎可以使用fbcon或qvfb,这里使用qvfb

./configure --enable-qvfbial --enable-videoqvfb --enable-videomlshadow
 
 
  • 1

2、配置MiniGUI.cfg,把gal_engine的值换成mlshadow,mlshadow的real_engine换成qvfb就可以了。def_bgcolor是背景色,double_buffer可以取值enable/disable,表示刷屏时是否使用双缓冲。

MLShadow 引擎是实现了在机顶盒、PMP等产品的方案中提供多个显示层,以完成类似硬件提供的图形层叠加功能,自动实现层之间的透明、半透明的显示。

[system]
# GAL engine and default options
gal_engine=mlshadow
defaultmode=800x480-32bpp

[qvfb]                       
defaultmode=800x480-32bpp                                     
display=0

[mlshadow]              
real_engine=qvfb         
defaultmode=800x480-32bpp                                           
def_bgcolor=0x00FF00      
double_buffer=enable                            

 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

3、MiniGUI 提供了对 MLShadow 引擎当中虚拟图形层的操作函数,以实现对不同图形层的控制

BOOL mlsSetSlaveScreenInfo (HDC dc_mls, DWORD mask, int offset_x, int offset_y,
                    DWORD blend_flags, gal_pixel color_key, int alpha, int z_order);
 
 
  • 1
  • 2

此函数能够通过给定的 dc_mls 参数,找到对应的图形层,设置该图形层相对真实图形层的偏移量、混合标记、透明色、透明值以及叠加属性。

#下面是参数说明
•   dc_mls 是图形层所对应的 DC 句柄。
•   mask 用于判断是设置某一个或者某些属性,其他属性的值传入无效。例如:当 mask = MLS_INFOMASK_OFFSET
    时只对 offset_x 和 offset_y 进行设置,当为 MLS_INFOMASK_ALL 时,设置所有属性。mask 的取值范围如下:
        o MLS_INFOMASK_OFFSET 仅设置显示层偏移量
        o MLS_INFOMASK_BLEND 仅设置显示层混合标志
        o MLS_INFOMASK_ZORDER 仅设置显示层叠加顺序
        o MLS_INFOMASK_ENABLE 仅设置显示层是否可见
        o MLS_INFOMASK_ALL 设置所有信息
•   offset_x 和 offset_y 设置给定显示层在主屏上的偏移量。
•   blend_flags 则表示该显示层是透明的还是带有 alpha 通道的,flags 可以取下列值:
        o MLS_BLENDMODE_COLORKEY 表示进行混合时,去掉透明色
        o MLS_BLENDMODE_ALPHA 表示进行混合时,是进行 ALPHA 混合
•   color_key 指定透明色
•   alpha 指定 ALPHA 通道值
•   z_order 则指定叠加的顺序,z_order 值越大,则该显示层越靠外。
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
BOOL mlsGetSlaveScreenInfo (HDC dc_mls, DWORD mask, int *offset_x, int *offset_y,
                    DWORD *blend_flags, gal_pixel *color_key, int *alpha, int *z_order);
 
 
  • 1
  • 2

此函数获取由参数 dc_mls 指定的显示层的混合叠加信息,参数 mask 指定是获取所有信息还是部分信息,它的取值在函数mlsSetSlaveScreenInfo 的参数说明里面已经说明过了。

BOOL mlsEnableSlaveScreen (HDC dc_mls, BOOL enable);
 
 
  • 1

此函数设置显示层 dc_mls 是否可见,即是否参加图形层的混合叠加操作。 enable 为 TRUE 时,为可见;为 FALSE 时,不可见。

2 创建透明背景控件

使用CreateWindowEx函数创建,并传入WS_EX_TRANSPARENT风格

CreateWindowEx(CTRL_STATIC, "静态文本",
    WS_CHILD | SS_GROUPBOX | WS_VISIBLE, WS_EX_TRANSPARENT, 0, 0, 0,
            rect.right, rect.bottom, hwnd, 0);
 
 
  • 1
  • 2
  • 3

3 透明背景控件移动动画

不是使用MoveWindow函数,控件的父窗口必须使用双缓冲风格

HWND parent = GetParent(hwnd);
if (IsMainWindow(parent)) {
    //首先获取父窗口的坐标与控件的坐标
    RECT parentRect, clientRect;
    GetWindowRect(hwnd, &parentRect);
    //获取双缓冲的设备环境上下文
    HDC parentHdc = GetSecondaryDC(parent);
    /**
     * 在系统内存中建立一个类似显示内存的区域,slideHdc是滑动层,showHdc是显示层
     * 所有的动画都在slideHdc画,画完之后,把显示的数据复制到showHdc中
     * 然后再由showHdc把显示的数据送到屏幕上,这样可以避免屏幕闪烁问题
     */
    HDC slideHdc = CreateCompatibleDCEx(parentHdc, clientRect.right,
            clientRect.bottom);
    HDC showHdc = CreateCompatibleDCEx(parentHdc, clientRect.right,
            clientRect.bottom);
    SetSecondaryDC(parent, parentHdc, ON_UPDSECDC_DONOTHING);

    //设置背景图片与透明度
    FillBoxWithBitmap(slideHdc, 0, 0, clientRect.right,
            clientRect.bottom, &slideTextData->bmp_bg);
    SetMemDCAlpha(slideHdc, MEMDC_FLAG_SRCALPHA, 32);

    //每帧动画的间隔事件
    unsigned int time = 25000;
    //每帧动画控件的高度,随着时间而增大,最大到原本控件的高度
    int currentHeight = 30;
    int parentY = parentRect.bottom - currentHeight;

    while (clientRect.bottom > currentHeight) {
        /**
         * 把主窗口该移动控件处的背景填充到showHdc层中,相当于还原showHdc层,
         * 如果不这样做,每次移动的图层会叠加,导致显示的越来越黑
         */
        BitBlt(parentHdc, parentRect.left, parentRect.top,
                clientRect.right, clientRect.bottom, showHdc, 0, 0, 0);
        //把slideHdc层中移动的画面复制到showHdc层中
        BitBlt(slideHdc, 0, 0, clientRect.right, currentHeight, showHdc,
                0, clientRect.bottom - currentHeight, 0);
        //把showHdc层中的画面显示到屏幕上
        BitBlt(showHdc, 0, clientRect.bottom - currentHeight,
                clientRect.right, currentHeight,
                HDC_SCREEN, parentRect.left, parentY, 0);
        //每帧动画移动30的距离
        currentHeight = currentHeight + 30;
        parentY = parentRect.bottom - currentHeight;
        usleep(time);
    }
    //释放申请的设备环境上下文
    SetSecondaryDC(parent, parentHdc, ON_UPDSECDC_DEFAULT);
    DeleteMemDC(slideHdc);
    DeleteMemDC(showHdc);
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

4 鼠标不显示问题

1、查看编译libminigui-gpl的时候,是否指定了–disable-cursor,如果指定了是没有鼠标显示的
2、查看MiniGUI.cfg,cursorpath的路径下是否有鼠标图片,cursornumber是否大于0
3、查看窗口的过程函数MSG_ERASEBKGND下是否返回了return 0并且什么也没有画,没有填充背景,这样是不显示鼠标的
4、查看MiniGUI.cfg的输入引擎是否支持鼠标,如

# IAL engine
ial_engine=console
mdev=/dev/input/mouse0
mtype=IMPS2
 
 
  • 1
  • 2
  • 3
  • 4

5、查看创建窗口是否获取了鼠标

CreateInfo.hCursor = GetSystemCursor(0);
 
 
  • 1

6、查看创建自定义控件是否获取了鼠标

MyClass.hCursor = GetSystemCursor(0);
 
 
  • 1

5 没有触发监听事件

使用SetNotificationCallback为静态框或按钮设置监听事件之后,点击了控件却没有收到事件
1、静态框创建的时候需要指定SS_NOTIFY风格
2、按钮创建的时候需要指定BS_NOTIFY风格
3、如果创建的静态框或按钮的父窗口不是窗口,是控件的话,使用SetNotificationCallback是监听不到事件的,消息传递到了父控件那里

6 自定义控件不显示

1、使用自定义控件之前需要注册自定义控件

RegisterWindowClass(&MyClass)
 
 
  • 1

程序结束之后需要销毁

UnregisterWindowClass("xxxxxxxxxxxxxxx");
 
 
  • 1

2、查看自定义控件的属性

//最多只能有15个字符,多了就不显示了
MyClass.spClassName = "xxxxxxxxxxxxxxx";
 
 
  • 1
  • 2

因为在/libminigui-gpl-3.0.12/src/include/ctrlclass.h有定义宏

#define MAXLEN_CLASSNAME    15
 
 
  • 1

7 更新界面屏幕闪烁

使用MoveWindow函数或者快速更换显示图片时屏幕闪烁,查看创建窗口的时候是否使用了双缓冲机制,在移动的时候会刷新窗口背景,没有使用双缓冲,会直接在屏幕上画图,所以看到闪烁,如果使用双缓冲,则会在创建的缓冲中画好图之后再显示在屏幕上

CreateInfo.dwExStyle = WS_EX_AUTOSECONDARYDC;
 
 
  • 1

8 开启UI旋转功能

1、gal_engine更换成shadow可以使用MiniGui的UI旋转功能。首先使能shadow,使用该引擎也会把屏幕点击事件旋转了,不用担心只是画面旋转而点击事件没有旋转

./configure --enable-qvfbial --enable-videoqvfb --enable-videoshadow
 
 
  • 1

2、配置MiniGUI.cfg,shadow的real_engine可为pc_xvfb、qvfb、fbcon等,这里使用qvfb,rotate_screen的值可以为normal ,cw , ccw , hflip , vflip,cw是顺时针旋转90度

[system]
# GAL engine and default options
gal_engine=shadow
#旋转之后的分辨率
defaultmode=800x480-16bpp

[qvfb]
#屏幕原始分辨率
defaultmode=480x800-16bpp
display=0

[shadow]
real_engine=qvfb
#旋转之后的分辨率
defaultmode=800x480-16bpp
rotate_screen=cw
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet">
                </div>
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MiniGUI 用户手册是一本详细介绍 MiniGUI 软件使用方法和功能的手册。MiniGUI 是一个嵌入式图形用户界面开发框架,它提供了丰富的绘图和窗口管理功能,可以实现嵌入式设备上的图形界面显示和交互操作。 用户手册内容包括 MiniGUI 的基本概念和架构,如窗口、控件、绘图等。手册中详细介绍了如何安装和配置 MiniGUI,包括编译和移植 MiniGUI 到不同硬件平台的步骤。用户手册还提供了 MiniGUI 的主要 API 接口的详细说明,包括窗口和控件的创建、显示、隐藏和销毁等操作的函数调用方式和参数说明。 此外,用户手册还包含了一些示例代码,以帮助用户更好地理解 MiniGUI 的使用方法。用户可以通过阅读示例代码,学习如何创建窗口和控件,如何处理用户输入事件,如何绘制图像和文字等。用户手册还提供了一些常见问题的解答和故障排除的方法,帮助用户解决在使用 MiniGUI 过程中可能遇到的问题MiniGUI 用户手册对于初学者来说是一个很好的入门指南,它详细介绍了 MiniGUI 的各个方面,帮助用户快速上手并能够独立开发嵌入式图形界面应用。用户可以根据手册的指导,按照自己的需求进行 MiniGUI 的配置和开发,实现自己想要的图形界面效果。总之,MiniGUI 用户手册是理解和使用 MiniGUI 的重要参考资料,对于开发者来说,它是不可或缺的工具。 ### 回答2: Minigui用户手册是一本关于Minigui图形用户界面开发框架的指南。Minigui是一个基于C语言开发的轻量级、可定制的GUI开发工具包。它可以帮助开发者快速构建各种图形界面应用程序。 这本用户手册涵盖了Minigui的各个方面,从安装和配置开始,一直到开发和调试。手册中详细介绍了如何使用Minigui的各种功能和组件,如窗口、按钮、菜单、对话框等,以及使用不同控件实现用户交互。手册还提供了丰富的示例代码和演示,帮助开发者更好地理解和应用Minigui的功能。 此外,手册还介绍了Minigui的特性和优势。它可以运行在各种类型的嵌入式设备上,具有较低的资源占用和快速的响应速度。Minigui还支持跨平台开发,可以在多种操作系统上运行,如Windows、Linux等。它还支持多国语言和字符集,帮助开发者构建全球化的应用程序。 Minigui用户手册不仅提供了技术内容,还对开发过程中的常见问题进行了解答,以及开发者应该遵循的最佳实践和规范。手册的目的是帮助开发者更加高效地利用Minigui进行图形界面开发,提升开发效率,并最大限度地减少错误和调试时间。 总之,Minigui用户手册是Minigui开发框架的一本重要参考资料,它提供了详尽的技术指导和实例代码,帮助开发者快速上手并开发出高质量的图形界面应用程序。无论是初学者还是经验丰富的开发者,都可以从中受益并提升他们的开发技能。 ### 回答3: minigui 用户手册是一本介绍和指导用户如何使用 minigui 软件的手册。minigui 是一个开源的图形用户界面(GUI开发框架,它提供了丰富的图形界面组件和功能,能够帮助开发人员快速构建跨平台的图形界面应用程序。 minigui 用户手册从基础开始,介绍了 minigui 开发环境的安装和配置方法,以及如何创建和编译一个 minigui 应用程序。接着,手册详细介绍了 minigui 的各种图形界面组件,如窗口、按钮、文本框等,以及它们的使用方法和属性设置。用户可以通过手册学习如何创建和布局这些组件,以及如何响应用户的交互事件。 除了组件的介绍,minigui 用户手册还提供了大量的示例代码和实践案例,让用户可以更好地理解和应用 minigui 的各种功能。手册还解释了 minigui 的一些高级特性,如绘图和图像处理,以及如何与后台服务进行通信,从而帮助用户开发更加复杂和实用的应用程序。 minigui 用户手册还对 minigui开发工具和调试方法进行了介绍,帮助用户更好地进行开发和调试工作。手册也提供了一些常见问题和解决方案,以及一些开发经验和技巧,供用户参考。 总而言之,minigui 用户手册是一本全面介绍 minigui 软件的指南,它帮助用户快速入门,掌握 minigui 的使用方法,并通过实践和示例代码提供了更深入的学习和开发体验。无论是初学者还是有经验的开发人员,都可以从 minigui 用户手册中获得帮助和指导,提升图形界面应用程序的开发效率和质量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值