/// @brief ÉèÖÃΪˮƽ»ò´¹Ö±»¬¶¯Ìõ. /// @param hEle ÔªËؾä±ú. /// @param bHorizon Èç¹ûֵΪTRUEˮƽ»¬¶¯Ìõ,·ñÔòÏà·´. void WINAPI XSliderBar_SetHorizon(HELE hEle,BOOL bHorizon) //ˮƽÏÔʾ»ò´¹Ö± { IsSliderDebug(hEle,__FUNCTION__); SLIDER(hEle)->bHorizon=bHorizon; slider_ *pObj=SLIDER(hEle); int cx=((ele_*)hEle)->rect.right-((ele_*)hEle)->rect.left; int cy=((ele_*)hEle)->rect.bottom-((ele_*)hEle)->rect.top; int btnWidth= ((ele_*)(pObj->hButton))->rect.right-((ele_*)(pObj->hButton))->rect.left; int btnHeight= ((ele_*)(pObj->hButton))->rect.bottom-((ele_*)(pObj->hButton))->rect.top; if(pObj->bHorizon) { RECT rc; rc.left=(long)(pObj->pos*pObj->minPos); rc.top=cy/2-btnWidth/2; rc.right=rc.left+btnHeight; rc.bottom=rc.top+btnWidth; XEle_SetRect(pObj->hButton,&rc); }else { RECT rc; rc.left=cx/2-btnHeight/2; rc.top=(long)(pObj->pos*pObj->minPos); rc.right=rc.left+btnHeight; rc.bottom=rc.top+btnWidth; XEle_SetRect(pObj->hButton,&rc); } XEle_RedrawEle(hEle); }
void SliderBar_Init(HELE hEle,int x,int y,int cx,int cy,int eleType,HXCGUI hParent) { Ele_Init(hEle,x,y,cx,cy,eleType,hParent); AddTypeDebug(hEle,XC_SLIDERBAR); slider_ *pObj=SLIDER(hEle); pObj->range=100; pObj->minPos=1; pObj->btnWidth=10; if(pObj->bHorizon) { pObj->hButton= XBtn_Create(0,0,pObj->btnWidth,cy); }else { pObj->hButton= XBtn_Create(0,0,cx,pObj->btnWidth); } XEle_AddEle(hEle,pObj->hButton); XEle_EnableFocus(pObj->hButton,FALSE); Ele_SetType(pObj->hButton,XC_BUTTON_SLIDERBAR_SLIDER); XEle_RegisterMessage(hEle,XM_PAINT,SliderBar_OnDraw); XEle_RegisterMessage(hEle,XM_MOUSEMOVE,SliderBar_OnMouseMove); XEle_RegisterMessage(hEle,XM_LBUTTONDOWN,SliderBar_OnLButtonDown); XEle_RegisterMessage(hEle,XM_LBUTTONUP,SliderBar_OnLButtonUp); XEle_RegisterEvent(hEle,XE_MOUSELEAVE,SliderBar_OnEventMouseLeave); XEle_RegisterMessage(pObj->hButton,XM_PAINT,SliderBar_OnDrawButton); XEle_RegisterEvent(hEle,XE_DESTROY,SliderBar_OnDestroy); }
/// @brief ÉèÖû¬¿é¿í¶È. /// @param hEle ÔªËؾä±ú. /// @param width »¬¿é¿í¶È. void WINAPI XSliderBar_SetButtonWidth(HELE hEle,int width) //ÉèÖû¬¿é¿í¶È { IsSliderDebug(hEle,__FUNCTION__); slider_ *pObj=SLIDER(hEle); pObj->btnWidth=width; SliderBar_Adjust(hEle); }
static void handle_dragged( ClutterDragAction *action, ClutterActor *actor, gfloat dx, gfloat dy, gpointer user_data) { Slider* slider = SLIDER(user_data); gfloat const new_pos = slider_get_pos(slider) + (dy/200); slider_set_pos(slider, new_pos); }
void slider_float_cb(GtkWidget * widget, gpointer data) { Slider *slider = SLIDER(data); GtkAdjustment *adj = (GtkAdjustment *) slider->adj; *(slider->data.fptr) = adj->lower + adj->upper - adj->value; snprintf(slider->value_str, sizeof(slider->value_str), "%5.2f", *(slider->data.fptr)); gtk_label_set_text(GTK_LABEL(SLIDER(data)->value_label), slider->value_str); #if 0 +g_print("slider: %d\n", *(SLIDER(data)->data)); #endif }
static void slider_clicked( ClutterClickAction *action, ClutterActor *actor, gpointer user_data) { float x, y; clutter_click_action_get_coords(action, &x, &y); clutter_actor_transform_stage_point(actor, x, y, &x, &y); Slider* slider = SLIDER(user_data); slider_set_pos(slider, y/200); }
/// @brief »¬¶¯ÌõÔªËØ,ÏÔʾµ±Ç°½ø¶ÈÌùͼ. /// @param hEle ÔªËؾä±ú. /// @param hImage ͼƬ¾ä±ú. void WINAPI XSliderBar_SetImage2(HELE hEle,HIMAGE hImage) //ÏÔʾµ±Ç°½ø¶ÈͼƬ { IsSliderDebug(hEle,__FUNCTION__); if(hImage) { IsHImageDebug(hImage,__FUNCTION__); } Image_AddImage(SLIDER(hEle)->hImage,hImage); }
/// @brief »¬¶¯ÌõÔªËر³¾°Ìùͼ. /// @param hEle ÔªËؾä±ú. /// @param hImage ͼƬ¾ä±ú. void WINAPI XSliderBar_SetImage(HELE hEle,HIMAGE hImage) { IsSliderDebug(hEle,__FUNCTION__); if(hImage) { IsHImageDebug(hImage,__FUNCTION__); } Image_AddImage(SLIDER(hEle)->hImage_bk,hImage); }
BOOL CALLBACK SliderBar_OnLButtonUp(HELE hEle,UINT flags,POINT *pPt) { slider_ *pObj=SLIDER(hEle); if(pObj->bDown) { pObj->bDown=FALSE; XEle_ReleaseCapture(hEle); //ÊÍ·ÅÔªËØÊó±ê²¶»ñ } return FALSE; }
static void slider_allocate( ClutterActor *actor, const ClutterActorBox *box, ClutterAllocationFlags flags) { CLUTTER_ACTOR_CLASS(slider_parent_class)->allocate(actor, box, flags); SliderPrivate *priv = SLIDER(actor)->priv; const gfloat box_height = clutter_actor_box_get_height(box); ClutterActorBox child_box = { .x1 = 0.0, .y1 = 0.0, .x2=clutter_actor_box_get_width(box), .y2=box_height}; clutter_actor_allocate(priv->box, &child_box, flags); child_box.y1 = box_height * (priv->pos - 0.05); child_box.y2 = box_height * (priv->pos + 0.05); clutter_actor_allocate(priv->handle, &child_box, flags); } static void slider_paint(ClutterActor *actor) { SliderPrivate *priv = SLIDER(actor)->priv; clutter_actor_paint(priv->box); clutter_actor_paint(priv->handle); }
/// @brief ÉèÖû¬¿éλÖÃ. /// @param hEle ÔªËؾä±ú /// @param pos »¬¿éλÖÃ. void WINAPI XSliderBar_SetPos(HELE hEle,int pos) //ÉèÖû¬¿éλÖà { IsSliderDebug(hEle,__FUNCTION__); slider_ *pObj=SLIDER(hEle); RECT rect; XEle_GetClientRect(hEle,&rect); if(pObj->bHorizon) { int cx=rect.right-rect.left; int x=(int)(pos*pObj->minPos); RECT rc; rc.left=x; rc.top=0; rc.right=rc.left+pObj->btnWidth; rc.bottom=rect.bottom-rect.top; if(rc.right>cx) { rc.right=cx; rc.left=rc.right-pObj->btnWidth; } XEle_SetRect(pObj->hButton,&rc); }else { int cy=rect.bottom-rect.top; int y=(int)(pos*pObj->minPos); RECT rc=rect; rc.bottom=rect.bottom-y; rc.top=rc.bottom-pObj->btnWidth; if(rc.top<0) { rc.bottom=pObj->btnWidth; rc.top=0; } XEle_SetRect(pObj->hButton,&rc); } SLIDER(hEle)->pos=pos; XEle_RedrawEle(hEle); }
BOOL CALLBACK SliderBar_OnEventMouseLeave(HELE hEle,HELE hEventEle) { if(hEle!=hEventEle) return FALSE; slider_ *pObj=SLIDER(hEle); if(pObj->bDown) { pObj->bDown=FALSE; XEle_ReleaseCapture(hEle); //ÊÍ·ÅÔªËØÊó±ê²¶»ñ } return FALSE; }
static void slider_destroy(ClutterActor *self) { SliderPrivate *priv = SLIDER(self)->priv; if (priv->box) { clutter_actor_destroy(priv->box); priv->box = NULL; clutter_actor_destroy(priv->handle); priv->handle = NULL; } if (CLUTTER_ACTOR_CLASS(slider_parent_class)->destroy) CLUTTER_ACTOR_CLASS(slider_parent_class)->destroy(self); }
static void slider_get_property( GObject *gobject, guint prop_id, GValue *value, GParamSpec *pspec) { SliderPrivate *priv = SLIDER(gobject)->priv; switch (prop_id) { case PROP_POS: g_value_set_float(value, priv->pos); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); break; } }
static void slider_set_property( GObject *gobject, guint prop_id, const GValue *value, GParamSpec *pspec) { Slider *slider = SLIDER(gobject); switch (prop_id) { case PROP_POS: slider_set_pos(slider, g_value_get_float(value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); break; } }
static gboolean scrolled( ClutterActor *actor, ClutterEvent *event, gpointer user_data) { ClutterScrollDirection direction = clutter_event_get_scroll_direction(event); Slider* slider = SLIDER(user_data); switch (direction) { case CLUTTER_SCROLL_UP: slider_set_pos(slider, slider_get_pos(slider) - 0.1); break; case CLUTTER_SCROLL_DOWN: slider_set_pos(slider, slider_get_pos(slider) + 0.1); break; default: break; } return CLUTTER_EVENT_STOP; }
void slider_refresh(GtkWidget * slider) { switch (SLIDER(slider)->type) { case SLIDER_TYPE_INT: gtk_adjustment_set_value(GTK_ADJUSTMENT (SLIDER(slider)->adj), GTK_ADJUSTMENT(SLIDER(slider)-> adj)->upper - *(SLIDER(slider)->data.iptr)); break; case SLIDER_TYPE_FLOAT: gtk_adjustment_set_value(GTK_ADJUSTMENT (SLIDER(slider)->adj), GTK_ADJUSTMENT(SLIDER(slider)-> adj)->upper - *(SLIDER(slider)->data.fptr)); break; default: printf("Ooops : Bad slider type : %d\n", SLIDER(slider)->type); return; } }
/// @brief »ñÈ¡»¬¿é¿í¶È. /// @param hEle ÔªËؾä±ú. /// @return »¬¿é¿í¶È. int WINAPI XSliderBar_GetButtonWidth(HELE hEle) //»ñÈ¡»¬¿é¿í¶È { IsSliderDebug(hEle,__FUNCTION__); slider_ *pObj=SLIDER(hEle); return pObj->btnWidth; }
void SliderBar_Adjust(HELE hEle) { slider_ *pObj=SLIDER(hEle); if(SLIDER(hEle)->bHorizon) { double cx=(((ele_*)hEle)->rect.right-((ele_*)hEle)->rect.left)-SLIDER(hEle)->btnWidth; if(0!=cx && 0!=SLIDER(hEle)->range) SLIDER(hEle)->minPos=cx/SLIDER(hEle)->range; else SLIDER(hEle)->minPos=0; }else { double cy=(((ele_*)hEle)->rect.bottom-((ele_*)hEle)->rect.top)-SLIDER(hEle)->btnWidth; if(0!=cy && 0!=SLIDER(hEle)->range) SLIDER(hEle)->minPos=cy/SLIDER(hEle)->range; else SLIDER(hEle)->minPos=0; } int cx=((ele_*)hEle)->rect.right-((ele_*)hEle)->rect.left; int cy=((ele_*)hEle)->rect.bottom-((ele_*)hEle)->rect.top; int btnWidth= ((ele_*)(pObj->hButton))->rect.right-((ele_*)(pObj->hButton))->rect.left; int btnHeight= ((ele_*)(pObj->hButton))->rect.bottom-((ele_*)(pObj->hButton))->rect.top; if(pObj->bHorizon) { btnWidth=pObj->btnWidth; RECT rc; rc.left=(long)(pObj->pos*pObj->minPos); rc.top=cy/2-btnHeight/2; rc.right=rc.left+btnWidth; rc.bottom=rc.top+btnHeight; XEle_SetRect(pObj->hButton,&rc); }else { btnHeight=pObj->btnWidth; RECT rc; rc.left=cx/2-btnWidth/2; rc.top=(long)(pObj->pos*pObj->minPos); rc.right=rc.left+btnWidth; rc.bottom=rc.top+btnHeight; XEle_SetRect(pObj->hButton,&rc); } //XEle_RedrawEle(hEle); }
BOOL CALLBACK SliderBar_OnLButtonDown(HELE hEle,UINT flags,POINT *pPt) { slider_ *pObj=SLIDER(hEle); if(!pObj->bDown) { pObj->bDown=TRUE; RECT rect; XEle_GetClientRect(hEle,&rect); int cx=rect.right-rect.left; int cy=rect.bottom-rect.top; int btnWidth= ((ele_*)(pObj->hButton))->rect.right-((ele_*)(pObj->hButton))->rect.left; int btnHeight= ((ele_*)(pObj->hButton))->rect.bottom-((ele_*)(pObj->hButton))->rect.top; if(pObj->bHorizon) { int x=pPt->x-(btnWidth/2); if(x<0) x=0; else if(x>(cx-btnWidth)) x=cx-btnWidth; int pos=(int)( x/pObj->minPos); if(pos != pObj->pos) { pObj->pos=pos; RECT rc; rc.left=(long)(pos*pObj->minPos); rc.top=cy/2-btnHeight/2; rc.right=rc.left+btnWidth; rc.bottom=rc.top+btnHeight; XEle_SetRect(pObj->hButton,&rc); XEle_SetCapture(hEle); //ÉèÖÃÔªËØÊó±ê²¶»ñ BUTTON(pObj->hButton)->state=STATE_DOWN; Ele_SendEvent(hEle,XE_SLIDER_CHANGE,(WPARAM)pObj->pos,0); XEle_RedrawEle(hEle); } }else { int height=rect.bottom-pPt->y; height=height-(btnHeight/2); if(height<0) height=0; else if(height>(cy-btnHeight)) height=cy-btnHeight; int pos=(int)( height/pObj->minPos); if(pos != pObj->pos) { pObj->pos=pos; RECT rc=rect; rc.left=cx/2-btnWidth/2; rc.right=rc.left+btnWidth; rc.bottom=rc.bottom-height; rc.top=rc.bottom-pObj->btnWidth; XEle_SetRect(pObj->hButton,&rc); XEle_SetCapture(hEle); //ÉèÖÃÔªËØÊó±ê²¶»ñ Ele_SendEvent(hEle,XE_SLIDER_CHANGE,(WPARAM)pObj->pos,0); XEle_RedrawEle(hEle); } } } return FALSE; }
/// @brief ÉèÖû¬¶¯·¶Î§. /// @param hEle ÔªËؾä±ú /// @param range »¬¶¯·¶Î§. void WINAPI XSliderBar_SetRange(HELE hEle,int range) //ÉèÖû¬¶¯·¶Î§ { IsSliderDebug(hEle,__FUNCTION__); SLIDER(hEle)->range=range; if(SLIDER(hEle)->bHorizon) { double cx=(((ele_*)hEle)->rect.right-((ele_*)hEle)->rect.left)-SLIDER(hEle)->btnWidth; if(0!=cx && 0!=SLIDER(hEle)->range) SLIDER(hEle)->minPos=cx/SLIDER(hEle)->range; else SLIDER(hEle)->minPos=0; }else { double cy=(((ele_*)hEle)->rect.bottom-((ele_*)hEle)->rect.top)-SLIDER(hEle)->btnWidth; if(0!=cy && 0!=SLIDER(hEle)->range) SLIDER(hEle)->minPos=cy/SLIDER(hEle)->range; else SLIDER(hEle)->minPos=0; } }
void CALLBACK SliderBar_OnDestroy(HELE hEle) //Ïú»Ù { if(SLIDER(hEle)->hImage_bk) XImage_Destroy(SLIDER(hEle)->hImage_bk); if(SLIDER(hEle)->hImage) XImage_Destroy(SLIDER(hEle)->hImage); }
/// @brief »ñÈ¡»¬¶¯ÌõÉÏ»¬¿é¾ä±ú.·µ»Ø¾ä±úÀàÐÍΪButton. /// @param hEle ÔªËؾä±ú /// @return »¬¿é¾ä±ú. HELE WINAPI XSliderBar_GetButton(HELE hEle) //»ñÈ¡»¬¿é { IsSliderDebug(hEle,__FUNCTION__); return SLIDER(hEle)->hButton; }
BOOL CALLBACK SliderBar_OnDraw(HELE hEle,HDRAW hDraw) { RECT rect; XEle_GetClientRect(hEle,&rect); slider_ *pObject=SLIDER(hEle); if(pObject->hImage_bk) { XDraw_HImageSuper_(hDraw,pObject->hImage_bk,&rect); }else { if(pObject->bHorizon) //ˮƽ { int middle=(rect.bottom-rect.top)/2+1; HRGN hRgn=XDraw_CreateRoundRectRgn_(hDraw,0,middle-4,rect.right+1,middle+4,3,3); XDraw_SelectClipRgn_(hDraw,hRgn); //»æÖÆÍâ±ßÏß HBRUSH hBrush=XDraw_CreateSolidBrush_(hDraw,RGB(130,130,130)); XDraw_FrameRgn_(hDraw,hRgn,hBrush,1,1); //DeleteObject(hBrush); ///////// HPEN hPen1=XDraw_CreatePen_(hDraw,PS_SOLID,1,RGB(80,80,80)); HGDIOBJ hOld1=XDraw_SelectObject_(hDraw,hPen1); XDraw_MoveToEx_(hDraw,3, middle-4,NULL); XDraw_LineTo_(hDraw,rect.right-2,middle-4); //XDraw_SelectObject_(hDraw,hOld1); //DeleteObject(hPen1); /////////////// HPEN hPen=XDraw_CreatePen_(hDraw,PS_SOLID,1,RGB(200,200,200)); HGDIOBJ hOld=XDraw_SelectObject_(hDraw,hPen); XDraw_MoveToEx_(hDraw,2, middle-3,NULL); XDraw_LineTo_(hDraw,rect.right-2,middle-3); // SelectObject(hdc,hOld); // DeleteObject(hPen); XDraw_SelectClipRgn_(hDraw,NULL); // DeleteObject(hRgn); }else //´¹Ö± { int middle=(rect.right-rect.left)/2+1; HRGN hRgn=XDraw_CreateRoundRectRgn_(hDraw,middle-4,0,middle+4,rect.bottom,3,3); XDraw_SelectClipRgn_(hDraw,hRgn); //»æÖÆÍâ±ßÏß HBRUSH hBrush=XDraw_CreateSolidBrush_(hDraw,RGB(130,130,130)); XDraw_FrameRgn_(hDraw,hRgn,hBrush,1,1); //DeleteObject(hBrush); ///////// HPEN hPen1=XDraw_CreatePen_(hDraw,PS_SOLID,1,RGB(80,80,80)); HGDIOBJ hOld1=XDraw_SelectObject_(hDraw,hPen1); XDraw_MoveToEx_(hDraw, middle-4,3,NULL); XDraw_LineTo_(hDraw,middle-4,rect.bottom-2); // SelectObject(hdc,hOld1); // DeleteObject(hPen1); /////////////// HPEN hPen=XDraw_CreatePen_(hDraw,PS_SOLID,1,RGB(200,200,200)); HGDIOBJ hOld=XDraw_SelectObject_(hDraw,hPen); XDraw_MoveToEx_(hDraw, middle-3,2,NULL); XDraw_LineTo_(hDraw,middle-3,rect.bottom-2); //SelectObject(hdc,hOld); //DeleteObject(hPen); XDraw_SelectClipRgn_(hDraw,NULL); //DeleteObject(hRgn); } } HDC hdc=XDraw_GetHDC_(hDraw); //½ø¶ÈÌùͼ if(pObject->bHorizon) //ˮƽ { if(pObject->hImage) { int cx=0; if(0!=pObject->range) { double pos=(double)pObject->pos/pObject->range; int width=rect.right-rect.left; cx=(int)(pos*width); } RECT rc=rect; rc.right=cx; switch(XImage_GetDrawType(pObject->hImage)) { case XC_IMAGE_DEFAULT: //ÆÕͨ: case XC_IMAGE_ADAPTIVE: XDraw_HImage2_(hDraw,pObject->hImage,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top); break; case XC_IMAGE_STRETCH: //ÀÉì XDraw_HImageStretch_(hDraw,pObject->hImage,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top); break; case XC_IMAGE_TILE://ƽÆÌ XDraw_HImageExTile_(hDraw,pObject->hImage,&rc,0); break; } } }else //´¹Ö± { if(pObject->hImage) { int height=0; if(0!=pObject->range) { double pos=(double)pObject->pos/pObject->range; height=(int)(pos*(rect.bottom-rect.top)); } RECT rc=rect; rc.top=rc.bottom-height; switch(XImage_GetDrawType(pObject->hImage)) { case XC_IMAGE_DEFAULT: //ÆÕͨ: case XC_IMAGE_ADAPTIVE: { RECT rc2=rc; rc2.bottom=XImage_GetHeight(pObject->hImage); rc2.top=rc2.bottom-height; XDraw_HImageSuper2_(hDraw,pObject->hImage,&rc,&rc2); } break; case XC_IMAGE_STRETCH: //ÀÉì XDraw_HImageStretch_(hDraw,pObject->hImage,rc.left,rc.top,rc.right-rc.left,height); break; case XC_IMAGE_TILE://ƽÆÌ XDraw_HImageExTile_(hDraw,pObject->hImage,&rc,1); break; } } } return TRUE; }
/// @brief »ñÈ¡»¬¿éλÖÃ. /// @param hEle ÔªËؾä±ú /// @return »¬¿éλÖÃ. int WINAPI XSliderBar_GetPos(HELE hEle) //»ñÈ¡»¬¿éÖµ { IsSliderDebug(hEle,__FUNCTION__); return SLIDER(hEle)->pos; }