📄 sliderwidgetdemo.c
字号:
/*===========================================================================
Demo of Brew BUIW Slider Widget
Version 1.00
FILE: SliderWidgetDemo.c
zhangjunzhi@yulong.com
2006.05.18
===========================================================================*/
/*===============================================================================
INCLUDES AND VARIABLE DEFINITIONS
=============================================================================== */
#include "AEEModGen.h" // Module interface definitions
#include "AEEAppGen.h" // Applet interface definitions
#include "AEEShell.h" // Shell interface definitions
#include "AEEForm.h"
#include "AEERootForm.h"
//#include "AEEDialog.h"
#include "AEERootForm.h"
#include "AEEWProperties.h"
#include "AEEXYContainer.h"
#include "AEEPropContainer.h"
#include "AEEStaticWidget.h"
#include "AEEStdLib.h"
#include "AEESliderWidget.h"
#include "SliderWidgetDemo.bid" // class ID文件
#include "SliderWidgetDemo.brh" // 资源文件
#define SLIDERWIDGETDEMO_RES_FILE "SliderWidgetDemo.bar"
//define applet structure
typedef struct _sliderDemo_App {
AEEApplet a;
IRootForm* rootForm;
IForm* mainForm;
} sliderDemo_App;
// app form structure
typedef struct sliderDemo_AppForm sliderDemo_AppForm;
struct sliderDemo_AppForm {
IShell* piShell; // shell
IRootForm* rootForm; // 根窗口rootForm
IForm* mainForm; // 主窗口mainForm
HandlerDesc mainFormHandler; // 主窗口事件处理
IXYContainer* mainContainer; // 坐标容器
IWidget* numberStatic_1; // 用于显示slider1位置数字
IWidget* numberStatic_2; // 用于显示slider2位置数字
IWidget* numberStatic_3; // 用于显示slider3位置数字
IWidget* sliderDemo_1; // slider1
IWidget* sliderDemo_2; // slider2
IWidget* sliderDemo_3; // slider3
uint16 slider1_maxPos; // slider1最大值
uint16 slider2_maxPos; // slider2最大值
uint16 slider3_maxPos; // slider3最大值
uint16 slider1_curPos; // slider1当前位置
uint16 slider2_curPos; // slider2当前位置
uint16 slider3_curPos; // slider3当前位置
uint8 focusSlider; // 表示焦点在哪个Slider上
ModelListener slider1_VmListener; // slider1的侦听函数
ModelListener slider2_VmListener; // slider2的侦听函数
ModelListener slider3_VmListener; // slider3的侦听函数
};
// 本例的Slider1,展示了调节手柄,可以带来颜色的变化。下面这个宏,定义了slider1滑杆颜色与手柄位置的关系
#define SLIDERDEMO1_ACTIVE_BORDER_COLOR(pos) MAKE_RGB(pos*25,0,255-pos*2)
/*-------------------------------------------------------------------
Function Prototypes
-------------------------------------------------------------------*/
static boolean sliderDemo_HandleEvent (IApplet * pi, AEEEvent eCode,uint16 wParam, uint32 dwParam);
static int sliderDemo_InitAppData (sliderDemo_App* pMe);
static void sliderDemo_FreeAppData (sliderDemo_App* pMe);
static int sliderDemo_AppForm_New (IForm** ppo, IShell *piShell, IRootForm *pRootForm);
//static int sliderDemo_AppForm_New (IForm** ppo, IShell *piShell, IRootForm *pRootForm, IDisplay *piDisplay);
static int sliderDemo_AppForm_PopulateMainContainer (sliderDemo_AppForm* pMe);
static boolean sliderDemo_AppForm_HandleEvent (void *po, AEEEvent evt, uint16 wParam, uint32 dwParam);
static void sliderDemo_AppForm_Delete (sliderDemo_AppForm* pMe);
static void sliderDemo_slider1_ListenerHandler (sliderDemo_AppForm *pMe, ModelEvent *pEvent);
static void sliderDemo_slider2_ListenerHandler (sliderDemo_AppForm *pMe, ModelEvent *pEvent);
static void sliderDemo_slider3_ListenerHandler (sliderDemo_AppForm *pMe, ModelEvent *pEvent);
static void sliderDemo_ListenerHandler_EX (sliderDemo_AppForm *pMe, ModelEvent *pEvent, IWidget* pSlider,IWidget* pNum, uint16* pos);
/*===============================================================================
FUNCTION DEFINITIONS
=============================================================================== */
//=====================================================================================
//
//=====================================================================================
void sliderDemo_AppForm_Delete(sliderDemo_AppForm* pMe)
{
if(pMe->mainForm)
IFORM_Release(pMe->mainForm);
if(pMe->mainContainer)
IXYCONTAINER_Release(pMe->mainContainer);
if(pMe->numberStatic_1)
IWIDGET_Release(pMe->numberStatic_1);
if(pMe->numberStatic_2)
IWIDGET_Release(pMe->numberStatic_2);
if(pMe->numberStatic_3)
IWIDGET_Release(pMe->numberStatic_3);
if(pMe)
FREE(pMe);
}
//=====================================================================================
// 侦听函数
//=====================================================================================
static void sliderDemo_ListenerHandler_EX (sliderDemo_AppForm *pMe, ModelEvent *pEvent, IWidget* pSlider,IWidget* pNum,uint16* pos)
{
IValueModel* pValueModel;
IValueModel *pivm = 0;
char ach[12];
AECHAR awch[12];
if (pEvent->evCode == EVT_MDL_VALUE ) {
// 取当前值
IWIDGET_GetModel(pSlider, AEEIID_VALUEMODEL, (IModel**)&pValueModel);
*pos = (int)IVALUEMODEL_GetValue(pValueModel,NULL);
// 根据当前值,改变Slider的底色
IWIDGET_SetProperty(pSlider,PROP_ACTIVE_BGCOLOR,
SLIDERDEMO1_ACTIVE_BORDER_COLOR(*pos));
// 在静态文本中显示当前值
SNPRINTF(ach, sizeof(ach)-1, "%lu", (uint32)(*pos));
STRTOWSTR(ach, awch, sizeof(awch));
if(SUCCESS == IWIDGET_GetModel(pNum, AEEIID_VALUEMODEL, (IModel**) &pivm)) {
IVALUEMODEL_SetText(pivm, awch, -1);
IVALUEMODEL_Release(pivm);
}
}
}
static void sliderDemo_slider1_ListenerHandler (sliderDemo_AppForm *pMe, ModelEvent *pEvent)
{
sliderDemo_ListenerHandler_EX(pMe,pEvent,pMe->sliderDemo_1,pMe->numberStatic_1,&(pMe->slider1_curPos));
}
static void sliderDemo_slider2_ListenerHandler (sliderDemo_AppForm *pMe, ModelEvent *pEvent)
{
sliderDemo_ListenerHandler_EX(pMe,pEvent,pMe->sliderDemo_2,pMe->numberStatic_2,&(pMe->slider2_curPos));
}
static void sliderDemo_slider3_ListenerHandler (sliderDemo_AppForm *pMe, ModelEvent *pEvent)
{
sliderDemo_ListenerHandler_EX(pMe,pEvent,pMe->sliderDemo_3,pMe->numberStatic_3,&(pMe->slider3_curPos));
}
//=====================================================================================
//
//=====================================================================================
static boolean sliderDemo_AppForm_HandleEvent(void *po, AEEEvent evt, uint16 wParam, uint32 dwParam)
{
sliderDemo_AppForm* pMe = (sliderDemo_AppForm*) po;
int qaa;
if( (evt== EVT_KEY)){
if(wParam == AVK_SOFT2) {
qaa = ISHELL_CloseApplet(pMe->piShell, TRUE);
return TRUE;
}
if (wParam == AVK_SOFT1) {
// 按*键切换焦点
// 在三个Slider间切换焦点
int result;
IWidget* containerWidget = NULL;
result = IXYCONTAINER_QueryInterface(pMe->mainContainer, AEEIID_WIDGET, (void**)&containerWidget);
if(result ==0) {
IFORM_SetWidget(pMe->mainForm, WID_FORM, containerWidget);
}
if (pMe->focusSlider == 1) {
// 设置焦点为Slider2
IWIDGET_MoveFocus(containerWidget, pMe->sliderDemo_2);
pMe->focusSlider = 2;
}else if (pMe->focusSlider == 2) {
// 设置焦点为Slider3
IWIDGET_MoveFocus(containerWidget, pMe->sliderDemo_3);
pMe->focusSlider = 3;
}else if (pMe->focusSlider == 3) {
// 设置焦点为Slider1
IWIDGET_MoveFocus(containerWidget, pMe->sliderDemo_1);
pMe->focusSlider = 1;
}
IWIDGET_Release(containerWidget);
return TRUE;
}
}
//the default form handler is swapped with the sliderDemo_AppForm handler
// calling this allows the default form handler to handle the event
return HANDLERDESC_Call(&pMe->mainFormHandler, evt, wParam, dwParam);
}
//=====================================================================================
//
//=====================================================================================
int sliderDemo_AppForm_PopulateMainContainer(sliderDemo_AppForm* pMe)
{
// 本例中有三个Slider
// slider1是水平放置的,直接放入坐标容器
// slider2是水平放置的,先放进比例容器,再把比例容器放进坐标容器。这时slider2的长宽设置实际不起作用,它自适应比例容器
// slider3是垂直放置的,直接放入坐标容器
int result = 0;
IWidget* containerWidget = NULL;
IPropContainer* propContainer = NULL;
WExtent we;
WidgetProp wp;
WidgetPos wpos;
IValueModel* SliderDemo_ValueModel = NULL;
// 创建容器(Container)与控件(widget)的实例
result = ISHELL_CreateInstance(pMe->piShell, AEECLSID_XYCONTAINER, (void**) &pMe->mainContainer); // 创建坐标容器的实例,这个是Container
result += ISHELL_CreateInstance(pMe->piShell, AEECLSID_PROPCONTAINER, (void**) &propContainer); // 创建比例容器(列表容器)的实例,这个是Container
result += ISHELL_CreateInstance(pMe->piShell, AEECLSID_STATICWIDGET, (void**)&pMe->numberStatic_1); // 创建静态文本1的实例,这个是widget
result += ISHELL_CreateInstance(pMe->piShell, AEECLSID_STATICWIDGET, (void**)&pMe->numberStatic_2); // 创建静态文本2的实例,这个是widget
result += ISHELL_CreateInstance(pMe->piShell, AEECLSID_STATICWIDGET, (void**)&pMe->numberStatic_3); // 创建静态文本3的实例,这个是widget
result += ISHELL_CreateInstance(pMe->piShell, AEECLSID_SLIDERWIDGET, (void**)&pMe->sliderDemo_1); // 创建Slider1的实例,这个是widget
result += ISHELL_CreateInstance(pMe->piShell, AEECLSID_SLIDERWIDGET, (void**)&pMe->sliderDemo_2); // 创建Slider2的实例,这个是widget
result += ISHELL_CreateInstance(pMe->piShell, AEECLSID_SLIDERWIDGET, (void**)&pMe->sliderDemo_3); // 创建Slider3的实例,这个是widget
if(result != 0) // 至少有一个实例创建失败
return EFAILED;
// 设置各个Slider的最大值 (宏PROP_SLIDER_MAXPOS)
// Slider的最小值固定是0
IWIDGET_SetProperty(pMe->sliderDemo_1, PROP_SLIDER_MAXPOS, 10);
IWIDGET_SetProperty(pMe->sliderDemo_2, PROP_SLIDER_MAXPOS, 100);
IWIDGET_SetProperty(pMe->sliderDemo_3, PROP_SLIDER_MAXPOS, 30);
// 设置最大值的另一种方式 IWIDGET_SetSliderMaxPos(pMe->sliderDemo_1,最大值);
// 如果不设置最大值,则默认为10
//!!!!!!!!!注意!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!
// 设置宽度,可能会导致焦点转换时,Slider色彩显示不刷新。
// 建议不要设置宽度。Slider在获得焦点时,宽度变粗,失去焦点时,变细。如果人为设置宽度,就不会自动变了。而且色彩可能不刷新。
//!!!!!!!!!!!!!!!!!!!!!!!
//!!!!!!!!!!!!!!!!!!!!!!!
// 注:Slider的滑杆边框由Border继承而来,针对Border的操作如宽度颜色等,一般都可用于Slider的滑杆
// 设置Slider滑杆的边框宽度 (宏PROP_BORDERWIDTH)
//IWIDGET_SetProperty(pMe->sliderDemo_1, PROP_BORDERWIDTH, 10);
//IWIDGET_SetProperty(pMe->sliderDemo_2, PROP_BORDERWIDTH, 1);
//IWIDGET_SetProperty(pMe->sliderDemo_3, PROP_BORDERWIDTH, 3);
// 设置滑杆边框宽度的另一种方式 IWIDGET_SetBorderWidth(pMe->sliderDemo_1, 宽度);
// 设置Slider手柄边框的颜色 (宏PROP_SLIDER_HANDLEBORDERCOLOR)
IWIDGET_SetProperty(pMe->sliderDemo_1, PROP_SLIDER_HANDLEBORDERCOLOR, MAKE_RGB( 255, 000, 000));
IWIDGET_SetProperty(pMe->sliderDemo_2, PROP_SLIDER_HANDLEBORDERCOLOR, MAKE_RGB( 000, 255, 000));
IWIDGET_SetProperty(pMe->sliderDemo_3, PROP_SLIDER_HANDLEBORDERCOLOR, MAKE_RGB( 000, 000, 255));
// 设置手柄边框颜色的另一种方式 IWIDGET_SetSliderHandleBorderColor(pMe->sliderDemo_1,MAKE_RGB(红, 绿, 蓝));
// 设置Slider滑杆边框的颜色 (同时设定了手柄颜色)
// PROP_INACTIVE_BORDERCOLOR: 当Slider处于非活动状态时的色彩
// PROP_ACTIVE_BORDERCOLOR: 当Slider处于活动状态时的色彩
// PROP_BORDERCOLOR: 直接指定所有状态下的边框颜色(各状态颜色一起指定为同一色)
IWIDGET_SetProperty(pMe->sliderDemo_1, PROP_INACTIVE_BORDERCOLOR, MAKE_RGB(000, 000, 128));
IWIDGET_SetProperty(pMe->sliderDemo_1, PROP_ACTIVE_BORDERCOLOR, MAKE_RGB( 128, 000, 00));
IWIDGET_SetProperty(pMe->sliderDemo_2, PROP_INACTIVE_BORDERCOLOR, MAKE_RGB( 100, 100, 100));
IWIDGET_SetProperty(pMe->sliderDemo_2, PROP_ACTIVE_BORDERCOLOR, MAKE_RGB( 128, 000, 128));
IWIDGET_SetProperty(pMe->sliderDemo_3, PROP_INACTIVE_BORDERCOLOR, MAKE_RGB( 50, 50, 50));
IWIDGET_SetProperty(pMe->sliderDemo_3, PROP_ACTIVE_BORDERCOLOR, MAKE_RGB( 000, 255, 000));
////....////....////....////....////
//IWIDGET_SetProperty(pMe->sliderDemo_1,PROP_BORDERCOLOR,MAKE_RGB(0, 0,255));
//IWIDGET_SetProperty(pMe->sliderDemo_2,PROP_BORDERCOLOR,MAKE_RGB(0, 255, 50));
//IWIDGET_SetProperty(pMe->sliderDemo_3,PROP_BORDERCOLOR,MAKE_RGB(0, 255, 50));
////....////....////....////....////
// 设置Slider滑杆杆体的颜色(滑杆底色)
// PROP_ACTIVE_BGCOLOR 指定活动状态时的底色
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -