Usted no esta registrado, haga click aqui para registrarse!
 Inicio   Artículos   Recursos   Foros 
 

Iniciar sesión

¿No estas registrado?
Registrate en Latindevelopers.com!

 



Creando un boton con iconos en Visual C++.

Muchas veces queremos agregarle color y vistosidad a la interfaz. Como casi todo en Visual C++ tienen que ser implementado, ahora te muestro una clase derivada de CButton que pinta una imagen en una posición determinada.


 

Botones con iconos/imagenes en un dialogo
Muestra de los botones con iconos/imagenes en un dialogo

 

Las imágenes tienen que estar preparadas en un CImageList fuera de la clase luego ser pasadas con la función SetImageList indicando la posicion de la imagen que se utilizará. Deben asignarse las imágenes en pares por que la segunda imagen se utiliza para pintarlo en el modo presionado.

void CImageButton::SetImageList(CImageList *Images, INT imageIndex)
{
  m_images = Images;
  m_iImageIndex = imageIndex;
}

Antes de que nuestro control se instancie con la variable debemos asegurarnos que tenga la propiedad de pintado por el usuario (Owner Draw).

void CImageButton::PreSubclassWindow() 
{
  CButton::PreSubclassWindow();

  ModifyStyle(0, BS_OWNERDRAW);

}


La funcion siguiente es la que pinta el boton, le quité mucho codigo. En los archivos de descarga los encontrarás. El resto de las funciones esta intactas.

void CImageButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
  ASSERT(lpDrawItemStruct != NULL);
  CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

  CRect rect = lpDrawItemStruct->rcItem;
  UINT state = lpDrawItemStruct->itemState;
  UINT nStyle = GetStyle();

  int nSavedDC = pDC->SaveDC();

  if (state & ODS_SELECTED){
    ::DrawFrameControl(lpDrawItemStruct->hDC,
             &rect,DFC_BUTTON|DFCS_ADJUSTRECT,DFCS_PUSHED);
  }else{
    ::DrawFrameControl(lpDrawItemStruct->hDC,
             &rect,DFC_BUTTON|DFCS_ADJUSTRECT,DFCS_BUTTONPUSH);
  }

  CString strText;
  GetWindowText(strText);


  if (!strText.IsEmpty())
  {
    if(m_imagePos == ImageCenter){
      goto WithImageCenter;
    }

    CSize Extent = pDC->GetTextExtent(strText);
    CPont pt;

    switch(m_imagePos){
      case ImageLeft:
        pt = CPont(
             rect.right - Extent.cx - 10 ,
             rect.CenterPont().y - Extent.cy / 2 );
        break;
      case ImageRight:
        pt = CPont(

             rect.left + 10 ,
             rect.CenterPont().y - Extent.cy / 2 );
        break;
      case ImageTop:
        pt = CPont(
             rect.CenterPont().x - Extent.cx / 2,
             rect.bottom - Extent.cy - 8);
        break;
      case ImageBottom:
        pt = CPont(
             rect.CenterPont().x - Extent.cx / 2,
             rect.top + 8);
        break;
    }

    if (state & ODS_SELECTED) {
      pt.Offset(1,1);
    }
    
    pDC->SetBkMode(TRANSPARENT);

    if (state & ODS_DISABLED){
      pDC->DrawState(pt,Extent,strText,
             DSS_DISABLED,TRUE, 0, (HBRUSH)NULL);
    }else{
      pDC->DrawState(pt,Extent,strText,
             DSS_NORMAL,TRUE, 0, (HBRUSH)NULL);
    }
  }  

  WithImageCenter:

  if(m_images != NULL){
    CPont pt;
    int cx,cy;
    ::ImageList_GetIconSize(m_images->m_hImageList,&cx,&cy);
    switch(m_imagePos){
      case ImageLeft:
        pt = CPont( rect.left + 10,
              rect.CenterPont().y - cy / 2 );
        break;
      case ImageRight:
        pt = CPont( rect.right - cx -10,
              rect.CenterPont().y - cy / 2 );
        break;
      case ImageTop:
        pt = CPont( rect.CenterPont().x - cx / 2,
              rect.top + 8);
        break;
      case ImageBottom:
        pt = CPont( rect.CenterPont().x - cx / 2,
              rect.bottom - cy - 8);
        break;
      case ImageCenter:
        pt = CPont( rect.CenterPont().x - cx / 2,
              rect.CenterPont().y - cy / 2 );
        break;
    }

    if((state & ODS_SELECTED)){
      pt.Offset(1,1);
      m_images->Draw(pDC,m_iImageIndex+1,pt,ILD_TRANSPARENT);
    }else{
      m_images->Draw(pDC,m_iImageIndex ,pt,ILD_TRANSPARENT);
    }
  }

  if(state & ODS_FOCUS){
    rect.DeflateRect(4,4);
    ::DrawFocusRect(lpDrawItemStruct->hDC,&rect);
  }

  pDC->RestoreDC(nSavedDC);
}

 

Descargas

Acerca del Author

Nombre de usuario: latindeveloper
Blog/URL:
Fecha de envío: 2004-03-14
Ultima Actualización:
Visualizaciones: 7468
Nedstat Basic - Web site estadisticas gratuito
El contador para sitios web particulares