⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sliderwidgetdemo.c

📁 高通brew平台上的BUIW控件中的slider的示例程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*===========================================================================
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 + -