Advanced Gadgets

Share your advanced PureBasic knowledge/code with the community.
User avatar
RocketRider
User
User
Posts: 87
Joined: Tue Aug 19, 2008 11:01 am

Advanced Gadgets

Post by RocketRider »

Hello,
I have writen a few functions to pigment Buttons and Progress bars. :wink:
Image

Code: Select all

;**************************** 
;***   Advanced Gadgets   ***
;***    Licence:  Zlib    *** 
;**************************** 
;*** (c) 2009 RocketRider *** 
;***    RocketRider.eu    *** 
;**************************** 
;***    PureBasic 4.40    *** 
;***      25.08.2009      ***
;****************************
;Copyright (c) 2009 RocketRider
;This software is provided 'as-is', without any express Or implied warranty. In no event will the authors be held liable For any damages arising from the use of this software.
;Permission is granted To anyone To use this software For any purpose, including commercial applications, And To alter it And redistribute it freely, subject To the following restrictions:
;The origin of this software must Not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
;Altered source versions must be plainly marked As such, And must Not be misrepresented As being the original software.
;This notice may Not be removed Or altered from any source distribution.




Procedure SetImageGammacorrection(hWnd,RedGamma,GreenGamma,BlueGamma,Colorfullness, Brightness, Contrast)
  If RedGamma < 2500:RedGamma = 2500:EndIf
  If RedGamma > 65000:RedGamma = 65000:EndIf
  
  If GreenGamma < 2500:GreenGamma = 2500:EndIf
  If GreenGamma > 65000:GreenGamma = 65000:EndIf
  
  If BlueGamma < 2500:BlueGamma = 2500:EndIf
  If BlueGamma > 65000:BlueGamma = 65000:EndIf
  
  If Colorfullness < -100:Colorfullness = -100:EndIf
  If Colorfullness >  100:Colorfullness =  100:EndIf

  If Brightness < -100:Brightness = -100:EndIf
  If Brightness >  100:Brightness =  100:EndIf
  
  If Contrast < -100:Contrast = -100:EndIf
  If Contrast >  100:Contrast =  100:EndIf  
  
  
  GetWindowRect_(hWnd,re.rect)
  DC=GetWindowDC_(hWnd)
 
  SetStretchBltMode_(DC,#HALFTONE)
  GetColorAdjustment_(DC,C.COLORADJUSTMENT)
  C\caRedGamma=RedGamma
  C\caGreenGamma=GreenGamma
  C\caBlueGamma=BlueGamma
  
  C\caColorfulness = Colorfullness
  C\caBrightness = Brightness
  C\caContrast = Contrast

  SetColorAdjustment_(DC,C.COLORADJUSTMENT)
  
  StretchBlt_(DC,0,0,re\right - re\left ,re\bottom -re\top ,DC,0,0,re\right - re\left ,re\bottom -re\top ,#SRCCOPY)
  ReleaseDC_(hWnd,DC)
EndProcedure


Procedure AdvGadgetCB(hWnd,Msg,w,l)

    CB.l = GetProp_(hWnd, "ADVGADGET_CALLBACK")
    If CB
      Result = CallFunctionFast(CB,hWnd,Msg,w,l)
    Else
      Result = DefWindowProc_(hWnd,Msg,w,l)
    EndIf

  If GetProp_(hWnd, "ADVGADGET_BUTTON")
    If Msg = #WM_PAINT Or Msg = #WM_LBUTTONDOWN Or Msg = #WM_LBUTTONUP Or Msg = #WM_LBUTTONDBLCLK
      SetImageGammacorrection(hWnd,GetProp_(hWnd, "ADVGADGET_GAMMARED"),GetProp_(hWnd, "ADVGADGET_GAMMAGREEN"),GetProp_(hWnd, "ADVGADGET_GAMMABLUE"),GetProp_(hWnd, "ADVGADGET_COLOR"),GetProp_(hWnd, "ADVGADGET_BRIGHTNESS"), GetProp_(hWnd, "ADVGADGET_CONTRAST"))
    EndIf
  EndIf

  If GetProp_(hWnd, "ADVGADGET_PROGRESSBAR")
  
    If Msg=#WM_PAINT
      SetImageGammacorrection(hWnd,GetProp_(hWnd, "ADVGADGET_GAMMARED"),GetProp_(hWnd, "ADVGADGET_GAMMAGREEN"),GetProp_(hWnd, "ADVGADGET_GAMMABLUE"),GetProp_(hWnd, "ADVGADGET_COLOR"),GetProp_(hWnd, "ADVGADGET_BRIGHTNESS"), GetProp_(hWnd, "ADVGADGET_CONTRAST"))
    EndIf
  EndIf

ProcedureReturn Result
EndProcedure



#PB_AdvProgressBar_Smooth = #PB_ProgressBar_Smooth
#PB_AdvProgressBar_Vertical = #PB_ProgressBar_Vertical
#PB_AdvProgressBar_Marquee = $40A
; RedGamma, GreenGamma and BlueGamma must be between 2500 and 65000 (Default is 10000)
; Colorfullness, Brightness and Contrast must be between -100 and 100 (Default is 0)
Procedure AdvProgressBarGadget(Gadget,x,y,width,height,minimum,maximum, flags, RedGamma = 10000,GreenGamma = 10000,BlueGamma = 10000,Colorfullness = 0, Brightness = 0, Contrast = 0)

If Gadget <> #PB_Any
  Result = ProgressBarGadget(Gadget,x,y,width,height,minimum,maximum, flags)
  ID = Gadget
Else
  Result = ProgressBarGadget(Gadget,x,y,width,height,minimum,maximum, flags)
  Gadget = Result
EndIf

If Result

  hWnd = GadgetID(ID)
  If flags & #PB_AdvProgressBar_Marquee
    SendMessage_(hWnd,#PB_AdvProgressBar_Marquee, #True, 50)
  EndIf
  
  SetProp_(hWnd, "ADVGADGET_PROGRESSBAR", #True)
  SetProp_(hWnd, "ADVGADGET_CALLBACK",SetWindowLong_(hWnd,#GWL_WNDPROC,@AdvGadgetCB()))
  SetProp_(hWnd, "ADVGADGET_GAMMARED", RedGamma)
  SetProp_(hWnd, "ADVGADGET_GAMMAGREEN", GreenGamma)
  SetProp_(hWnd, "ADVGADGET_GAMMABLUE", BlueGamma)
  SetProp_(hWnd, "ADVGADGET_COLOR", Colorfullness)
  SetProp_(hWnd, "ADVGADGET_BRIGHTNESS", Brightness)
  SetProp_(hWnd, "ADVGADGET_CONTRAST",Contrast)
EndIf

ProcedureReturn Result
EndProcedure


#PB_AdvButton_Right = #PB_Button_Right
#PB_AdvButton_Left = #PB_Button_Left
#PB_AdvButton_Default = #PB_Button_Default
#PB_AdvButton_MultiLine = #PB_Button_MultiLine
#PB_AdvButton_Toggle = #PB_Button_Toggle

; RedGamma, GreenGamma and BlueGamma must be between 2500 and 65000 (Default is 10000)
; Colorfullness, Brightness and Contrast must be between -100 and 100 (Default is 0)
Procedure AdvButtonGadget(Gadget,x,y,width,height, text.s, flags, RedGamma = 10000,GreenGamma = 10000,BlueGamma = 10000,Colorfullness = 0, Brightness = 0, Contrast = 0)

If Gadget <> #PB_Any
  Result = ButtonGadget(Gadget,x,y,width,height,text.s, flags)
  ID = Gadget
Else
  Result = ButtonGadget(Gadget,x,y,width,height,text.s, flags)
  Gadget = Result
EndIf

If Result
  hWnd = GadgetID(ID)
  
  SetProp_(hWnd, "ADVGADGET_BUTTON", #True)
  SetProp_(hWnd, "ADVGADGET_CALLBACK",SetWindowLong_(hWnd,#GWL_WNDPROC,@AdvGadgetCB()))
  SetProp_(hWnd, "ADVGADGET_GAMMARED", RedGamma)
  SetProp_(hWnd, "ADVGADGET_GAMMAGREEN", GreenGamma)
  SetProp_(hWnd, "ADVGADGET_GAMMABLUE", BlueGamma)
  SetProp_(hWnd, "ADVGADGET_COLOR", Colorfullness)
  SetProp_(hWnd, "ADVGADGET_BRIGHTNESS", Brightness)
  SetProp_(hWnd, "ADVGADGET_CONTRAST",Contrast)
EndIf

ProcedureReturn Result
EndProcedure



;Example:
;Exable XP Skin support!
If OpenWindow(0, 0, 0, 500, 200, "AdvGadgets", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)

  
  ;Button with more contrast
  AdvButtonGadget(0, 10, 10, 100, 22, "Silver Button",#PB_Button_Default,10000,10000,10000,0,-100,25)
  
  ;blue button
  AdvButtonGadget(1, 10, 40, 100, 22, "blue Button",#PB_Button_Default,20000,20000,2500,0,0,0)    

  ;red button
  AdvButtonGadget(2, 10, 70, 100, 22, "red Button",#PB_Button_Default,2500,65000,65000,0,0,0)    

  ;another silver button
  AdvButtonGadget(4, 10, 100, 100, 22, "Silver Button",#PB_Button_Default,65000,65000,65000,0,-50,50)  
  
  ;green button
  AdvButtonGadget(3, 10, 130, 100, 22, "green Button",#PB_Button_Default,65000,2500,65000,-20,-30,0)    

  AdvProgressBarGadget(5,150,10,200,25,0,100, #PB_AdvProgressBar_Marquee, 2500, 65000,65000,0,0,0)

  AdvProgressBarGadget(6,150,40,200,25,0,100, 0, 65000, 65000,65000,-100,50,0)
  SetGadgetState(6, 55)
  
  AdvProgressBarGadget(7,150,70,200,25,0,100, 0, 65000, 65000,6500,0,50,50)
  SetGadgetState(7, 75)

  AdvProgressBarGadget(8,150,100,200,25,0,100, 0, 65000, 65000,65000,-30,-20,70)
  SetGadgetState(8, 55)

  AdvProgressBarGadget(9,150,130,200,25,0,100, 0, 10000, 10000,2500,-100,-90,20)
  SetGadgetState(9, 85)
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Post by Kwai chang caine »

Good job :shock:
It's true this function is missing in native :cry:

Thanks to have sharing this great code 8)
ImageThe happiness is a road...
Not a destination
Micko
Enthusiast
Enthusiast
Posts: 244
Joined: Thu May 24, 2007 7:36 pm
Location: Senegal
Contact:

Post by Micko »

very usefull
thanks :D
klaver
Enthusiast
Enthusiast
Posts: 147
Joined: Wed Jun 28, 2006 6:55 pm
Location: Schröttersburg

Post by klaver »

Really great piece of code!

My two cents:
- you should remove props with RemoveProp_() on WM_NCDESTROY
- it would be much better and more optimal to allocate structure and write its pointer with SetProp_() instead of using many props (one call vs eight)
Post Reply