Seite 4 von 5

Verfasst: 23.05.2008 18:14
von marco2007
Super :allright:

Für welche Version?

@alle:
PS: Der Fehler, den ich letztens beschrieben habe, hat nichts mit der Toolbar zu tun -> irgendwas dürfte dem Laptop zuviel geworden sein....

Verfasst: 11.06.2008 16:31
von dysti
Hey,
habe die Lib geladen. Funzt sehr gut unter Vista.
Leider läßt sich die Hilfe nicht richtig aufrufen.
Im linken Hilfefenster erscheint zwar die Funktionsauflistung,
aber rechts nichts. Nur die folgende Fehlermeldung:

Die Navigation zu der Webseite wurde abgebrochen.

Mögliche Vorgehensweise:
Geben Sie die Adresse erneut ein.

Wie komme ich jetzt an die Beschreibung der Funktionen heran?

Verfasst: 11.06.2008 21:08
von legion
Hallo !

Kann den Fehler in der Hilfe den du beschreibst leider nicht nachvollziehen,
auch nicht unter Vista. Vielleicht ist beim Download was passiert ?
Lade die Lib ganz einfach nochmal runter und probier es nochmal.
Ansonsten schau dir das Beispiel unter Examples genauer an, ist eigentlich
alles selbsterklärend. Einfach rumprobieren !

Lg. Legion

Re: Multicolor Toolbar Neue PB-Lib oder DLL

Verfasst: 08.08.2010 10:56
von Andesdaf
Hallo,

besteht die Möglichkeit, das Ganze für 64 bit zu updaten?

Re: Multicolor Toolbar Neue PB-Lib oder DLL

Verfasst: 26.08.2010 18:27
von legion
Sorry, aber ich arbeite nicht mehr mit PB!
Da mir die Update-Berechtigung entzogen wurde und ich
nicht Lust habe ein Programm 2x zu bezahlen, hab ich alle
PB-Projekte auf Eis gelegt.

Ich warte mal auf PB 5.0. Sollten innovative Änderungen dabei sein,
steig ich eventuell wieder ein.

Lg. Legion

Re: Multicolor Toolbar Neue PB-Lib oder DLL

Verfasst: 26.08.2010 18:43
von HeX0R
legion hat geschrieben:[...]
Da mir die Update-Berechtigung entzogen wurde und ich
nicht Lust habe ein Programm 2x zu bezahlen, hab ich alle
PB-Projekte auf Eis gelegt.
[...]
Um mal den wortkargen Rings (in etwa) zu zitieren:
Hast du denn dann über eine Veröffentlichung des Sources nachgedacht?
Oder möchtest du es zu deiner ehemaligen Geliebten (PB) ins Grab legen?

(Ausserdem wäre es dann endlich im richtigen Forum ;) )

Re: Multicolor Toolbar Neue PB-Lib oder DLL

Verfasst: 26.08.2010 21:22
von legion
HeX0R hat geschrieben: Um mal den wortkargen Rings (in etwa) zu zitieren:
Hast du denn dann über eine Veröffentlichung des Sources nachgedacht?
Oder möchtest du es zu deiner ehemaligen Geliebten (PB) ins Grab legen?
Super Spruch! :mrgreen: :mrgreen: :mrgreen:
Begraben möchte ich nichts! :wink:

Img.bpi

Code: Alles auswählen

Macro RGB(RedColor, GreenColor, BlueColor) 
 ((BlueColor << 8 + GreenColor) << 8 ) + RedColor    
EndMacro 

Macro RedColor(Color) 
 Color & 16777215 >> 16 
EndMacro 

Macro GreenColor(Color) 
 (Color & 65535) >> 8 
EndMacro 

Macro BlueColor(Color) 
 Color >> 16 
EndMacro 

Macro Normalize(RedColor, GreenColor, BlueColor) 
 If RedColor < 0        
  RedColor = 0        
 ElseIf RedColor > 255    
  RedColor = 255       
 EndIf 
        
 If GreenColor < 0    
  GreenColor = 0        
 ElseIf GreenColor > 255    
  GreenColor = 255         
 EndIf 
    
 If BlueColor < 0    
  BlueColor = 0    
 ElseIf BlueColor > 255     
  BlueColor = 255        
 EndIf 
EndMacro 

Macro Blend75(ColorA, Color) 
 RGB((RedColor(ColorA) >> 1 + RedColor(ColorA) >> 2 + RedColor(ColorO) >> 2), (GreenColor(ColorA) >> 1 + GreenColor(ColorA) >> 2 + GreenColor(ColorO) >> 2), (BlueColor(ColorA) >> 1 + BlueColor(ColorA) >> 2 + BlueColor(ColorO) >> 2)) 
EndMacro 

Macro Blend50(ColorA, ColorO) 
 RGB((RedColor(ColorA) >> 1 + RedColor(ColorO) >> 1), (GreenColor(ColorA) >> 1 + GreenColor(ColorO) >> 1), (BlueColor(ColorA) >> 1 + BlueColor(ColorO) >> 1)) 
EndMacro 

Macro Blend(ColorA, ColorO, Alpha) 
 RGB(((RedColor(ColorA) * Alpha + RedColor(ColorO) * (256 - Alpha)) >> 8), ((GreenColor(ColorA) * Alpha + GreenColor(ColorO) * (256 - Alpha)) >> 8), ((BlueColor(ColorA) * Alpha + BlueColor(ColorO) * (256 - Alpha)) >> 8)) 
