예제 #1
0
void WDL_VirtualIconButton::SetIcon(WDL_VirtualIconButton_SkinConfig *cfg, float alpha, bool buttonownsicon)
{ 
  if (m_iconCfg != cfg || m_alpha != alpha) 
  {
    bool combineRects=false;
    RECT r;
    if (m_iconCfg && m_iconCfg != cfg && m_iconCfg->olimage)
    {
      combineRects=true;
      GetPositionPaintExtent(&r);
      if (WantsPaintOver())
      {
        RECT r3;
        GetPositionPaintOverExtent(&r3);
        if (r3.left<r.left) r.left=r3.left;
        if (r3.top<r.top) r.top=r3.top;
        if (r3.right>r.right) r.right=r3.right;
        if (r3.bottom>r.bottom) r.bottom=r3.bottom;
      }
    }
    if (m_ownsicon && m_iconCfg && m_iconCfg != cfg)
    {
      delete m_iconCfg->image;
      delete m_iconCfg->olimage;
      delete m_iconCfg;
    }
    m_alpha=alpha; 
    m_iconCfg=cfg;

    if (combineRects)
    {
      RECT r3;
      GetPositionPaintExtent(&r3);
      if (r3.left<r.left) r.left=r3.left;
      if (r3.top<r.top) r.top=r3.top;
      if (r3.right>r.right) r.right=r3.right;
      if (r3.bottom>r.bottom) r.bottom=r3.bottom;

      if (WantsPaintOver())
      {
        GetPositionPaintOverExtent(&r3);
        if (r3.left<r.left) r.left=r3.left;
        if (r3.top<r.top) r.top=r3.top;
        if (r3.right>r.right) r.right=r3.right;
        if (r3.bottom>r.bottom) r.bottom=r3.bottom;
      }

      r.left -= m_position.left;
      r.right -= m_position.left;
      r.top -= m_position.top;
      r.bottom -= m_position.top;
      RequestRedraw(&r);
    }
    else
    {
      RequestRedraw(NULL); 
    }
  }
  m_ownsicon = buttonownsicon;
 }
예제 #2
0
void WDL_VirtualIconButton::OnPaintOver(LICE_IBitmap *drawbm, int origin_x, int origin_y, RECT *cliprect)
{
  if (m_iconCfg && m_iconCfg->olimage)
  {
    int sx=0;
    int sy=0;
    int w=m_iconCfg->olimage->getWidth();
    int h=m_iconCfg->olimage->getHeight();
    if (m_iconCfg->image_ltrb_used.flags&1)  { w-=2; h-= 2; sx++,sy++; }

    w/=3;

    if (w>0 && h>0)
    {
      if (m_is_button)
      {
        if ((m_pressed&2))  sx+=(m_pressed&1) ? w*2 : w;
      }

      if (m_iconCfg->image_ltrb_used.flags&2) // use main image's stretch areas (outer areas become unstretched)
      {
        WDL_VirtualWnd_BGCfg cfg={0,};
        LICE_SubBitmap sb(m_iconCfg->olimage,sx,sy,w,h);
        cfg.bgimage = &sb;
        cfg.bgimage_lt[0] = m_iconCfg->image_ltrb_main[0]+1; // image_ltrb_main expects 1-based number
        cfg.bgimage_lt[1] = m_iconCfg->image_ltrb_main[1]+1;
        cfg.bgimage_rb[0] = m_iconCfg->image_ltrb_main[2]+1;
        cfg.bgimage_rb[1] = m_iconCfg->image_ltrb_main[3]+1;
        cfg.bgimage_lt_out[0] = m_iconCfg->image_ltrb_ol[0]+1;
        cfg.bgimage_lt_out[1] = m_iconCfg->image_ltrb_ol[1]+1;
        cfg.bgimage_rb_out[0] = m_iconCfg->image_ltrb_ol[2]+1;
        cfg.bgimage_rb_out[1] = m_iconCfg->image_ltrb_ol[3]+1;
        cfg.bgimage_noalphaflags=0;

        RECT r=m_position,r2;
        GetPositionPaintOverExtent(&r2);
        WDL_VirtualWnd_ScaledBlitBG(drawbm,&cfg,
          r.left+origin_x,r.top+origin_y,r.right-r.left,r.bottom-r.top,
          r2.left+origin_x,r2.top+origin_y,r2.right-r2.left,r2.bottom-r2.top,
          m_alpha,LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR|LICE_BLIT_USE_ALPHA);
      }
      else
      {
        RECT r;
        GetPositionPaintOverExtent(&r);
        LICE_ScaledBlit(drawbm,m_iconCfg->olimage,r.left+origin_x,r.top+origin_y,
          r.right-r.left,
          r.bottom-r.top,
          (float)sx,(float)sy,(float)w,(float)h, m_alpha,  // m_grayed?
          LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR|LICE_BLIT_USE_ALPHA);      
      }
    }
  }
}
예제 #3
0
void WDL_VirtualIconButton::OnPaintOver(LICE_IBitmap *drawbm, int origin_x, int origin_y, RECT *cliprect)
{
  if (m_iconCfg && m_iconCfg->olimage)
  {
    RECT r;
    GetPositionPaintOverExtent(&r);

    int sx=0;
    int sy=0;
    int w=m_iconCfg->olimage->getWidth();
    int h=m_iconCfg->olimage->getHeight();
    if (m_iconCfg->image_ltrb_used.flags&1)  { w-=2; h-= 2; sx++,sy++; }

    w/=3;

    if (w>0 && h>0)
    {
      if (m_is_button)
      {
        if ((m_pressed&2))  sx+=(m_pressed&1) ? w*2 : w;
      }
      LICE_ScaledBlit(drawbm,m_iconCfg->olimage,r.left+origin_x,r.top+origin_y,
        r.right-r.left,
        r.bottom-r.top,
        (float)sx,(float)sy,(float)w,(float)h, m_alpha,  // m_grayed?
        LICE_BLIT_MODE_COPY|LICE_BLIT_FILTER_BILINEAR|LICE_BLIT_USE_ALPHA);      
    }
  }
}