M8 桌面插件开发说明
Meizu M8桌面插件(以下简称Widget)是摆放在桌面上的小控件,它可以有自己的子控件,以方便用户操作。
Widget的摆放其移动位置都由桌面进行控制,但其中的子控件的相对位置,则需要由Widget自己去设置。
class MyWidget: public UiWidget{…};
// 启动Widget // 此函数在Widget被加载到桌面上的时候会被调用 // 重载这个函数可自定义Widget启动时的行为 // 返回值:如果返回false,则对象会被删除 virtual bool StartWidget(); // 结束Widget // 此函数在Widget从桌面上脱离的时候会被调用 // 重载这个函数可自定义Widget结束时的行为 virtual void EndWidget(); // 重载此函数,以指定Widget的尺寸(以桌面图标格子为单位,值的范围是1~4) virtual void OnCalcItemSize(__out int &xSize, __out int &ySize);
由于 UiWidget 的最上层父类是 UiWin ,因此也就继承了 UiWin 的特性。(具体请参考 UiWin.h )
如果你想在你的Widget上绘制一些图形文字之类的,可以使用 UiWin::AddChild() 往你的Widget添加 UiPicture / UiStatic 等子控件。 当然,你也可以通过重载 UiWin::PaintWin() 来实现自绘Widget。
或者你想添加一个按钮,则可以使用 UiWin::AddChild() 往Widget里添加 UiButton / UiButton_Image 等子控件。
在重载的 StartWidget() 函数中,当你设置Widget及其子控件的ID时,必须使用以下API来获得空闲的控件ID:// 获得空闲的控件ID // Widget的控件ID请使用此函数来获得设置,以避免ID冲突 // 获得的ID必须在不使用时调用SW_ReleaseID(id)进行释放 SHELLWIDGET_API UINT SW_GetFreeID();
在重载的 EndWidget() 函数中,你需要把所有获得的控件ID通过以下API进行释放:// 释放ID,使它空闲 SHELLWIDGET_API void SW_ReleaseID(int nID);
Widget 如何响应命令通知消息及鼠标触摸通知消息
通过重载widget的以下虚函数,可以响应widget中的控件/子控件发出的命令通知消息 MZ_WM_COMMAND 及鼠标触摸通知消息 MZ_WM_MOUSE_NOTIFY:// 重载以自定义对所在窗口消息通知的处理 virtual void OnWmNotify(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam) { if(nMessage == MZ_WM_COMMAND) { if( m_btn.GetID() == LOWORD(wParam) ) { // processs } } }
注册Widget
最后,需要添加Widget的注册表,这样Widget才会摆放在桌面上。
位置:[HKEY_LOCAL_MACHINE\SOFTWARE\Meizu\MiniOneShell\Main\XXXX], 其中XXXX是您自定义的应用程序名称。
链接引用库文件shellwidget.lib
引用头文件<shellwidget/shellwidget.h>
Widget 开发示例
Widget开发注意事项
由于桌面上的Widget插件数量比较多,它们占用的显存和内存都比较大,因此必须注意以下一些事项,以减少不必要的内存占用: