
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....
Um mal den wortkargen Rings (in etwa) zu zitieren: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.
[...]
Super Spruch!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?
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
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
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
;|
;/-----------------
Mit welcher Programmiersprache bist Du denn momentan unterwegs?legion hat geschrieben:[...] hab ich alle PB-Projekte auf Eis gelegt.