MiniGui开发问题锦集
来源:互联网 发布:ubuntu安装qt开发环境 编辑:程序博客网 时间:2024/05/19 13:24
前言
本文记录了我学习MiniGui开发过程中遇到的一些有意思问题与解决方法,会随着我学习的深入慢慢的更新下去。文章中窗口指的是通过CreateMainWindow创建的窗口,控件是指CreateWindow或CreateWindowEx创建的控件。
1 创建透明背景窗口
窗口创建时,在界面的窗口过程函数里添加MSG_ERASEBKGND监听,什么也不画就是透明背景
case MSG_ERASEBKGND: { return 0;}
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);
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);}
4 鼠标不显示问题
1、查看编译libminigui-gpl的时候,是否指定了–disable-cursor,如果指定了是没有鼠标显示的
2、查看MiniGUI.cfg,cursorpath的路径下是否有鼠标图片,cursornumber是否大于0
3、查看窗口的过程函数MSG_ERASEBKGND下是否返回了return 0并且什么也没有画,没有填充背景,这样是不显示鼠标的
4、查看MiniGUI.cfg的输入引擎是否支持鼠标,如
# IAL engineial_engine=consolemdev=/dev/input/mouse0mtype=IMPS2
5、查看创建窗口是否获取了鼠标
CreateInfo.hCursor = GetSystemCursor(0);
6、查看创建自定义控件是否获取了鼠标
MyClass.hCursor = GetSystemCursor(0);
5 使用SetNotificationCallback为静态框或按钮设置监听事件之后,没有触发监听事件
1、静态框创建的时候需要指定SS_NOTIFY风格
2、按钮创建的时候需要指定BS_NOTIFY风格
3、如果创建的静态框或按钮的父窗口不是窗口,是控件的话,使用SetNotificationCallback是监听不到事件的,消息传递到了父控件那里
6 自定义控件不显示
1、使用自定义控件之前需要注册自定义控件
RegisterWindowClass(&MyClass)
程序结束之后需要销毁
UnregisterWindowClass("xxxxxxxxxxxxxxx");
2、查看自定义控件的属性
//最多只能有15个字符,多了就不显示了MyClass.spClassName = "xxxxxxxxxxxxxxx";
因为在/libminigui-gpl-3.0.12/src/include/ctrlclass.h有定义宏
#define MAXLEN_CLASSNAME 15
7 使用MoveWindow函数时屏幕闪烁
查看创建窗口的时候是否使用了双缓冲机制,在移动的时候会刷新窗口背景,没有使用双缓冲,会直接在屏幕上画图,所以看到闪烁,如果使用双缓冲,则会在创建的缓冲中画好图之后再显示在屏幕上
CreateInfo.dwExStyle = WS_EX_AUTOSECONDARYDC;
- MiniGui开发问题锦集
- MINIGUI开发中遇到的问题及解决方法
- MiniGui开发:ubuntu-14.04环境移植MiniGui
- MINIGUI图形界面开发入门
- miniGui开发进展解决
- 配置minigui开发环境
- MINIGUI 开发指南---GDI
- MiniGUI开发指南
- 搭建MiniGUI开发环境
- 学习miniGUI的问题
- Minigui-3.0.12 开发记录
- Minigui-3.0.12 开发记录
- miniGUI相关问题(转)
- miniGUI相关问题(转)
- minigui安装及问题总结
- minigui安装及问题总结
- MiniGUI
- MiniGUi
- 生成树协议
- 文章标题
- Codeforces Round #400 (Div. 1 + Div. 2, combined) 776B Sherlock and his girlfriend
- java 23种设计模式 04 单例模式
- 根据ip查看数据库连接数
- MiniGui开发问题锦集
- JZOJsenior5473.【NOIP2017提高组】day1T1小凯的疑惑
- php
- SVN提交响应很慢的一个解决思路
- 回溯法:最小重量机器设计问题(python解决)
- 波士顿动力人形机器人会后空翻了
- flume配置详解
- windows虚拟机扩容磁盘
- mvc