Im Callback wird WM_SETCURSOR verwendet um zu erkennen ob die Maus über ein Gadget ist. Gerade für das ImageGadget ist dies die einfachste Möglichkeit die ich gefunden habe.
ob mit oder ohne XP-Skin sollte egal sein. Die Bilder sollten auf einem Windows-XP System vorhanden sein.
Dies ist ein BeispielCode zum ausprobieren und nicht zum direkten übernehmen in eigenen Code gedacht. Darum auch kein Protected und ähnlichen Krams.
Code: Alles auswählen
;von HJBREMER
;WINDOWS XP - PB 4.1 mit oder ohne eingeschaltetem XP-SKIN !!!
Declare myButton_callback(hWnd, Msg, wParam, lParam)
Declare ButtonImgChange_viaCallback(button)
Enumeration
#image1
#image2
#image3
#butimg1
#butimg2
#butimg3
#butimg4
#butimg5
#butimg6
#button1
#button2
#button3
#button4
#buttxt1
#imgchange_nr
EndEnumeration
UseJPEGImageDecoder()
;#PB_Window_Invisible = nicht sichtbar = schnellerer Bildaufbau
windowstyles = #PB_Window_SystemMenu|1|#PB_Window_Invisible ;die 1 = zentriert
hwnd=OpenWindow(0, 0, 0, 400,400, "",windowstyles)
CreateGadgetList(hwnd)
;Resize muß sein ! siehe Hilfe zu ImageGadget,
br=120
hh=50
sp=10
ze=20
CatchImage(#image1, ?Bild1)
imageid1=ResizeImage(#image1,br,hh)
ImageGadget(#butimg1,sp,ze,br,hh,imageid1)
sp+br
CatchImage(#image2, ?Bild2)
imageid2=ResizeImage(#image2,br,hh)
ImageGadget(#butimg2,sp,ze,br,hh,imageid2)
sp+br
CatchImage(#image3, ?Bild3)
imageid3=ResizeImage(#image3,br,hh)
ImageGadget(#butimg3,sp,ze,br,hh,imageid3)
sp=10
ze+50
br=90
ButtonGadget(#button1,sp,ze,br,hh,"Invert")
sp+br
ButtonGadget(#button2,sp,ze,br,hh,"Rand Invert")
sp+br
ButtonGadget(#button3,sp,ze,br,hh,"Brightness")
sp+br
ButtonGadget(#button4,sp,ze,br,hh,"RedGreenTint")
sp=10
ze+50
br=120
ButtonImageGadget(#butimg4,sp,ze,br,hh,imageid2)
sp+br
ButtonImageGadget(#butimg5,sp,ze,br,hh,imageid3)
sp+br
ButtonImageGadget(#butimg6,sp,ze,br,hh,imageid1)
sp=10
ze+100
br=120
TextGadget(#buttxt1,sp,ze,br,hh,"Press Image")
;#PB_Window_Invisible rückgängig machen, Fenster anzeigen
SetWindowState(0, #PB_Window_Normal)
SetWindowCallback(@myButton_Callback())
caflag=3
heller=10
;----------------------------------------------------------------
Repeat
event=WaitWindowEvent()
If Event = #PB_Event_Gadget Or EventID = #PB_Event_Menu
welcherButton=EventGadget()
Select welcherButton
Case #butimg1:heller+10
Case #butimg2:heller+10
Case #butimg3:heller+10
Case #butimg4:heller-10
Case #butimg5:heller-10
Case #butimg6:heller-10
Case #button1:caflag=1
Case #button2:caflag=2
Case #button3:caflag=3
Case #button4:caflag=4
EndSelect
If heller < -100: heller=-100: EndIf
If heller > 100: heller= 100: EndIf
SetGadgetText(#buttxt1,"Brightness="+Str(heller))
EndIf
Until event = #PB_Event_CloseWindow
End
Procedure myButton_callback(hWnd, Msg, wParam, lParam)
result = #PB_ProcessPureBasicEvents
Static imgflag
Select msg
Case #WM_SETCURSOR
buttonid = wParam
button = GetDlgCtrlID_(buttonid)
Select button
;setzt voraus das Konstanten bei Enumeration hintereinander liegen
;sonst halt einzeln aufführen
Case #butimg1 To #butimg6
;Maus berührt Image
If imgflag <> button
imgflag=button
ButtonImgChange_viaCallback(button)
EndIf
Default
;Maus hat Image verlassen
If imgflag
imgflag=0
ButtonImgChange_viaCallback(0)
EndIf
EndSelect ;von button 2.Abfrage
EndSelect ;von msg
ProcedureReturn result
EndProcedure
Procedure ButtonImgChange_viaCallback(button)
;ButtonPbnummern sollten als Konstanten per Enumeration definiert werden,
;denn mit PB_any werden die Nummern zu groß und demzufolge auch das Feld
Static buttonmax ;größter Wert einer Buttonnummer
Static Dim but(0) ;behält die imageID des Buttons,
Shared caflag ;nur für die Demo
Shared heller ;nur für die Demo
;Feld anpassen
If button > buttonmax
buttonmax=button
ReDim but(button)
EndIf
;letztes Image wiederherstellen
For j=0 To buttonmax
If but(j)
SetGadgetState(j,but(j))
but(j)=0
EndIf
Next
If button=0: ProcedureReturn: EndIf ;Maus hat Image verlassen
;Image merken
imgnr = GetGadgetState(button)
but(button)=imgnr
;neues Image erstellen und anzeigen
If imgnr
hh=GadgetHeight(button)
br=GadgetWidth(button)
imageID = CreateImage(#imgchange_nr,br,hh)
dc = StartDrawing(ImageOutput(#imgchange_nr))
Select caflag
Case 1
;Image invertieren
DrawingMode(#PB_2DDrawing_XOr)
DrawImage(imgnr,0,0)
;macht dasgleiche wie DrawingMode(#PB_2DDrawing_XOr)
;DrawImage(imgnr,0,0)
;BitBlt_(dc,0,0,br,hh,dc,0,0,#DSTINVERT)
Case 2
;oben, unten, links, rechts invertieren
DrawImage(imgnr,0,0)
BitBlt_(dc,0,0, br,5 ,dc,0,0, #DSTINVERT) ;oben
BitBlt_(dc,0,hh-5,br,5 ,dc,0,hh-5,#DSTINVERT) ;unten
BitBlt_(dc,0,5,5,hh-10 ,dc,0,5,#DSTINVERT) ;links
BitBlt_(dc,br-5,5,5,hh-10 ,dc,br-5,5,#DSTINVERT) ;rechts
Case 3,4
;Helligkeit etc verändern
DrawImage(imgnr,0,0)
SetStretchBltMode_(dc,#HALFTONE)
ca.COLORADJUSTMENT
GetColorAdjustment_(dc,ca.COLORADJUSTMENT)
ca\caFlags=#CA_LOG_FILTER ;wird nicht unbedingt gebraucht, ohne andere Werte
If caflag=3
ca\caBrightness=heller ;weitere Möglichkeiten siehe MSDN etc
Else
ca\caRedGreenTint=99
EndIf
SetColorAdjustment_(dc,ca.COLORADJUSTMENT)
StretchBlt_(dc, 0,0,br,hh,dc, 0,0,br,hh, #SRCCOPY)
EndSelect
StopDrawing()
SetGadgetState(button,imageID)
EndIf
EndProcedure
DataSection
Bild1: IncludeBinary "C:\WINDOWS\Web\Wallpaper\Stonehenge.jpg"
Bild2: IncludeBinary "C:\WINDOWS\Web\Wallpaper\Karibiktraum.jpg"
Bild3: IncludeBinary "C:\WINDOWS\Web\Wallpaper\Fischkarawane.jpg"
EndDataSection