Ver Mensaje Individual
  #7  
Antiguo 06-06-2015
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Reputación: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Originalmente lo publiqué en delphi pero puede traducirse a C++, esta es la versión:


Crear la región para el Skin:
Código PHP:
void __fastcall SkinControl(TWinControlControlGraphics::TBitmap *bmp)
{
   
bmp->HandleType bmDIB;
   
bmp->PixelFormat pf32bit;
   
Control->SetBounds(Control->LeftControl->Topbmp->Widthbmp->Height);

   
DWORD TransparentColor static_cast<DWORD*>(bmp->ScanLine[bmp->Height-1])[0];
   
HRGN rgnrgnTemp;

   
rgn CreateRectRgn(0000);

   for(
int y=0y<bmp->Height; ++y){
      
DWORD *pixel static_cast<DWORD*>(bmp->ScanLine[y]);
      for(
int x=0ini 0x<bmp->Width; ++x){
         if(
pixel[x] != TransparentColor){
            
rgnTemp CreateRectRgn(iniyxy+1);
            
CombineRgn(rgnrgnrgnTempRGN_OR);
            
DeleteObject(rgnTemp);
            
ini x;
         } else 
ini++;
      }
   }
   
SetWindowRgn(Control->Handlergntrue);
   
DeleteObject(rgn);


El cambio gráfico entre los estados:
Código PHP:
void __fastcall TSkinButton::CNDrawItem(TWMDrawItemMessage)
{
  
FCanvas->Handle Message.DrawItemStruct->hDC;
  
FCanvas->Refresh();
 
  if(
ComponentState.Contains(csDesigning)){
    if(
fBmpUp->Empty)
      
fBmpUp->LoadFromResourceName((int)HInstance"SKINBUTTON");
    
ActivateSkin();
    
FCanvas->Draw(ClientRect.leftClientRect.topfBmpUp);
    return;
  }
 
  
ActivateSkin();
 
  
bool Push Message.DrawItemStruct->itemState ODS_SELECTED;
 
  if(
Enabled){
    if(
Push && !fAllowUp){
      
fDown ^= true;
    }
    else if(
fAllowUp){
      
fDown Push;
    }
  }
  
FBitmap fBmpUp;
  if(
fDown){    // El botón está pulsado
    
if(!fBmpDown->EmptyFBitmap fBmpDown;
    if(
Enabled && fHiLight && !fBmpDownHiLight->EmptyFBitmap fBmpDownHiLight;
  }else{
    
FBitmap fBmpUp;
    if(
Enabled && fHiLight && !fBmpUpHiLight->EmptyFBitmap fBmpUpHiLight;
  }
 
  
FCanvas->StretchDraw(ClientRectFBitmap);

El código en C++ está aquí.


Saludos.
Responder Con Cita