EndMacro 

Procedure CopyImgToMemory(ImageNumber, Memory) 
 Protected TemporaryDC.L, TemporaryBitmap.BITMAP, TemporaryBitmapInfo.BITMAPINFO 
 
 TemporaryDC = CreateDC_("DISPLAY", #Null, #Null, #Null)    
 GetObject_(ImageID(ImageNumber), SizeOf(BITMAP), TemporaryBitmap.BITMAP)       
 TemporaryBitmapInfo\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER) 
 TemporaryBitmapInfo\bmiHeader\biWidth       = TemporaryBitmap\bmWidth 
 TemporaryBitmapInfo\bmiHeader\biHeight      = -TemporaryBitmap\bmHeight 
 TemporaryBitmapInfo\bmiHeader\biPlanes      = 1 
 TemporaryBitmapInfo\bmiHeader\biBitCount    = 32 
 TemporaryBitmapInfo\bmiHeader\biCompression = #BI_RGB 
 GetDIBits_(TemporaryDC, ImageID(ImageNumber), 0, TemporaryBitmap\bmHeight, Memory, TemporaryBitmapInfo, #DIB_RGB_COLORS) 
 DeleteDC_(TemporaryDC)    
EndProcedure 

Procedure CopyMemoryToImg(Memory, ImageNumber)  
 Protected TemporaryDC.L, TemporaryBitmap.BITMAP, TemporaryBitmapInfo.BITMAPINFO 
  
 TemporaryDC = CreateDC_("DISPLAY", #Null, #Null, #Null)     
 GetObject_(ImageID(ImageNumber), SizeOf(BITMAP), TemporaryBitmap.BITMAP) 
 TemporaryBitmapInfo\bmiHeader\biSize        = SizeOf(BITMAPINFOHEADER) 
 TemporaryBitmapInfo\bmiHeader\biWidth       = TemporaryBitmap\bmWidth 
 TemporaryBitmapInfo\bmiHeader\biHeight      = -TemporaryBitmap\bmHeight 
 TemporaryBitmapInfo\bmiHeader\biPlanes      = 1 
 TemporaryBitmapInfo\bmiHeader\biBitCount    = 32 
 TemporaryBitmapInfo\bmiHeader\biCompression = #BI_RGB    
 SetDIBits_(TemporaryDC, ImageID(ImageNumber), 0, TemporaryBitmap\bmHeight, Memory, TemporaryBitmapInfo, #DIB_RGB_COLORS)    
 DeleteDC_(TemporaryDC)  
EndProcedure  

Procedure Rotate180(ImageNumber) 
 Protected MemorySize, *MemoryOrigin, *MemoryTarget, Counter 
 
 MemorySize = (ImageWidth(ImageNumber) * ImageHeight(ImageNumber) << 2) 
 *MemoryOrigin = AllocateMemory(MemorySize) 
 *MemoryTarget = AllocateMemory(MemorySize)    
 CopyImgToMemory(ImageNumber, *MemoryOrigin)    
 For Counter = 0 To MemorySize - 1 Step 4          
  PokeL(*MemoryTarget + MemorySize - Counter - 4, PeekL(*MemoryOrigin + Counter))          
 Next 
 CopyMemoryToImg(*MemoryTarget, ImageNumber) 
 FreeMemory(*MemoryOrigin) 
 FreeMemory(*MemoryTarget) 
EndProcedure 

Procedure Rotate90(ImageNumber) 
 Protected TemporaryImage, MemorySizeOrigin, MemorySizeTarget, *MemoryOrigin, *MemoryTarget    
 Protected Origin, Target, W, H, X, Y 
   
 TemporaryImage = CreateImage(#PB_Any, ImageHeight(ImageNumber), ImageWidth(ImageNumber), ImageDepth(ImageNumber)) 
 MemorySizeOrigin = (ImageWidth(ImageNumber) * ImageHeight(ImageNumber) << 2) 
 MemorySizeTarget = (ImageWidth(TemporaryImage) * ImageHeight(TemporaryImage) << 2) 
 *MemoryOrigin = AllocateMemory(MemorySizeOrigin) 
 *MemoryTarget = AllocateMemory(MemorySizeTarget)    
 CopyImgToMemory(ImageNumber, *MemoryOrigin)       
 W = ImageWidth(ImageNumber) 
 H = ImageHeight(ImageNumber)        
 For Y = 0 To H - 1    
  For X = 0 To W - 1       
   Origin = (Y * W + X) << 2            
   Target = ((H - Y - 1) + (X * H)) << 2 
   PokeL(*MemoryTarget + Target, PeekL(*MemoryOrigin + Origin)) 
  Next     
 Next 
 CopyMemoryToImg(*MemoryTarget, TemporaryImage) 
 FreeImage(ImageNumber) 
 CopyImage(TemporaryImage, ImageNumber)    
 FreeImage(TemporaryImage) 
 FreeMemory(*MemoryOrigin) 
 FreeMemory(*MemoryTarget) 
EndProcedure 

Procedure Mirror(ImageNumber)  
 Protected MemorySize, *MemoryOrigin, *MemoryTarget     
 Protected Origin, Target, W, H, X, Y 
  
 MemorySize = (ImageWidth(ImageNumber) * ImageHeight(ImageNumber) << 2) 
 *MemoryOrigin = AllocateMemory(MemorySize) 
 *MemoryTarget = AllocateMemory(MemorySize)    
 CopyImgToMemory(ImageNumber, *MemoryOrigin)    
 W = ImageWidth(ImageNumber) 
 H = ImageHeight(ImageNumber)       
 For Y = 0 To H - 1     
  For X = 0 To W - 1 
   Origin = (Y * W + X) << 2 
   Target = ((W - X) + (Y * W - 1)) << 2 
   PokeL(*MemoryTarget + Target, PeekL(*MemoryOrigin + Origin)) 
  Next     
 Next    
 CopyMemoryToImg(*MemoryTarget, ImageNumber) 
 FreeMemory(*MemoryOrigin) 
 FreeMemory(*MemoryTarget)  
EndProcedure 

Procedure Flip(ImageNumber)  
 Protected MemorySize, *MemoryOrigin, *MemoryTarget     
 Protected Origin, Target, W, H, X, Y  
 
 MemorySize = (ImageWidth(ImageNumber) * ImageHeight(ImageNumber) << 2) 
 *MemoryOrigin = AllocateMemory(MemorySize) 
 *MemoryTarget = AllocateMemory(MemorySize)    
 CopyImgToMemory(ImageNumber, *MemoryOrigin)    
 W = ImageWidth(ImageNumber) 
 H = ImageHeight(ImageNumber)        
 For Y = 0 To H - 1     
  For X = 0 To W - 1 
   Origin = (Y * W + X) << 2          
   Target = ((H - Y - 1) * W + X) << 2 
   PokeL(*MemoryTarget + Target, PeekL(*MemoryOrigin + Origin)) 
  Next     
 Next     
 CopyMemoryToImg(*MemoryTarget, ImageNumber) 
 FreeMemory(*MemoryOrigin) 
 FreeMemory(*MemoryTarget)  
EndProcedure 

Procedure Greyscale(ImageNumber) 
 Protected MemorySize, *Memory , Counter, Color    
   
 MemorySize = (ImageWidth(ImageNumber) * ImageHeight(ImageNumber) << 2) 
 *Memory = AllocateMemory(MemorySize)    
 CopyImgToMemory(ImageNumber, *Memory)    
 For Counter = 0 To MemorySize - 1 Step 4              
  Color = PeekL(*Memory + Counter)             
  Color = (RedColor(Color) + GreenColor(Color) + BlueColor(Color)) / 3              
  PokeL(*Memory + Counter, RGB(Color, Color, Color)) 
 Next 
 CopyMemoryToImg(*Memory, ImageNumber) 
 FreeMemory(*Memory) 
EndProcedure 

Procedure Invert(ImageNumber) 
 Protected MemorySize, *Memory 
 Protected Counter, Color, RedColor, GreenColor, BlueColor 

 MemorySize = (ImageWidth(ImageNumber) * ImageHeight(ImageNumber) << 2) 
 *Memory = AllocateMemory(MemorySize)    
 CopyImgToMemory(ImageNumber, *Memory)     
 For Counter = 0 To MemorySize - 1 Step 4             
  Color = PeekL(*Memory + Counter)              
  RedColor = 255 - RedColor(Color) 
  GreenColor = 255 - GreenColor(Color) 
  BlueColor = 255 - BlueColor(Color)             
  PokeL(*Memory + Counter, RGB(RedColor, GreenColor, BlueColor)) 
 Next 
 CopyMemoryToImg(*Memory, ImageNumber) 
 FreeMemory(*Memory) 
EndProcedure 

Procedure Brightness(ImageNumber,Brightness) 
 Protected MemorySize, *Memory     
 Protected Counter, Color, RedColor, GreenColor, BlueColor 

 MemorySize = (ImageWidth(ImageNumber) * ImageHeight(ImageNumber) << 2) 
 *Memory = AllocateMemory(MemorySize)    
 CopyImgToMemory(ImageNumber, *Memory)     
 For Counter = 0 To MemorySize - 1 Step 4             
  Color = PeekL(*Memory + Counter)             
  RedColor = RedColor(Color) + Brightness 
  GreenColor = GreenColor(Color) + Brightness 
  BlueColor = BlueColor(Color) + Brightness              
  Normalize(RedColor, GreenColor, BlueColor)             
  PokeL(*Memory + Counter, RGB(RedColor, GreenColor, BlueColor)) 
 Next 
 CopyMemoryToImg(*Memory, ImageNumber) 
 FreeMemory(*Memory) 
EndProcedure 

Procedure Contrast(ImageNumber, Contrast.F) 
 Protected MemorySize, *Memory    
 Protected Counter, Color, RedColor, GreenColor, BlueColor 

 MemorySize = (ImageWidth(ImageNumber) * ImageHeight(ImageNumber) << 2) 
 *Memory = AllocateMemory(MemorySize)     
 CopyImgToMemory(ImageNumber, *Memory)     
 For Counter = 0 To MemorySize - 1 Step 4             
  Color = PeekL(*Memory + Counter)       
  RedColor = ((RedColor(Color) - 128) * Contrast) + 128 
  GreenColor = ((GreenColor(Color) - 128) * Contrast) + 128 
  BlueColor = ((BlueColor(Color) - 128) * Contrast) + 128        
  Normalize(RedColor, GreenColor, BlueColor)             
  PokeL(*Memory + Counter, RGB(RedColor, GreenColor, BlueColor)) 
 Next 
 CopyMemoryToImg(*Memory, ImageNumber) 
 FreeMemory(*Memory) 
EndProcedure 
PGDRToolbar.pb

Code: Alles auswählen

XIncludeFile "Img.pbi"

Structure TBStruct ; Eigenschaften einer Taste
 TButtonText.s
 TButtonLeft.l
 TButtonRight.l 
 TButtonWidth.l
 TButtonTop.l
 TButtonDis.b
 TButtonIco.l
EndStructure

Structure MyBITMAPINFO 
 BMIHeader.BITMAPINFOHEADER 
 BMIColors.RGBQUAD[1] 
EndStructure 

Structure MyLONG 
 l.l 
EndStructure 
;--------------------------------------------------------------------------------------------------------
Enumeration
  #Image_0
  #Image_1
  #Image_2
  #Image_3
  #Image_4
  #Image_5
  #Image_6
  #Image_7
  #Image_8
  #Image_9
EndEnumeration
;--------------------------------------------------------------------------------------------------------
Global WinHDC,TempDC,WindowHandle,Weite.w,Links.w,Oben.w,Unten.w,xp.w,yp.w,ButtonAnzahl.b,MaxRight.w
Global WndProcHook,MsgProcHook,TB_Font,MessageFlag.b,MessageCode.b,MouseStatus.b,IcoOffset.w,FontColor
Global *mywnd.CWPSTRUCT
Global *mymsg.MSG
Global myRect.RECT
Global BlockTB.b = 0
Global WindowRect.RECT
Global Dim TButtonArray.TBStruct(5)
Global LEGION_Toolbarmessage = #WM_USER + 100
;--------------------------------------------------------------------------------------------------------
ProcedureDLL AttachProcess(Instanz); Start der DLL, Bilder und Font laden,Variablen belegen  

EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure AddColorFilter(ImageNumber,ColorFilter)
Protected HBmp,HDC,ri,bi,gi,r,g,b
  HBmp = ImageID(ImageNumber) 
  If HBmp 
   HDC  = StartDrawing(ImageOutput(ImageNumber)) 
   If HDC 
    ImageWidth  = ImageWidth(ImageNumber) : ImageHeight = ImageHeight(ImageNumber) 
    mem = GlobalAlloc_(#GMEM_FIXED|#GMEM_ZEROINIT,ImageWidth*ImageHeight*4) 
    If mem 
     bmi.MyBITMAPINFO 
     bmi\BMIHeader\biSize   = SizeOf(BITMAPINFOHEADER) 
     bmi\BMIHeader\biWidth  = ImageWidth 
     bmi\BMIHeader\biHeight = ImageHeight 
     bmi\BMIHeader\biPlanes = 1 
     bmi\BMIHeader\biBitCount = 32 
     bmi\BMIHeader\biCompression = #BI_RGB 
     If GetDIBits_(hDC,hBmp,0,ImageHeight(ImageNumber),mem,bmi,#DIB_RGB_COLORS) <> 0 
      *pixels.MyLONG = mem        
      For a = 1 To ImageWidth*ImageHeight 
       ri = (*pixels\l >>16) & $FF 
       gi = (*pixels\l >> 8) & $FF 
       bi = (*Pixels\l     ) & $FF              
            
       r=(ri/255.0)*Red(ColorFilter) 
       g=(gi/255.0)*Green(ColorFilter) 
       b=(bi/255.0)*Blue(ColorFilter) 

       *pixels\l = RGB(b,g,r) 
       *pixels + 4 
       Next a 

          If SetDIBits_(hDC,hBmp,0,ImageHeight(ImageNumber),mem,bmi,#DIB_RGB_COLORS) <> 0 
            Result = hBmp 
          EndIf 
        EndIf 
        GlobalFree_(mem) 
      EndIf 
    EndIf 
    StopDrawing() 
  EndIf 
  ProcedureReturn Result 
EndProcedure 
;--------------------------------------------------------------------------------------------------------
Procedure.w GetWindowMouseX(WHWND)
  Protected WRect.RECT,TPoint.POINT,Result
  Result = -1
  GetClientRect_(WHWND,WRect)
  GetCursorPos_(TPoint)
  ScreenToClient_(WHWND,TPoint)
  If TPoint\x < WRect\Left Or TPoint\x > WRect\Right Or TPoint\y < WRect\Top Or TPoint\y > WRect\Bottom
   Result = -1
  Else
   Result = TPoint\x
  EndIf
  ProcedureReturn Result 
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure.w GetWindowMouseY(WHWND)
  Protected WRect.RECT,TPoint.POINT,Result
  Result = -1
  GetClientRect_(WHWND,WRect)
  GetCursorPos_(TPoint)
  ScreenToClient_(WHWND,TPoint)
  If TPoint\x < WRect\Left Or TPoint\x > WRect\Right Or TPoint\y < WRect\Top Or TPoint\y > WRect\Bottom
   Result = -1
  Else
   Result = TPoint\y
  EndIf
  ProcedureReturn Result 
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure GetStringRect(Windowhandle,Fonthandle,Text$); die Größe der Schrift ermitteln 
 Protected FontDC,OrgFont,TextRect.SIZE
 FontDC = GetDC_(Windowhandle)
 OrgFont = SelectObject_(FontDC,SelectObject_(FontDC,Fonthandle))
 GetTextExtentPoint32_(FontDC,Text$,Len(Text$),TextRect.SIZE) 
 SelectObject_(FontDC,OrgFont)
 ReleaseDC_(Windowhandle,FontDC)
 ProcedureReturn TextRect\cx
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure DrawTBNormTXT();Toolbar mit Tastenbeschriftung zeichnen
 Protected HOffset.w,VOffset.w,i.w,BackImageID,NewImageHDC
  HOffset = 14 : VOffset = 6   
  WinHDC = GetDC_(WindowHandle) : TempDC = CreateCompatibleDC_(WinHDC)   
  BackImageID = CreateImage(#PB_Any,Weite,ImageHeight(#Image_0)) 
  NewImageHDC = StartDrawing(ImageOutput(BackImageID))  
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(0))   
  SelectObject_(TempDC,ImageID(#Image_0))
  StretchBlt_(NewImageHDC,0,0,Weite,ImageHeight(#Image_0),TempDC,0,0,ImageWidth(#Image_0),ImageHeight(#Image_0),#SRCCOPY)  
  For i = 0 To ButtonAnzahl -1
   If TButtonArray(i)\TButtonIco <> 0 : IcoOffset = 16 : Else : IcoOffset = 0 : EndIf   
   If TButtonArray(i)\TButtonDis = 1
    DrawText(HOffset+IcoOffset,VOffset,TButtonArray(i)\TButtonText,$C8C8C8) 
   Else
    DrawText(HOffset+IcoOffset,VOffset,TButtonArray(i)\TButtonText,FontColor)
   EndIf 
   ; Tasten bemaßen TextWidth(Text$)
   TButtonArray(i)\TButtonLeft  = HOffset -6 
   TButtonArray(i)\TButtonWidth = GetStringRect(Windowhandle,TB_Font,TButtonArray(i)\TButtonText)+8+IcoOffset
   TButtonArray(i)\TButtonRight = TButtonArray(i)\TButtonLeft + TButtonArray(i)\TButtonWidth-3  
   TButtonArray(i)\TButtonTop   = VOffset 
   MaxRight = TButtonArray(i)\TButtonRight    
   If TButtonArray(i)\TButtonIco <> 0  
    DrawImage(TButtonArray(i)\TButtonIco,HOffset-4,VOffset)
   EndIf
   HOffset  = HOffset + IcoOffset + GetStringRect(Windowhandle,TB_Font,TButtonArray(i)\TButtonText)+10
  Next i 
  StopDrawing()
  SelectObject_(TempDC,ImageID(BackImageID))
  BitBlt_(WinHDC,0,0,Weite,ImageHeight(#Image_0),TempDC,0,0,#SRCCOPY)
  ReleaseDC_(WindowHandle,WinHDC) : DeleteDC_(TempDC) : FreeImage(BackImageID) 
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure DrawTBOverButton(ButtonNr); Overtaste zeichnen
 Protected BackImageID,NewImageHDC,Breite.w,HOffset.w,VOffset.w
  HOffset = TButtonArray(ButtonNr)\TButtonLeft 
  VOffset = TButtonArray(ButtonNr)\TButtonTop
  Breite = TButtonArray(ButtonNr)\TButtonWidth
  WinHDC = GetDC_(WindowHandle) : TempDC = CreateCompatibleDC_(WinHDC) 
  BackImageID = CreateImage(#PB_Any,Breite,ImageHeight(#Image_1)) 
  NewImageHDC = StartDrawing(ImageOutput(BackImageID))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(0))  
  SelectObject_(TempDC,ImageID(#Image_1))
  BitBlt_(NewImageHDC,0,0,Breite,ImageHeight(#Image_0),TempDC,0,0,#SRCCOPY)
  SelectObject_(TempDC,ImageID(#Image_2))
  StretchBlt_(NewImageHDC,4,0,Breite-8,ImageHeight(#Image_1),TempDC,0,0,ImageWidth(#Image_2),ImageHeight(#Image_2),#SRCCOPY)   
  SelectObject_(TempDC,ImageID(#Image_3))
  BitBlt_(NewImageHDC,Breite-4,0,Breite,ImageHeight(#Image_1),TempDC,0,0,#SRCCOPY)      
  If TButtonArray(ButtonNr)\TButtonIco <> 0
   DrawText(25,3,TButtonArray(ButtonNr)\TButtonText,FontColor)
   DrawImage(TButtonArray(ButtonNr)\TButtonIco,5,3) 
  Else
   DrawText(9,3,TButtonArray(ButtonNr)\TButtonText,FontColor)
  EndIf  
  StopDrawing()
  SelectObject_(TempDC,ImageID(BackImageID))
  BitBlt_(WinHDC,HOffset-3,3,Breite,ImageHeight(#Image_1),TempDC,0,0,#SRCCOPY)
  ReleaseDC_(WindowHandle,WinHDC) : DeleteDC_(TempDC) : FreeImage(BackImageID)
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure DrawTBDownButton(ButtonNr); gedrückte Taste zeichnen
 Protected BackImageID,NewImageHDC,Breite.w,HOffset.w,VOffset.w
  HOffset = TButtonArray(ButtonNr)\TButtonLeft 
  VOffset = TButtonArray(ButtonNr)\TButtonTop
  Breite = TButtonArray(ButtonNr)\TButtonWidth
  WinHDC = GetDC_(WindowHandle) : TempDC = CreateCompatibleDC_(WinHDC) 
  BackImageID = CreateImage(#PB_Any,Breite,ImageHeight(#Image_1)) 
  NewImageHDC = StartDrawing(ImageOutput(BackImageID))
  DrawingMode(#PB_2DDrawing_Transparent)
  DrawingFont(FontID(0))  
  SelectObject_(TempDC,ImageID(#Image_4))
  BitBlt_(NewImageHDC,0,0,Breite,ImageHeight(#Image_0),TempDC,0,0,#SRCCOPY)
  SelectObject_(TempDC,ImageID(#Image_5))
  StretchBlt_(NewImageHDC,4,0,Breite-8,ImageHeight(#Image_1),TempDC,0,0,ImageWidth(#Image_2),ImageHeight(#Image_2),#SRCCOPY)   
  SelectObject_(TempDC,ImageID(#Image_6))
  BitBlt_(NewImageHDC,Breite-5,0,Breite,ImageHeight(#Image_1),TempDC,0,0,#SRCCOPY)    
  If TButtonArray(ButtonNr)\TButtonIco <> 0
   DrawText(9+16,3,TButtonArray(ButtonNr)\TButtonText,$A2A2A2)
   DrawImage(TButtonArray(ButtonNr)\TButtonIco,5,3) 
  Else
   DrawText(9,3,TButtonArray(ButtonNr)\TButtonText,$A2A2A2)
  EndIf   
  StopDrawing()
  SelectObject_(TempDC,ImageID(BackImageID))
  BitBlt_(WinHDC,HOffset-3,3,Breite,ImageHeight(#Image_1),TempDC,0,0,#SRCCOPY)
  ReleaseDC_(WindowHandle,WinHDC) : DeleteDC_(TempDC) : FreeImage(BackImageID)
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure.b MouseOutOfToolbar(); prüfen ob Maus auserhalb der Toolbar
 Protected Result.b
 Result = 0
 If xp < 2 Or xp > MaxRight Or yp < 2 Or yp > ImageHeight(#Image_1)-2 
  Result = 1 
 EndIf
 ProcedureReturn Result 
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure.b MouseOverToolButton(ButtonNr); prüfen ob Maus über eines Buttons ist
 Protected Result.b
 Result = 0
  If (xp > TButtonArray(ButtonNr)\TButtonLeft-4) And (xp < TButtonArray(ButtonNr)\TButtonRight) And (yp > TButtonArray(ButtonNr)\TButtonTop-2) And (yp < TButtonArray(ButtonNr)\TButtonTop + ImageHeight(#Image_1))
   Result = 1 
  EndIf
 ProcedureReturn Result 
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure OnEraseBkgnd(); wenn der Hintergrund gelöscht wird
 DrawTBNormTXT() 
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure OnPaint(); wenn das Fenster neu gezeichnet wird
 DrawTBNormTXT()
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure OnLButtonDown();Auf drücken der linken Maustaste reagieren
 MouseStatus = 1
 If MessageCode < ButtonAnzahl
  DrawTBDownButton(MessageCode)
 EndIf 
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure OnLButtonClk(); Auf doppelklick der linken Maustaste reagieren
 MouseStatus = 1
 If MessageCode < ButtonAnzahl
  DrawTBDownButton(MessageCode)
 EndIf 
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure OnLButtonUp(); Auf loslassen der linken Maustaste reagieren
 If BlockTB = 0
  MouseStatus = 2  
  If MessageCode < ButtonAnzahl
   If MouseOverToolButton(MessageCode)
    DrawTBOverButton(MessageCode)
    SendMessage_(WindowHandle,LEGION_Toolbarmessage + MessageCode,xp,yp); USER Message senden
   EndIf
  EndIf
 Else
  MouseStatus = 0
  DrawTBNormTXT()
 EndIf 
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure OnMouseMove(); wenn die Maus bewegt wird
If MouseOutOfToolbar(); wenn Maus ausserhalb der Toolbar
 MessageFlag = 100 : MouseStatus = 0
Else     
 For i = 0 To ButtonAnzahl -1
  If MouseOverToolButton(i)
   If TButtonArray(i)\TButtonDis = 0 : MessageFlag = i : Else : MessageFlag = 100 : EndIf
  EndIf
 Next i
EndIf  
;.........................................................................................................              
If MessageFlag <> MessageCode; Nur reagieren wenn sich was ändert (verhindert flimmern der Toolbar)  
 MessageCode = MessageFlag 
 If MessageCode < 100
  DrawTBNormTXT()
  If MouseStatus = 1  
   DrawTBDownButton(MessageCode)
  Else 
   DrawTBOverButton(MessageCode)
  EndIf    
 ElseIf MessageCode = 100
  DrawTBNormTXT()    
 EndIf    
EndIf  
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure CallWndProc(code,wParam,lParam); Sendmessage Hook
*mywnd = lParam 
 If *mywnd\hwnd = WindowHandle
   If     *mywnd\message = #WM_ERASEBKGND   : OnEraseBkgnd()   
   ElseIf *mywnd\message = #WM_PAINT        : OnPaint()
   ElseIf *mywnd\message = #WM_MENUSELECT   : BlockTB = 1; Menü gewählt und Toolbar blockieren
   ElseIf *mywnd\message = #WM_EXITMENULOOP : BlockTB = 0; Menü verlassen und Toolbar freigeben
   EndIf  
 EndIf
 ProcedureReturn CallNextHookEx_(WndProcHook,code,wParam,lParam)
EndProcedure
;--------------------------------------------------------------------------------------------------------
Procedure GetMsgProc(code,wParam,lParam); Postmessage Hook
 Protected i
 ;Mauspositionen und Fenstergroesse bestimmen
 *mymsg = lParam 
 If *mymsg\hwnd = WindowHandle
  GetClientRect_(*mymsg\hwnd ,myRect)
  Weite = myRect\right - myRect\left : Links = myRect\left 
  Oben  = myRect\top                 : Unten = myRect\bottom - myRect\top
  xp = GetWindowMouseX(*mymsg\hwnd)  : yp = GetWindowMouseY(*mymsg\hwnd)
;.........................................................................................................
  
  If      *mymsg\message = #WM_LBUTTONDOWN   : OnLButtonDown()
   ElseIf *mymsg\message = #WM_LBUTTONDBLCLK : OnLButtonClk()     
   ElseIf *mymsg\message = #WM_LBUTTONUP     : OnLButtonUp()
   ElseIf *mymsg\message = #WM_MOUSEMOVE     : OnMouseMove()     
   ElseIf *mymsg\message = #WM_PAINT         : OnPaint()   
  EndIf  

 EndIf 
 ProcedureReturn CallNextHookEx_(MsgProcHook,code,wParam,lParam)
EndProcedure
;--------------------------------------------------------------------------------------------------------
ProcedureDLL PGDR_AddToolBar(WHandle,Buttons.b); Initialisierung der Toolbar 
 Protected i,Result 
 ExamineDesktops()
 CatchImage(#Image_0,?TBS)
 CatchImage(#Image_1,?OVL)
 CatchImage(#Image_2,?OVS)
 CatchImage(#Image_3,?OVR)
 CatchImage(#Image_4,?DNL)
 CatchImage(#Image_5,?DNS)
 CatchImage(#Image_6,?DNR)
 TB_Font = LoadFont(0,"Arial",10,#PB_Font_HighQuality)
 WindowHandle = 0
 MessageCode  = 100
 MessageFlag  = 100
 MouseStatus  = 0
 IcoOffset    = 0
 FontColor    = $FFFFFF

 Result = 0
 If WindowHandle = 0 ; Prüft ob Funktion schon aufgerufen wurde
  WindowHandle = WHandle
  ButtonAnzahl = Buttons
  
  If ButtonAnzahl < 0 Or ButtonAnzahl > 99 ; Max Buttonanzahl 100 sonst Fehler
   MessageRequester("ToolbarDLL Fehler", "Ungültige Buttonanzahl !", #MB_OK|#MB_ICONWARNING)
   SendMessage_(WindowHandle,#WM_CLOSE,0,0)
  EndIf 
  Global Dim TButtonArray.TBStruct(ButtonAnzahl)
  
  ; Ein Hook auf Sendmessage und Postmessage 
  WndProcHook = SetWindowsHookEx_(#WH_CALLWNDPROC,@CallWndProc(),0,GetCurrentThreadId_())
  MsgProcHook = SetWindowsHookEx_(#WH_GETMESSAGE,@GetMsgProc(),0,GetCurrentThreadId_())
  
  For i = 0 To ButtonAnzahl-1 ; Button mit Schrift belegen 
    TButtonArray(i)\TButtonText = "Toolbutton"+Str(i+1)
  Next i  
  Result = 1
 Else
  MessageRequester("ToolbarDLL Fehler", "Die Funktion AddToolBar wurde mehrfach aufgerufen !", #MB_OK|#MB_ICONWARNING)
  SendMessage_(WindowHandle,#WM_CLOSE,0,0)
 EndIf
 ProcedureReturn Result
EndProcedure
;--------------------------------------------------------------------------------------------------------
ProcedureDLL PGDR_DisableButton(ButtonNr.b); Button auf Disable setzen 
 Protected Result
 If ButtonNr < 0 Or ButtonNr > ButtonAnzahl
  MessageRequester("ToolbarDLL Fehler", "Ungültige ButtonNr. !", #MB_OK|#MB_ICONWARNING)
  Result = 0
 Else
  TButtonArray(ButtonNr)\TButtonDis = 1
  Result = 1
 EndIf
 ProcedureReturn Result
EndProcedure
;--------------------------------------------------------------------------------------------------------
ProcedureDLL PGDR_EnableButton(ButtonNr.b); Button auf Enable setzen 
 Protected Result
 If ButtonNr < 0 Or ButtonNr > ButtonAnzahl
  MessageRequester("ToolbarDLL Fehler", "Ungültige ButtonNr. !", #MB_OK|#MB_ICONWARNING)
  Result = 0
 Else
  TButtonArray(ButtonNr)\TButtonDis = 0
  Result = 1
 EndIf
 ProcedureReturn Result
EndProcedure
;--------------------------------------------------------------------------------------------------------
ProcedureDLL PGDR_SetMessageOffset(Offset); USER Message Offset 
 Protected Result
 If #WM_USER + Offset <= #WM_USER Or #WM_USER + Offset >= #WM_APP 
  MessageRequester("ToolbarDLL Fehler", "Ungültiger Offsetbereich !", #MB_OK|#MB_ICONWARNING)
  Result = 0
 Else 
  LEGION_Toolbarmessage = #WM_USER + Offset
  Result = 1
 EndIf
 ProcedureReturn Result
EndProcedure
;--------------------------------------------------------------------------------------------------------
ProcedureDLL PGDR_SetTBButton(ButtonNr.b,Text$,IconHandle) 
 Protected Result
 If ButtonNr < 0 Or ButtonNr > ButtonAnzahl
  MessageRequester("ToolbarDLL Fehler", "Ungültige ButtonNr. !", #MB_OK|#MB_ICONWARNING)
  Result = 0
 Else
  TButtonArray(ButtonNr)\TButtonText = Text$
  If IconHandle <> 0 
   TButtonArray(ButtonNr)\TButtonIco = IconHandle
   Result = 1 
  EndIf
 EndIf
 ProcedureReturn Result
EndProcedure
;--------------------------------------------------------------------------------------------------------
ProcedureDLL PGDR_SetColorFilter(ColorFilter) 
 Protected i,Result
 If ColorFilter < $0 Or ColorFilter > $FFFFFF
  MessageRequester("PGDRToolbarDLL Fehler", "Ungültiger Colorwert !", #MB_OK|#MB_ICONWARNING)
  Result = 0 
 Else
  For i = 0 To 9
   AddColorFilter(i,ColorFilter)
  Next i
  Result = 1
 EndIf
 ProcedureReturn Result
EndProcedure
;--------------------------------------------------------------------------------------------------------
ProcedureDLL PGDR_SetFontColor(Color) 
 Protected i,Result
 If Color < $0 Or Color > $FFFFFF
  MessageRequester("PGDRToolbarDLL Fehler", "Ungültiger Colorwert !", #MB_OK|#MB_ICONWARNING)
  Result = 0 
 Else
  FontColor = Color
  Result = 1
 EndIf
 ProcedureReturn Result
EndProcedure
;--------------------------------------------------------------------------------------------------------
ProcedureDLL PGDR_SetBrightness(Brightness.w) 
 Protected i,Result
 If Brightness < -50 Or Brightness > 50
  MessageRequester("PGDRToolbarDLL Fehler", "Ungültiger Brightness-Wert !", #MB_OK|#MB_ICONWARNING)
  Result = 0
 Else 
  For i = 0 To 9
   Brightness(i,Brightness)
  Next i
  Result = 1
 EndIf
 ProcedureReturn Result
EndProcedure
;--------------------------------------------------------------------------------------------------------
ProcedureDLL PGDR_BoostContrast() 
 Protected i
 For i = 0 To 9
  Contrast(i,2)
 Next i
 ProcedureReturn 1
EndProcedure
;--------------------------------------------------------------------------------------------------------
ProcedureDLL PGDR_GreyscaleToolbar() 
 Protected i
 For i = 0 To 9
  Greyscale(i)
 Next i
 ProcedureReturn 1
EndProcedure
;--------------------------------------------------------------------------------------------------------
;--------------------------------------------------------------------------------------------------------
ProcedureDLL DetachProcess(Instance); Freigaben beim Beenden der DLL
  UnhookWindowsHookEx_(WndProcHook)
  UnhookWindowsHookEx_(MsgProcHook) 
  FreeImage(#Image_0)
  FreeImage(#Image_1)
  FreeImage(#Image_2)
  FreeImage(#Image_3)
  FreeImage(#Image_4)
  FreeImage(#Image_5)
  FreeImage(#Image_6) 
EndProcedure 
;--------------------------------------------------------------------------------------------------------
DataSection ; Die Bilder zum Aufbau der Tasten und der Hintergrund
TBS: IncludeBinary "Blaubalkenstretch.bmp"
OVL: IncludeBinary "Tastenteil-links.bmp"
OVS: IncludeBinary "Tastenteil-stretch.bmp"
OVR: IncludeBinary "Tastenteil-rechts.bmp"
DNL: IncludeBinary "Downtaste-links.bmp"
DNS: IncludeBinary "Downtaste-stretch.bmp"
DNR: IncludeBinary "Downtaste-rechts.bmp"
EndDataSection

Re: Multicolor Toolbar Neue PB-Lib oder DLL

Verfasst: 26.08.2010 22:52
von HeX0R
Wunderbar, danke! :allright:

(Gleich mal sichern, bevor du wieder denkst, es braucht keiner :mrgreen: )

[Edit]
Ich würde noch die beiden folgenden Codeköpfe vorschlagen:

Code: Alles auswählen

;/-----------------
;|
;| Img.bpi
;| (c)legion
;|
;| Original Code here:
;| http://www.purebasic.fr/german/viewtopic.php?p=279337#p279337
;|
;/-----------------

Code: Alles auswählen

;/-----------------
;|
;| PGDRToolbar.pb
;| (c)legion
;|
;| Original Code here:
;| http://www.purebasic.fr/german/viewtopic.php?p=279337#p279337
;|
;/-----------------
Nicht, dass der Originalautor irgendwann verschüttet geht ;)

Re: Multicolor Toolbar Neue PB-Lib oder DLL

Verfasst: 27.08.2010 09:51
von legion
Super, wenn es wer brauchen kann! :D

Ein Copyright auf die Img.pbi kann ich nicht beanspruchen,
hab da wo ziemlich viel abgeschrieben was ich mich noch
so erinnern kann. :oops:

lg. legion

Re: Multicolor Toolbar Neue PB-Lib oder DLL

Verfasst: 27.08.2010 10:02
von Kiffi
@legion: Danke für's Veröffentlichen! :allright:

Kannst Du büdde, büdde auch noch die BMPs zum Download anbieten?

Danke im voraus & Grüße ... Kiffi

P.S.:
legion hat geschrieben:[...] hab ich alle PB-Projekte auf Eis gelegt.
Mit welcher Programmiersprache bist Du denn momentan unterwegs?